你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM3基于正点原子开发板(战舰)的DAC音频输出软硬件配置记录

[复制链接]
STMCU小助手 发布时间:2022-11-18 22:00
硬件部分:
7 t, S" H! r- W6 u, U$ G跳线帽将AIN和DAC连起来即可,如下图所示:
& n4 H  ~0 T. L8 F  b9 ^ 20201124222834361.jpg ! N- l% k; }6 H3 T$ I( ]; B; g

1 N' l4 g2 y; v5 r! H1 Z具体看原理图:+ y7 N/ W' A2 d7 T7 E% |. P* x
下图中,PWM AUDIO就是上图开发板上的AIN引脚。
! f  u& i( H2 T( }: n( F
# S; C9 w( \8 w0 _8 j% p 20201124223248821.jpg ; v5 `/ g4 O5 Y$ Q! e/ D
4 X2 A# t  o9 W2 V' l

/ M; ^! d  R8 d! X% q$ N* U下图中,PWM AUDIO通过TDA1308T芯片对应到PHONE(3.5mm音频输出口)。6 I2 J2 H7 u" S+ v7 l
6 F) w; U. w* _) _% @& Q4 C3 Q. ~8 u
20201124223412652.jpg
6 ]+ @( [1 O* x# k8 F4 s
6 y3 [  ^0 Y! I6 p+ Y其他信息:
; g8 n' P: w; ?9 r+ y& b1 x1)图1 DAC对应STM32芯片的PA4引脚;' i8 N: V8 c6 i; F4 S
2)本次使用TIM3定时器,其他定时器也可用。
) b/ R2 c# F$ w) r3 N/ Y0 Y
8 J0 B7 N- Y7 `软件部分:
) a' A9 E$ G8 H) g, M7 r+ J6 j通过硬件连接方式,不难理解开发思路:$ P+ O+ g. |4 O" I: v
1)DAC输出信号至音频输出端;
( i8 L) H) d; S, M' x; r# |2)利用TIM定时器产生中断给DAC喂数据;
1 C- _& h! w/ g
, `6 R+ X, h. W& o; S; m具体代码如下:8 F* u0 P( r9 K' F
1)dac.h头文件+ j1 ?) n8 q( F5 j8 A% j1 y4 F
2 i9 _1 `  H9 O, s$ z8 |3 ~4 B
  1. /**3 J) K1 Z/ `7 Q2 Y
  2. ********************************  STM32F10x  *********************************
    ; a( r4 U6 a9 }+ v
  3. * @文件名称: dac.h' X$ |2 Z( Y+ V% ~4 f& C. y
  4. * @作者名称: Aaron8 U" G, ?" M* D9 P& W, b' A! s
  5. * @库版本号: V3.5.0
    ! h8 p6 i# ~. I$ Q7 M  C
  6. * @工程版本: V1.0.0& A  ^; o$ A. G0 e( F7 [8 t
  7. * @开发日期: 2020年11月23日# q) ~, Y( P0 x% {2 F9 n0 R
  8. * @摘要简述: dac头文件
    ) ?$ t3 v- A2 K& G1 b
  9. ******************************************************************************/  i2 c8 d8 q* `0 D
  10. /*----------------------------------------------------------------------------- U& Q: \/ x# E/ z3 i) q' U! f
  11. * @更新日志:# Q6 x& [" z& f
  12. * @无4 l0 p  o3 e. E+ D
  13. * ---------------------------------------------------------------------------*/5 t, X  k2 X/ \6 K
  14. #ifndef __DAC_H
    / e& F1 R& \) l5 `% G9 ]
  15. #define __DAC_H         9 c' b  n' }' W# s5 g6 M
  16. /* 包含头文件 -----------------------------------------------------------------*/5 C+ y0 _% J/ ^* h& C( d: F
  17. #include "stm32f10x.h"        
    + B6 A0 z7 R2 j7 d- g$ O% M% C' J# N6 c
  18. /* 函数申明 -------------------------------------------------------------------*/                                                            
    - s- c/ q5 }& B6 c+ T
  19. void Dac1_Init(void);                            // DAC1 初始化
    , ]: V8 N; [+ w0 M! z
  20. void Dac1_Set_Vol(u16 vol);        // 设置DAC1 电压值
    ; [* f  r/ [8 M; w6 x2 q
  21. #endif /* __DAC_H */
    + o* x3 W# ^, Q% t; G* p
  22. /****** Copyright (C)2020 Aaron. All Rights Reserved ****** END OF FILE *******/
复制代码

" g* B5 k6 Z( s: ?( R: @2)dac.c源文件
3 P* k7 O% V' x4 u1 w/ `, ]6 r: U( z& q
  1. /**1 e/ ^; h' [1 G7 W0 e$ u
  2. ********************************  STM32F10x  *********************************( d9 p& c3 I% {6 T8 K2 N; a7 Z1 s* [+ N1 q
  3. * @文件名称: dac.c
    1 ^( E  e: A2 I7 A( W
  4. * @作者名称: Aaron
    0 Y2 t5 h! r$ o- r4 h8 w' {9 i
  5. * @库版本号: V3.5.0/ i. [& B0 B' ~2 k2 E" Q
  6. * @工程版本: V1.0.0
    ) [# ^: L' h. z
  7. * @开发日期: 2020年11月23日
    5 }& O1 ]+ q/ c4 F) }
  8. * @摘要简述: dac源文件
    & l) g0 Q) V' ^* L( x6 T/ |# h
  9. ******************************************************************************/
    3 O. B3 i$ e) G/ X7 J1 b
  10. /*----------------------------------------------------------------------------" Z/ a! q2 W7 t
  11. * @更新日志:
    4 {' n) `: T; j) |" U
  12. * @无" x4 N3 g( m3 N2 Q
  13. * ---------------------------------------------------------------------------*/4 Z: ^- a& Y9 A
  14. /* 包含头文件 -----------------------------------------------------------------*/
    6 _) i+ A. h+ q# T$ T: L1 n! ?$ ~
  15. #include "dac.h") l- h) p8 H$ u% o# H8 K
  16. /************************************************4 I. f  P# W# W4 t' i
  17. 函数名称:void Dac1_Init()
    8 H% m2 ^0 W) y+ z, P
  18. 函数功能:Dac1初始化函数0 _" Z! h8 p! H* _. Q8 a$ a4 a" E
  19. 入口参数:无
    5 K4 O0 P, i5 o2 }8 C4 e  i! v
  20. 返回参数:无: r2 T! Z* Y( K4 O7 B$ H  x7 D
  21. 开发作者:Aaron. m- E( V$ n. N# A* x
  22. *************************************************/, p( Y7 l9 k* N; S- N# Z( p
  23. void Dac1_Init(void)+ _& V# Z" L7 Y! z0 U$ E7 B
  24. {! W/ P2 c7 ]8 {2 v* [1 r
  25.         GPIO_InitTypeDef GPIO_InitStructure;! b6 S' x  q6 j4 k3 s4 _
  26.         DAC_InitTypeDef  DAC_InitType;; [8 {. S1 E9 R5 [' A* E
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );                     // 使能GPIOA通道时钟; b, ?/ Y! r) D5 C5 w! c! P2 Y( P
  28.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );                     // 使能DAC通道时钟+ j8 h) W3 m9 [( {6 w1 T
  29.     // 设置PA4,模拟输入,因为一旦使能DACx通道后,相应的GPIO引脚会自动与DAC模拟输出相连,设置为输入,可避免额外的干扰
    : D; l+ K6 G& v2 s9 k1 K+ f
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                             // 选择引脚4/ N# J  ?/ B; V( v: x7 M8 b
  31.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                                  // 模拟输入
    0 S5 ^. \; C' B4 ~
  32.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    * r& Q4 k5 F8 C. U8 v' ]4 M
  33.          GPIO_Init(GPIOA, &GPIO_InitStructure);
    # N# n; S5 W# U* i8 U9 k
  34.         GPIO_SetBits(GPIOA,GPIO_Pin_4)        ;                                    // 令PA4输出高& q( k) V/ I) c9 d
  35.         DAC_InitType.DAC_Trigger=DAC_Trigger_None;                                 // 不使用触发功能# G8 b; O% v* W/ V! R! L6 t' L
  36.         DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;             // 不使用波形发生
    0 E% h" C  Q/ E9 c, F, D
  37.         DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;   // 屏蔽、幅值设置
    1 H  Y: A. i& ~# y
  38.         DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;                 // DAC1输出缓存关闭 BOFF1=1# T3 l; s& b) v, A2 ^
  39.         DAC_Init(DAC_Channel_1,&DAC_InitType);         + O( X+ }- P2 L9 z: n* v
  40.         DAC_Cmd(DAC_Channel_1, ENABLE);                                      // 使能DAC1转换通道8 }& M) O7 b7 A: W
  41.     DAC_SetChannel1Data(DAC_Align_12b_R, 0);                             // 12位右对齐数据格式设置DAC值
    ' o; e9 s- Z' x9 h( v; L
  42.     }' W  F  P! G3 T: q: W. }. G# L
  43. / H0 G" R0 m( S' C$ t3 W
  44. /************************************************1 N0 C5 l5 h6 A: Y5 T9 S  |
  45. 函数名称:Dac1_Set_Vol(u16 vol)
    ' Z- G5 x% U! Z) c4 R9 E* `' I: q
  46. 函数功能:设置通道1输出电压函数
    2 y1 X7 `! G/ [8 s  D2 i- N  U9 i4 U/ d6 L+ m
  47. 入口参数:u16 vol:输入值范围0~3300,表示0~3.3V4 ~/ t# ^- A* |% r
  48. 返回参数:无! q% j; s. l1 L
  49. 开发作者:Aaron. @6 [5 p$ Q: k6 w
  50. *************************************************/
    ( `6 F" L* K. |& r# r$ x5 ^/ d
  51. void Dac1_Set_Vol(u16 vol)! z; R5 [0 F9 ~3 Y- V* J8 w& T
  52. {
    / L; i( i0 \+ d6 ^% M" K  Z
  53.         float temp=vol;
    + }) q7 N" d. [1 K) I9 u& j
  54.         temp/=1000;                                    // 即temp=temp/1000
    " a" o( G' e" x+ \
  55.         temp=temp*4096/3.3;                            // 因为DAC是12位,所以2^12=4096
    0 S- k$ f0 a  R' V! Z  g
  56.         DAC_SetChannel1Data(DAC_Align_12b_R,temp);     // 12位右对齐数据格式设置DAC值
    9 a) D' k! r  q3 P
  57. }
复制代码
  b; b! W. P2 E6 ^. u; x
3)timer.h头文件
6 H7 ]! V$ K$ n0 u$ ?9 e$ Z0 _  [" s$ I0 z1 g4 R" y: K
  1. /**
    $ B0 R2 r" b/ x
  2. ********************************  STM32F10x  *********************************
    ; I2 t: a0 M$ Z
  3. * @文件名称: timer.h* s( ^" ~9 n. m& D* Y! J0 v7 ^
  4. * @作者名称: Aaron
    ' `* b% H; F6 ?. D- r  Y" c
  5. * @库版本号: V3.5.07 d3 J5 {! L) r) A0 N
  6. * @工程版本: V1.0.0/ ]. f; m, _) a# k/ Q+ O' i. }0 k
  7. * @开发日期: 2020年11月23日
    4 a  S' Z; a7 y1 o# C" F
  8. * @摘要简述: timer源文件
    2 F1 p. x+ ]! _9 D
  9. ******************************************************************************/
    " Y" T0 c: c$ _0 \9 q
  10. /*----------------------------------------------------------------------------+ A9 ~" j) h, Q$ |3 s3 s1 Z% m
  11. * @更新日志:
    3 @2 i( Y& c: l) Y
  12. * @无, ]( e8 M1 a3 I% n, v4 }
  13. * ---------------------------------------------------------------------------*/
    ( {$ Q5 b7 E+ u$ p' z' p
  14. #ifndef __TIMER_H
    / Y1 k" I% `& U! E
  15. #define __TIMER_H
    ; _) H' ~( w5 [% R
  16. /* 包含头文件 -----------------------------------------------------------------*/
    6 m0 ~) j1 l# L
  17. #include "stm32f10x.h"" J' g$ k9 I; C9 M( z
  18. /* 函数申明 -------------------------------------------------------------------*/
    ; n4 N2 l) w' z0 `
  19. void TIMER3_Interrput_Init(u16 arr, u16 psc);    // 定时器3中断初始化函数
    5 k$ j  `& H3 _& o  L5 @& s: {
  20. #endif /* __TIMER_H */
    * P) y# `8 E- J" }, v
  21. /****** Copyright (C)2020 Aaron. All Rights Reserved ****** END OF FILE *******/
复制代码
) X: y6 W# Z- U* h! ^2 l) @/ l
4)timer.c源文件' t9 |5 o, K6 u9 f4 U' X

) R& f" E) i5 r6 \8 @
  1. /**8 x2 N+ e! n% r* g3 ]6 [
  2. ********************************  STM32F10x  ********************************** c# G$ A  D; x( ~0 f6 o
  3. * @文件名称: timer.c  K; I% m8 P! L# L, T
  4. * @作者名称: Aaron5 `6 e8 e* ]$ b/ w
  5. * @库版本号: V3.5.03 W4 k0 J' p% T% J* I
  6. * @工程版本: V1.0.0
    ( v# F" g/ S2 w, u% I* v
  7. * @开发日期: 2020年11月23日
    3 B, x) l& ^, h5 Z
  8. * @摘要简述: timer源文件
    8 s* s( h" {7 L; D1 ^3 D1 z
  9. ******************************************************************************/
    " D9 d( i* D3 T
  10. /*----------------------------------------------------------------------------; Y1 o/ {) n/ r  [
  11. * @更新日志:
    1 J& a+ ^* Q6 X: z, {
  12. * @无& Y8 J, E! D8 k8 E# q
  13. * ---------------------------------------------------------------------------*/
    & X# b4 n' R/ y* h
  14. /* 包含头文件 -----------------------------------------------------------------*/
    2 ], z# p( Y5 Y/ _4 K+ _
  15. #include "timer.h"
    & l7 x% k. h7 T" A: J9 W0 x+ o
  16. /************************************************9 q  [8 b0 L! p- {+ g
  17. 函数名称:TIMER3_Interrput_Init(u16 arr, u16 psc)1 c, s" |' N/ p+ s  W7 R
  18. 函数功能:定时器3 中断初始化函数$ B9 o1 c- x, ?1 \- ?* P" P2 E9 c4 r
  19. 入口参数:u16 arr:自动重装载值, u16 psc:时钟预分频数# z2 w% R% l' y$ f) }1 f& I
  20.          举例:令arr=4999,psc=7199,( m" D( N, P1 @2 S' K' u  Q& s
  21.                                  则计数周期为(7199+1)/72000000=0.00001s,对应频率10KHz;0 w7 m( y, O1 K0 b1 K6 S
  22.                                  计数(4999+1)=5000值,需0.5s
    1 K* R( L' s4 `, C3 d+ S
  23. 返回参数:无6 [6 T- ~( C# Z* F6 k! R
  24. 开发作者:Aaron
    , N6 t8 f& r: P  D8 s2 C
  25. *************************************************/
    6 v' o, H3 h  o" S/ U9 T
  26. void TIMER3_Interrput_Init(u16 arr, u16 psc)0 X9 i: h! u3 X& b/ r% _
  27. {
    ; w; B  w- r! u4 p; H7 w
  28.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct;0 v; r8 Q/ N1 G( w# x" w
  29.   NVIC_InitTypeDef        NVIC_InitTypeDef_TIM3Struct;7 A4 A* M: [3 F1 T5 w0 |
  30.   TIM_DeInit(TIM3);
    4 g1 h3 f# I1 L. U1 E; Y
  31.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                 // 使能TIM3时钟
    0 v: o7 T5 m" e5 c2 k
  32.   // 定时器7 参数初始化配置
    4 a  z, k9 U  }/ r
  33.   TIM_TimeBaseInitTypeStruct.TIM_Period=arr;
    3 Z# E; e6 V2 t3 u, B
  34.   TIM_TimeBaseInitTypeStruct.TIM_Prescaler=psc;8 S+ u: |+ z/ K. k2 G& U$ e
  35.   TIM_TimeBaseInitTypeStruct.TIM_CounterMode=TIM_CounterMode_Down;    // 向上计数模式
    0 [4 _/ U8 y9 k  m+ J  M
  36.   TIM_TimeBaseInitTypeStruct.TIM_ClockDivision=TIM_CKD_DIV1;
    % Q  Q5 [" m2 w; I
  37.   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitTypeStruct);* c# Z/ U: q+ D# T  N* m8 }
  38.   TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                            // 使能定时器3更新中断( a% B* q4 N' G6 O
  39.   // 定时器3 中断优先级配置
    ! B3 O& {, T  w. X# T! a/ [+ r/ t
  40.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannel=TIM3_IRQn;
    1 V9 }0 s4 w$ B$ z* G2 `
  41.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannelCmd=ENABLE;0 _# Z$ B" ?- e+ I
  42.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannelPreemptionPriority=1;
    ; K! W! P: H* n  h! S0 B
  43.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannelSubPriority=3;4 B& P/ [- ?) T8 I$ y2 A# C1 \$ [
  44.   NVIC_Init(&NVIC_InitTypeDef_TIM3Struct);3 \  O) f5 h$ M/ R6 G$ Z5 d+ }
  45.   // 使能定时器39 C; z* ^& y1 a* V8 R. t7 V
  46.   TIM_Cmd(TIM3,ENABLE);
    6 ]. u0 I6 O( z  i$ U
  47. }
    5 y& {9 |4 \# B8 f( O
  48. /************************************************5 V( p1 ~0 O9 _( f  A) f
  49. 函数名称:TIM3_IRQHandler(): a. p$ z' D( @( x
  50. 函数功能:定时器3 中断服务函数8 {) @7 N" t* [, R) v
  51. 入口参数:无
    0 u( |0 m2 |' Q8 E. `* V' R% G
  52. 返回参数:无$ l! [1 K% m( j2 M& e# J) {. l8 B/ `
  53. 开发作者:Aaron
    # {3 y4 A7 B; }- `
  54. *************************************************/1 @: _2 x- l0 R, P6 b8 q# Y2 d+ D
  55. extern u16 Data;
    % Q: R# P, g$ C$ T7 `
  56. void TIM3_IRQHandler(void)/ q' a; u( L, o! X! k
  57. {   " ^% v1 c, I/ g( j5 J5 G5 {
  58.         // 获取定时器3 状态, m: {( e* m( @: l& C3 u4 r- D
  59.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)  // 判断定时器3 状态是否为更新中断
    " g7 D+ @; n3 X* f
  60.         {
    ! C0 {  n2 r2 V* a; ?3 ?! N7 t
  61.                 GetData();
    ( h. W4 @, x9 m
  62.                 Dac1_Set_Vol(Data);
    1 f. ^$ @% K8 r' ^
  63.                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  // 清除更新中断标识) k  {& [, Y* }. q
  64.         }
    $ W; Y- \8 R* ~5 r
  65. }
复制代码

! P' P3 R% g4 i1 l5)main.c主函数
: n' i" E9 z% l* j* S* E: N: O3 {7 w  y; [3 m4 i
  1. /**/ K8 w# Q: J/ ?
  2. ********************************  STM32F10x  *********************************
    # f$ V0 u. y) {  ]% M& b% }
  3. * @文件名称: main.c. N8 I5 n( Q7 D; z
  4. * @作者名称: Aaron- I0 o8 Y7 P( N9 F' B
  5. * @库版本号: V3.5.0
    / }) g3 Q1 F* q& Z' _. m$ m
  6. * @工程版本: V1.0.0
    + l. p) n7 _% d$ s
  7. * @开发日期: 2020年11月23日
    7 s) E# o) U8 Y8 S
  8. * @摘要简述: 主函数6 L1 j  U  M; w' T$ U* l7 Z! V
  9. ******************************************************************************/9 K* J5 F+ m% P5 s8 A% _- p& y8 B
  10. /*----------------------------------------------------------------------------
    2 A7 p! [$ `+ F2 X: I6 t6 k4 m
  11. * @更新日志:5 T- b* }$ m3 D/ H
  12. * @无2 v* `) k8 g) d8 w# `
  13. * ---------------------------------------------------------------------------*/
    2 }+ Z' a: L6 U6 R. ~
  14. /* 包含头文件 -----------------------------------------------------------------*/1 f8 M7 J6 P3 @" j- i
  15. #include "led.h"
    8 _/ ~( x+ G$ |$ _4 u
  16. #include "dac.h"
      X" R- M2 V/ [* c. j0 I
  17. #include "timer.h"
    ) j" R; C2 u' E6 e; N+ w
  18. #include "delay.h"3 z: v9 s# R8 f
  19. int main(void)
    $ p4 J. ~5 \; Q* g) Q" W# j
  20. {        
    - g1 C# Z: A' \& t/ `1 v# k2 [
  21.     LED_Init();                                      // LED端口初始化//0 R* p6 p6 r& Y) V' e. J- [7 N
  22.         LED0=1;$ g1 k/ T* @" N* j
  23.         delay_init();                              // 延时函数初始化// & D3 y  u; X3 Z2 u/ o( F
  24.     TIMER3_Interrput_Init(3599, 1);        + n3 H' N/ E; |+ U
  25.         Dac1_Init();                                      // DAC初始化//
    $ [1 |4 w% @  a6 A! T2 Q4 q% T' }
  26.         while(1)
    ; K  P' f" j( M4 @
  27.         {- l, r: ^6 n2 [4 H: ^9 l: O1 M$ c9 Y, N
  28.          delay_ms(200);
    4 ?; r* b  B' J  h, v/ T0 m
  29.          LED0=!LED0;
    5 D8 F* W/ }3 a1 d6 T; U: Z
  30.         }: @/ M- J! A, K
  31. }
    * e+ r2 g! G( w2 c7 r2 P: F& ^7 `3 q
复制代码

" m) p) Q* T/ O备注:getdata相关代码主要用来计算要喂给dac的值,我建了一个3000个数值的正弦波信号来调试程序,后期更具需要改声音数据吧。. y8 _/ }4 k; f' v  f+ b

, h- M, ?* V: |7 V5 l9 N实验结果:
1 X2 S% J) S$ z" z8 h* X, x7 z+ \将耳机插在Phone口上(即3.5mm音频接口),耳机左声道可听到所设的声音。
" W2 w; W4 G8 k! G5 g" S- G+ q; h! ^+ \; {
20201124230416324.jpg # D; G# `( v; U# a

" Y2 v/ {/ b' }8 w9 o% _————————————————
/ B: ^! C4 h0 r2 _, [版权声明:天亮继续睡1 i% a$ M/ V, r

1 {! h$ s6 r* c4 H: l* ], E0 ^" t5 Y( Y  b
赞 收藏 评论0 发布时间:2022-11-18 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版