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

基于STM32的ADC片内信号经验分享

[复制链接]
攻城狮Melo 发布时间:2024-1-18 19:00
微信图片_20240118190031.png

# B, ]8 {8 k6 N  ]1 {% ]
  u( o5 |8 v' k8 s+ f
) `9 f; l8 t$ z3 m. T% d$ g
很多STM32芯片里往往内置了专用的ADC通道,比方用来测量Vrefint,VBAT的分压或温度传感器的输出电压信号。不同系列所内置的模拟信号通道可能有差异。这里以STM32G4系列为例,它内置了对应于Vrefint,VBAT的三分之一分压和温度传感器的输出电压的专用模拟通道。
* p3 A' ~& P# U& o) J& S. n* a6 j( @( ~2 c1 K: `& B: o7 a6 P
微信图片_20240118190028.png
  F! @9 W0 @0 ]: T

+ T* x, q6 ?4 X
微信图片_20240118185948.png
0 G9 ?# Y' {6 C; W/ }$ ?) q! M
/ s- U; w! \; i& s" x" u5 j+ Y) }( b+ S
下面的示例就是针对上述3个通道进行ADC,并测量相关电压和片内温度,最终得到3个结果,分别是VRefint电压,VBAT的电压,片内温度。
" x: g) M: V% l% w
+ q/ x! |& D0 d  S
微信图片_20240118190017.png

3 Y$ I8 V8 h; G4 `- M$ c
' X* W/ n2 f$ M6 E; C" _
实现过程是这样的,大体分四步:【有点点麻雀虽小五脏俱全的味道图片】- E  F/ M8 f8 l9 N2 Y) D
/ s# _# N3 D8 k; f4 |
1、TIMER1 更新事件触发ADC的转换;8 c5 v* i& k/ R: ~
/ D* b1 ]5 F  r( Q
2、CPU基于EOC中断获取ADC结果;4 I  O0 e' e0 I3 G, K9 B
0 |2 w; G: _4 h: y
3、对ADC结果进行换算,得到电压值和温度值存放在特定内存位置;6 }0 p# Y/ Q6 o5 ]+ s. t$ p
( P$ C9 n1 G1 l4 [( B
4、基于DMA传输通过UART将最终结果在串口终端显示;
: U2 X1 p- D: Z- e% b! x3 z0 c( a
+ `7 D8 S# j% j, X: Y) y; x其中,TIMER1的CH1输出PWM波形,其更新事件做ADC的转换启动信号。每次的TIMER更新事件触发ADC,3个通道扫描方式转换。这里的UART使用片内LPUART,使用它主要是考虑它跟板载虚拟串口直接相连,没有其它特别用意。
3 I# [  U# e7 q8 @; p3 T7 B+ h* R' t2 }4 l6 U
微信图片_20240118190012.png
3 }3 K  ^8 q. B1 m! C& w
0 \% F1 u$ o4 c* p. p; |
我使用STM32G474Nucleo板来进行下面实验。其中VDD=3.3v,VBAT与VDD相连。另外,ADC模块的参考电压也是3.3v.
% T2 H: m* G: H) N; d) p. \
# T7 W% e4 n1 |8 R* c使用CubeMx图形化工具进行配置,先看TIMER配置:
3 l/ Z& t8 h& v- \; ]
# a: Y9 o2 x. b) F0 ]* ^
微信图片_20240118190009.png
, d8 ~9 C5 O, B# b( k! g
% l2 w: J0 [! d- D6 L9 V* F6 ?2 ^
再看看ADC的基本配置:/ N1 s8 ?1 t5 R" Y) p+ [1 B) r2 C+ f

5 o$ ?+ ]. j4 t$ Z; c
微信图片_20240118190005.png
. V; w$ {2 o* R4 O! J

3 a6 o( G. h. I2 W! \LPUART的基本配置:
% O6 k, f2 n1 I; ^9 A3 `1 [$ m6 G0 }+ u+ D+ A8 r
微信图片_20240118190002.png

! N$ P, h9 J/ D1 ^/ Y
, i+ s; `4 D" e( \9 s  H5 b8 g4 o因为要使用ADC中断和UART的DMA传输,记得做ADC的中断响应使能配置和LPUART的DMA配置,这里只使用UART的TX DMA功能。
% G$ _4 E7 f" r" _! w: @; ?
6 ^: G1 l! b5 R# l1 [
微信图片_20240118185959.png

# J2 |! J1 i2 W. l0 g5 v% @

7 Q1 I6 p9 o( H- i7 ?* F! @使用CubeMx主要配置主要是上面这些。+ g; E7 u, \  a: C8 f
5 |- g: H" A& u0 L
在组织用户代码前,先简单介绍下片内温度传感器的内容。该温度传感器针对不同温度有不同电压输出,其输出电压跟温度呈线性关系。ST公司针对片内温度传感器在两个特定温度【30℃和110℃或30℃和130℃】、基于特定参考电压【3v或3.3v,不同系列以数据手册为准】生成了1组校准值并存放于片内特定FLASH位置。
& q% u: x8 L* m# L4 G
. d$ C: f! S) y1 a8 r+ G! HSTM32G4系列的校准值是在参考电压为3v,30℃和110℃条件下的两个值,在数据手册里还给出了校准值的片内存放地址。
. K8 s! O9 [& ?2 s5 H. @
+ a! G, |9 y. X, k1 K
微信图片_20240118185956.png

1 G6 e( s- j% `1 Y4 ~

. {! X, [* ^# U* I  f/ o, `) Y针对这个温度传感器的使用,ST公司在参考手册里还给出了计算公式。其实,有无这个公式无所谓,我们不难自行推理出来。【TS_DATA代表某时刻测得的传感器输出电压对应的转换值,TS_CAL1/TS_CAL2分别表示在30℃和110℃条件下基于传感器输出电压的转换值。】
0 O  |3 ]' G4 L+ u% l( N0 Q
4 C, ~# M# O- e3 u
微信图片_20240118185953.png
8 S( H& k; E+ M1 W

  ^- @1 }; a/ \8 W另外,前面提过,ST公司在手册里给出了温度传感器的两个温度下的校准值,但要注意生成校准值的ADC模块所用参考电压跟我们实际应用时AD模块所用的参考基准电压可能不一致。如果不一致,就必须将ADC值换算成同一基准参考电压条件下的数据。目前在ST手册里也特别强调这点了。我把上面一副图再贴一遍于此【见黄色语句提醒】。
" m+ ^) x/ w$ o
& h* c$ l1 I5 L0 V! `
  \* h' K, S- D$ ]0 x& h

  C( `! q5 b6 m7 ]; T& N/ d: v5 w关于这点,我们也不难理解。同一待测信号、同一ADC模块在不同基准参考电压下转换值往往是不一样的。见下面示意图加以理解。, e/ s7 P- ]* d. I. h
. y3 y8 W; Y1 `1 e) e
微信图片_20240118185944.png
- q0 G7 R3 z0 m; J# M# }; q
) `! T0 A# k, b% X% D8 i
完成各项配置后,创建软件工程。添加必需的用户代码:4 {2 G9 x8 R  I$ l9 Z

- [& ]5 ?6 I0 Q! y$ b
  1. #define TX_Timeout (9999)
    6 ~5 f9 P% v. J' x

  2. 4 u2 V6 t3 f: V% U
  3. #define TS_CAL1_ADDR  (0x1FFF75A8)  //用于计算温度传感器数据
    ! W3 t, e! R' Q' e
  4. #define TS_CAL2_ADDR  (0x1FFF75CA) //用于计算温度传感器数据
    7 q( I8 K& E* w8 E$ Z4 I; J( x
  5. 4 I( ?/ r8 `$ w6 Q
  6. #define size1 (40)) Q1 A+ d1 g- f' o) e3 N
  7. 7 F2 J  r; Z/ l+ t$ p  v
  8. char WDVol[size1],BatVol[size1],InVol[size1];
    , J$ h; b6 p" W3 B% e  g

  9. & Z+ p0 Q- n9 {
  10. uint16_t ts_c30,ts_c110;  _8 A& B; n/ s2 Y5 S

  11. ; S& P9 X& ~  r( x: Q
  12. uint16_t ADCResult[3],convCNT;
    7 x, _7 t& H9 f2 g6 _" w+ s+ R

  13. . |* U( H' B$ Q1 S8 c9 ^
  14. volatile  uint32_t Completed,EndofCon_Flag;
    1 U# x( ^/ s+ B5 x( I1 Q- {
  15. / ~9 \9 c- i! N# D- J  G
  16. float    VBATVolt;//存放BBAT电压最终结果
    ) N1 A2 z, S5 ?" Y$ H
  17. float    VRefint;  //存放Vrefint电压最终结果
    . V. _* B& ^4 t  A8 d
  18. float    Temperature;//存放片内温度℃最终结果/ t5 K- p4 D! Z: z

  19. 1 {: k1 C  f& w7 M( M: c/ q1 G
  20. int main(void)2 \- n% A2 m/ S
  21. {; C) t. Y9 H, r$ P& M* b
  22. /* USER CODE BEGIN 1 */4 Y% y/ o. T+ F$ P" O5 o6 e

  23. 7 D, X- g- ^0 S9 K
  24. /* USER CODE END 1 */: y: r) K# L% [# R) C# D

  25. 4 ~) p9 P/ B6 D" p9 @7 ^
  26. /* MCU Configuration--------------------------------------------------------*/
    - S" ]5 l. {) U0 t" W# ?
  27. 6 Y% C' L, i! |0 ^6 a, y
  28. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    8 P$ J0 D7 }1 \+ @% I3 L
  29.   HAL_Init();8 _2 M5 q8 f. f( I+ ^

  30. ; r3 _7 r# h( e! F+ T( M
  31. /* USER CODE BEGIN Init */
      Z3 k2 L4 E1 t3 ]* V- S
  32. : y3 y$ [) G' e" ?) i( P
  33. /* USER CODE END Init */% S  g1 d; [, B* r5 o+ b0 S- ?

  34. : U+ H8 H+ X( K* q0 |/ i7 S
  35. /* Configure the system clock */
    $ X& H+ L3 [( X
  36.   SystemClock_Config();( K" }+ U6 e  ?( \

  37. " B6 Q3 j" d4 U8 J' Q
  38. /* USER CODE BEGIN SysInit */9 }' Q* s0 z- a7 c1 e

  39. " M, `9 R) \) q. w( u7 I
  40. /* USER CODE END SysInit */
    . P" \7 o+ a5 [: y, _
  41. ' c' P: R2 o$ f& U9 K$ ^! j- U8 x
  42. /* Initialize all configured peripherals */
    2 L: E2 a. B% ^: {: m
  43.   MX_GPIO_Init();
    ) X: k# J0 r4 B) i9 C! _) `
  44.   MX_DMA_Init();
    8 a9 \8 w  a6 U- `7 D5 g/ f9 p
  45.   MX_ADC1_Init();
    ; H, ?- T3 D+ a& L( p$ L2 E
  46.   MX_LPUART1_UART_Init();
    3 M% ~3 M. N3 K$ L# E
  47.   MX_TIM1_Init();0 J1 G5 P- M+ S
  48. /* USER CODE BEGIN 2 */5 f+ e* |2 w- Z) U; |
  49. + A9 i" P- S5 x5 i, L
  50.    ts_c30 = *(uint16_t *)(TS_CAL1_ADDR); //读取30℃时的ADC校准值& O( ~% u! p& X" g' k; W

  51. 5 ^* ^1 F5 t" P
  52.    ts_c110 =  *(uint16_t *)(TS_CAL2_ADDR);//读取110℃时的ADC校准值
      V7 H/ I6 P8 A4 b1 O9 o
  53. : V6 u( O7 y' Z
  54.   HAL_ADCEx_Calibration_Start(&hadc1 , ADC_SINGLE_ENDED);//ADC校准+ K  P+ l+ N6 M& \" }$ {* O6 I. V7 [

  55. " M0 O7 U/ t. d* Z
  56.   HAL_ADC_Start_IT(&hadc1);//启动ADC并开启转换中断0 M& x6 ~' i7 y" p. n# z0 _

  57. 7 I) c* [: ~" Z& A" r  k
  58.   HAL_TIM_PWM_Start(&htim1,  TIM_CHANNEL_1);
    7 s( {$ t. ^3 H; i; u
  59. 8 [( r5 h: e5 Y( x2 x, R
  60. 5 _% j# w& H5 i: u! ]4 o
  61. /* USER CODE END 2 */$ o+ h/ Y$ v# E" L* v

  62. ) c7 u. ~5 T. G" m6 b' V
  63. /* Infinite loop */
    1 A3 J( Q* V7 h3 p* ^/ J3 q7 n# l
  64. /* USER CODE BEGIN WHILE */
    8 |9 ~! d5 ^5 K+ F- t$ i
  65. while (1)
    % R/ k) C% J, l+ [, C" H& d
  66.   {4 }: C9 `3 Q7 a- _. R6 {+ t
  67. /* USER CODE END WHILE */
    ! E( ?; o) }0 d$ t* v6 J; Z

  68. $ v/ l, ?8 H* A; Q1 ]4 {
  69. /* USER CODE BEGIN 3 */1 i6 T/ k# F; Z; o! m$ e+ G

  70. 8 y! W& `" _9 q: l
  71. if (EndofCon_Flag!=0)
    1 E  n2 J  u: H- u2 ~+ o, d  e
  72.   {
    6 C6 d6 n1 S! [
  73.     VBATVolt=(ADCResult[0]/4095.)* 3.3 * 3.;  
    - ^# |+ s2 u5 U6 |! Z& a  S+ C- E3 h

  74. % k# ]8 S- p( x0 _6 \
  75.     VRefint=(ADCResult[1]/4095.) * 3.3;  % A0 U- x! j8 T# H; `' q2 K
  76. . x7 w+ m4 @/ v+ `, X2 Q
  77.     Temperature = 30.+ (88.*(ADCResult[2]-((ts_c30/1.1))))/(ts_c110 - ts_c30);4 b! m1 P- ^& D! h2 U5 v$ r2 \& s

  78. % p' Z  u% J$ t: f3 d1 E
  79.       EndofCon_Flag=0;" u( o* a* W, i3 b, {" B

  80. ! j! z4 [# S  _8 B
  81. //HAL_UART_Transmit(&hlpuart1, (uint8_t *)WDVol ,sizeof(WDVol), TX_Timeout);6 a+ ?1 o/ d7 j+ r  {
  82. 3 N+ O1 u1 I5 `2 Q) u: S
  83.       HAL_GPIO_WritePin( GPIOC,GPIO_PIN_3,GPIO_PIN_RESET);  //for auxiliary test
    9 @. N5 R8 z4 a

  84. / n8 ?; O5 G* a) X; A
  85.       HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)WDVol ,sizeof(WDVol));
    % Y  U! e8 H4 w
  86. 3 Z) s- I8 E0 k# s: O: v/ \2 |
  87. while(Completed==0){}
    # Q7 o& t0 s+ f0 V3 [
  88.       Completed =0;
    ' |0 c- V% H' b: E2 `% G' f

  89. - x: E# q# b0 U% S( n3 V

  90. 3 i2 c  |( \: J2 S1 F
  91. //HAL_UART_Transmit(&hlpuart1, (uint8_t *)InVol ,sizeof(InVol), TX_Timeout);
      R; a1 |% E' i( K9 k9 A$ z
  92.       HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)InVol ,sizeof(InVol));
    - F/ C/ [+ N; g# H8 u# d& g8 y
  93.   v# P# Y- ?# U: v
  94. while(Completed==0)  {}
    - T8 @) Z; H6 D$ ?4 [
  95.       Completed =0;
    & a8 _1 u4 s  X* w

  96. : J, j! ]: d4 J

  97. & I/ P7 _2 G* ~. X
  98. //HAL_UART_Transmit(&hlpuart1, (uint8_t *)BatVol ,sizeof(BatVol), TX_Timeout);
      g7 L1 d. ]4 K# }! a# g
  99.       HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)BatVol ,sizeof(BatVol));
    : ~2 {' Y2 k' r1 {( j/ q2 P

  100. 2 `9 }5 @8 V" x* z
  101. while(Completed==0){}
    & p' p" H4 C' F. X( Y& E$ {+ @
  102.       Completed =0;8 z# @" `) l  W

  103. 2 _% D: ^6 q5 Z- g. e" F* e8 ]
  104.       HAL_GPIO_WritePin( GPIOC,GPIO_PIN_3,GPIO_PIN_SET);  //for auxiliary test
    / ?/ n2 e7 G! S& A6 ]

  105. ! s: v. w& R7 G
  106.    }   
    , P  S2 m+ e" g

  107. ) x) n. Y7 m2 s3 t" {; E. J
  108.   }
    / _2 i! z3 v: j0 y8 j; b
  109. /* USER CODE END 3 */, Q* M  e- I5 E7 t( ~( n9 P
  110. }' L: X& q( F; b& N5 M8 `
  111. 8 S0 z3 \# j/ G7 x% {$ ^/ Y
  112. //ADC EOC 中断回调处理函数& }$ h& y# O. q2 b8 C4 |3 W5 g
  113. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)8 _- ^5 \" b  K1 ?. |! N6 O5 \; r- W+ ~
  114. {1 u/ L9 u9 |/ C( v* v
  115. 5 h0 J7 P& W$ V0 C
  116.   ADCResult[convCNT]=HAL_ADC_GetValue(&hadc1); //获取转换结果并存入数组' I% E, E& y/ V
  117. 3 R5 `  m$ x+ P# Y7 w, y
  118.   convCNT++;
    * N9 [. c" T1 Y: H2 D! ?2 G  w

  119. ) t7 f' w( v4 G# b/ i6 g
  120. if(convCNT==3)  # g  [) W" n. Y5 S  ]
  121. 4 j& l) N. \, r- C0 I- n6 t2 z
  122. {8 I$ \% S4 W/ j$ E* B
  123.     convCNT=0;: O+ n' ~# R! G4 w; n

  124. 3 F( L1 v  @1 D  G; {# q* v
  125.     EndofCon_Flag=0xff;* x* F! w0 o) f
  126. & Z1 O# m& }, a9 s
  127. sprintf(WDVol,"Internal PN Temperature: %5.3f  \r\n",Temperature);  ; F  r' I# w) n+ V

  128. 2 S* A- Z! g$ o& _
  129. sprintf(InVol,"Internal Reference Volt: %5.3f  \r\n",VRefint);  ( A5 b( l% V. p) T
  130. 6 }' ~. |+ ~" @2 K7 }
  131. sprintf(BatVol,"Current Battery Volt:   %5.3f  \r\n\r\n",VBATVolt);
    ' U$ I, ~- U, W; k, o8 h

  132. , Q! K/ i3 ~, n8 T( L9 A
  133. }
    / h1 [: I- f5 }/ ?% P: W; w; n

  134. ' `" h$ F& ?; A6 y( H: }9 [
  135. }
    ( k3 ?  d+ f& L' X; r

  136. ( U1 b- u  ~' \; F( v
  137. //UART DMA 传输完成中断回调函数3 ~; E& K' [( ?4 M

  138. ! h( a: {; W$ C4 a: n
  139. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
    * U/ `5 t7 E7 k$ I
  140. {
    - V# N0 }5 v7 A0 X' J

  141. 4 p& @2 N$ q2 p
  142.   Completed=0xff;
    + I/ u2 P; y; l
  143. }
复制代码

: s; g$ h6 ?' S/ {0 a: h( L: C基于上面的配置和测试代码,我们就可以看到最终的结果了。定时器周期性地触发ADC,每得到3个ADC结果就进行数据处理,然后通过UART以DMA方式传输到串口终端。注意VBat电压是测量结果再乘以3得到的。! Z2 B+ _& v( j! S
6 |1 J+ n& L/ E, d
微信图片_20240118185941.png
1 w1 G  A) F) d7 N& N& k

9 G6 q& r* U( B$ o9 n/ z3 _+ I
微信图片_20240118185938.png

, D  n! \2 h7 A- O$ S( r3 N2 l4 x* M9 x/ J+ E
针对上面的应用演示,最后给几点相关应用提醒:9 T3 P& u5 V- k

+ F2 a) ~) T1 {& V, e) z4 |5 s$ s- ]8 a1、针对温度传感器做测量时,校准时使用的参考电压与实际应用不一致时要做换算,换算成相同参考电压的数据后再做计算。这点前面也提过了。
  m6 M9 }! A* v# R5 K3 r, w/ d9 {9 K
2、使用TIMER的TRGO触发ADC,如果选择类似比较事件、更新事件来触发ADC时,此时ADC对触发极性的选择是无效的,或者说ADC的转换仅依赖于触发事件时间点。如果是选择TIMER的Ocref信号作为触发源,此时ADC的硬件触发的极性选择是有效的,可以是上沿或下沿触发,甚至是双沿触发。这时就得根据需要选择合适的触发沿。【可以进一步阅读本公众号文章《STM32定时器触发ADC的时序话题》】
) A2 d+ v. G. n: K) t( Q1 T7 n5 D4 j8 {$ E+ e# y- ~
3、这里使用UART的DMA传输依次显示三个结果于串口终端,三个启动UART DMA传输的函数须保留适当时间间隔,即等上次传输完成后再启动下一次传输,因为这里每次传输使用的是同一DMA通道。否则没法全部正常输出。比如若把上面3次UART DMA传输的代码改成下面这样子:. a" f2 h6 N0 b- z5 X  K
4 F  }3 {& q- [! X$ G, H* ^; g
  1. HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)WDVol ,sizeof(WDVol));( g3 Z" v8 {' H2 I) Y

  2. - i- n5 l( M3 J+ `+ [- ~- w$ U
  3. HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)InVol ,sizeof(InVol));
    , A; v5 j5 c) \9 Q8 ^
  4. : [" c  k9 F, o0 a; y  s# ?
  5.   HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)BatVol ,sizeof(BatVol))
复制代码

6 U; c2 y# [* U8 q0 x( i/ ~这时输出结果会变成下面的情形,总是只能看到一个结果的输出,即第一次启动的DMA传输结果。
; j9 ?- K5 R7 o
' G: b2 N' ~# N! ?3 ^" v

7 S1 K/ {7 x0 z) Q
% J# i0 M$ |/ t# V0 `% {# _! f如果想省事点,直接在相邻2次DMA传输间加上合适延时也行。我这里根据DMA传输完成事件来决定执行下一次发送。在DMA传输完成中断里设置Completed变量为非0值表示当前一轮DMA传输完成。; x; o% v) T$ o* l

& D; L! j  U# M/ X: g5 Z4、对于那些在中断和主程序里都会被访问的变量,记得将它们冠以volatile。1 R5 C' e6 ]) a, k/ m# R* |3 ~

$ ^+ n* D9 ~; Y" P% V- Z" e0 J6 V下图的三路波形是我调试时辅助使用的。2 |' x- |5 L+ |/ |
7 f! d; _( V5 ^" S0 I
第一路表示计数器的计数变化,显然是单向向上计数模式。
4 n2 N- T  {; i" F: S) v4 G6 O$ U- |
第二路是TIMER1通道1的PWM输出波形。' E, u. z: V3 a& e9 B

$ I1 Y3 ~+ O0 J6 A, F第三路是我每次基于DMA实现UART发送时拉高拉低的波形。平常管脚电平为高,在实现DMA传输过程中拉低。
2 C- I3 Y* B7 C/ u( p# i' s  ~9 w: ~5 ]: h
微信图片_20240118185918.png
% Z2 ~9 X1 u+ W9 t, ~

& |$ h) L7 j  \2 W4 k, t8 N
如有侵权请联系删除- f7 A1 m! ?( m0 W5 R4 {2 B
转载自: 茶话MCU
" U1 @/ g  k) P' v1 {" P: ^
" T7 _4 o, y/ K/ ]  `

  h" P- }& W) T

7 l7 \* b2 t9 t) F, a
微信图片_20240118185921.png
赞 收藏 评论0 发布时间:2024-1-18 19:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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