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

笔记---基于HAL库的M0在应用升级IAP

[复制链接]
power568 发布时间:2019-4-17 09:44
本帖最后由 power568 于 2019-4-19 06:41 编辑
1 O7 m7 C, r) Z( c! A
1 b0 F" f. @, \# C2 C/ z, I  e       虽然之前看过STM32的在应用升级IAP,但是一直没有亲自实验过,最近心血来潮准备体验一下。具体的实现原理这里就不再描述,网上的资料很多。因为M0的APP实现方式不同于M0+、M3、M4等内核的实现方式,所以在这里做个笔记。
: d) u; q1 e' g, {: f+ \" `! K
0 \4 X0 G: m) h- R+ U2 ~       实验平台:
& _7 h$ `+ m5 ]# p) m; n       硬件: STM32F072 Nucleo开发板
& L1 ^( o, e0 I7 y! ^% }       软件: HAL库0 @+ w9 h; }" x
       工具: IAR0 Z. B4 K5 H# E  e' [8 j
       参考: STSW-STM32116————官方提供的F0例程(AN4065)3 Q6 A: {; F% M7 d# X4 s
& g1 o" l/ J4 V
4 o( Z4 K$ U8 z  H
一、IAP工程功能0 n9 ]+ G4 ~) O. Y4 {$ b1 \, g
       上电后执行IAP,在跳转到APP之前,使用PC6控制LED翻转5次,再检测APP跳转条件,满足后跳转到APP。! k1 o3 w  f5 K$ a/ v( a
       使用CubeMx生成工程之后。增加FLASH_If_Init函数,以初始化Flash,具体代码如下:# F" Y2 r6 G4 c

) {7 A2 |: M  @! E. ?3 q
  1. void FLASH_If_Init(void), Q& M! j. p5 C% f
  2. { 0 z, P: a) M% M" F. K
  3.   /* Unlock the Program memory */8 F# g( d- q: H  m2 l  v
  4.   HAL_FLASH_Unlock();/ C0 k0 K. W) _$ N# }" U

  5. + o# v# x9 W  R" W- f" u" z2 t
  6.   /* Clear all FLASH flags */  
    " T! m( @8 K) i$ {9 A5 L
  7.   __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR );5 H  {* Z% t& U% B+ Q' D
  8. }
复制代码
      具体main函数如下:: f* c4 q7 f$ O
  1. int main(void)
    7 N8 a: O- h, F
  2. {
      r6 J; Y0 S3 @" a. D3 A
  3.   uint8_t  num = 0;. z" ~  ?% U# r! S. M) U
  4.   uint32_t tmp=0;5 q1 a* Q) [+ t; ~8 B6 P1 x
  5.   
    ; P. l+ ^1 @4 q5 l- R1 {3 k! y$ ^
  6.   FLASH_If_Init();
    " c4 W' U5 }5 u; m& V& P0 H
  7.   HAL_Init();
    7 B9 c9 ~5 q. U% n& s
  8. 3 i! p% g% f- {7 ~" u3 A9 ~
  9.   SystemClock_Config();
    0 j8 f- o% @6 P! I0 b. E7 F9 H" s
  10.   MX_GPIO_Init();
    / j, j1 u: ?( N8 w
  11.   , p) W: ~* X2 m
  12.   for ( num=0; num<5; num ++)# f) H1 b6 c" _6 ]
  13.   {
    $ }' i% Y$ U4 v1 Z7 n; O
  14.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);; L! V/ c+ C1 p& b2 |& q
  15.     ; V: M' |) `4 X4 L2 c$ {
  16.     for (tmp=0; tmp<300000; tmp ++);2 r$ l& `1 I! m, u) A
  17.     6 P" x  F% L4 X, K0 t8 j! w
  18.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
      P% u) ]( l3 B: |
  19.     + t; P# s, b/ o8 i" b: U( w8 u9 a
  20.     for (tmp=0; tmp<300000; tmp ++);+ C- J, |! U) G; O7 @5 f" x4 f% `
  21.   }
    + J" J6 O! [! F% r  n: X" U
  22.   8 x7 L6 F% o  t$ g9 }, i/ t7 R
  23.          //// 判断APP的地址处是否已经下载了APP程序
    ' i" `4 t) `! c
  24.   if ( ((*(__IO uint32_t *)APP_ADDR)&0x2FFE0000)==0x20000000 )& P2 X/ t  v2 z2 P) z% H
  25.   {, F9 X2 n- e- [
  26.     JumpAddr = *(__IO uint32_t *)(APP_ADDR + 4); //// 设置APP复位中断入口地址
    3 V( u9 T4 N$ T9 D4 K  R( L
  27.     JumpApp = (pFunction)JumpAddr;
    ) h, `: N' A; @2 t% l2 z3 O
  28.     __set_MSP(*(__IO uint32_t *)APP_ADDR); //// 设置APP栈顶地址! \# j6 h( S% f
  29.     JumpApp(); //// 跳转到APP
    # a% K' X/ Q4 B5 s, s5 o  P! @) q
  30.   }
    9 b( E5 O# Q+ y0 {& @
  31.   
    & g6 w3 a  e: C/ {  Q
  32.   while (1);
    ( M, Y: `  \8 @1 }( V$ S) \
  33. }
复制代码
二、APP工程功能9 V* n9 Z" z) D; p2 c
       由于在网上看见之前有在验证APP时,有各种现象——外部中断、串口中断和定时器中断等不响应,所以设计的工具比较多一下,看看具体有没有问题。8 I3 c) u' |6 r* n( E2 r8 ?
       功能1、外部中断——PA0上升沿触发外部中断,在中断内翻转PC9;, K- m3 V/ R2 e) k" J# Y$ h
       功能2、TIM3定时中断——在中断内翻转PC7;
% a$ G6 ?1 H. r  i       功能3、串口1空闲中断——接收到的数据正确后,翻转PC8;$ ~# g0 Y) z/ g4 D4 g3 W
       功能4、主函数循环执行以下功能——开启串口DMA接收数据、串口发送数据、PC6状态翻转、延时。' h5 j; P% H) Z6 k# `# @
       PC6~PC9输出控制LED灯。; @2 Q# V; E& [! h) J8 w" V: _7 D
( R" x7 ~. }3 E! `: Q0 A* _; n

; ?0 Z/ Y( O  _! i: r3 |+ b4 z$ J       F0属于M0内核,不同于M0+、M3和M4等内核,没有专门的中断向量控制寄存器,中断向量的设置只能采用拷贝到SRAM方式。具体实现方式——定义一个位于SRAM首地址全局数组变量,将M0的所有中断入口地址拷贝到该变量内,再将SRAM的地址映射到地址0x00000000,发生中断后,MCU自动从地址0x00000000对应的偏移处寻找中断入口,如下:
( G! ]+ B1 Z6 p/ z( p0 H
  1. ///// 定义全局数组以存储中断向量表,M0共48个3 [: h8 ]5 x3 X/ z
  2. #if (defined (__CC_ARM) ) //// for keil MDK compiler5 d( k* V7 T6 {: p; v4 m
  3. __IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));" Q5 o0 f8 f9 @9 a5 V: }
  4. #elif (defined (__ICCARM__) ) //// for IAR compiler0 V: `0 O' ]: h, b. B4 b* s9 ~
  5. #pragma location=0x20000000( l1 @" K" N  b
  6. __no_init __IO uint32_t VectorTable[48];
    5 Z4 ?) L% Y4 Z- b7 Z+ J4 C6 F& Q
  7. #elif (defined ( __GNUC__) ) //// for GNU compiler
    4 ^; l' p3 N$ [6 n% `! }
  8. __IO uint32_t VectorTable[48] attribute__((section(".RAMVectorTable")));1 s' ?) H( z4 r: Z
  9. #elif (defined ( __TASKING__) ) //// for TASKING compiler. N2 r$ o+ ^0 y- i* R' c6 L# N
  10. __IO uint32_t VectorTable[48] at(0x20000000);# g: P* ]8 C' o2 \
  11. #endif$ |3 C  L% J! S; M( M: @
  12. + z) v) O1 j3 {; e+ l
  13. //// interrupt vector remapping
    % J5 e5 G5 S; Z7 o
  14. void AppVectorTblRemap(void). ?5 m& g- y+ m9 o
  15. {3 o) ~; D3 i( c7 v1 [% @& t% K: N
  16.   uint8_t     tmp;. T2 X4 D" q" n' H, p9 ?
  17.   uint32_t    tmpCfgr=0;# s" J: z: H5 B! J) b8 S/ V" j
  18.   
    , B* q0 D8 R6 s1 W9 h6 j* a
  19.         //// copy interrupt vector
    . M9 p, e/ K2 b8 z2 c+ L
  20.   for (tmp=0; 48>tmp; tmp++)# w( b; ~" o) X- S7 }
  21.   {; E# b' W, }( ]  R, `
  22.                 //// because size of interrupt vector's address is 4, so tmp+=4(be equal to
    % F0 Z: ]1 o0 Q6 f7 e+ y
  23.                 //// tmp<<=2);
    & g; ~4 l4 |' q# Q- N' _( Y
  24.     VectorTable[tmp] = *( __IO uint32_t *)(APP_FLASH_ADDR + (tmp<<2));
    % Y' j7 \$ ?, ^- P
  25.   }
    5 l% I& E# L9 }5 ^. J
  26.   9 y3 G& U6 F1 V5 Y
  27.   __HAL_RCC_SYSCFG_CLK_ENABLE();: N# [) a0 D& F' [/ I8 g
  28.   tmpCfgr = SYSCFG->CFGR1;
    0 r1 Y# p4 i" L& u
  29.   tmpCfgr &= (uint32_t)(~SYSCFG_CFGR1_MEM_MODE_Msk);+ y8 d% u, w! }8 f7 q
  30.   tmpCfgr |= (uint32_t)0x03; //// embedded SRAM mapped at 0x0000 0000
    . G, I" }# b, C- ]& Y' X
  31.   SYSCFG->CFGR1 = tmpCfgr;( y% k1 |0 j" u- A8 N
  32. }
复制代码
      其余代码实现如下:; u7 f) k  a8 B8 E' G! n5 m
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)0 s3 @0 M$ ~. @! s, z' X
  2. {
    ) g6 b+ ^6 L; T1 N
  3.   if (TIM3==htim->Instance)
    . A+ b0 K' K! {( p0 m: c9 v
  4.   {
    7 t1 T! T  D8 V. Q, S: V3 c
  5.     TimerBitSta ^= 1;
    1 [0 l2 D* x! X( s5 }+ {% V/ x* I
  6.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, (GPIO_PinState)TimerBitSta);; V/ P  Z6 l/ }6 Y
  7.   }
    ' ]9 y! `( x1 x  X- T
  8. }6 o6 r/ k8 D) X- [
  9. . G4 o9 {  [& n, A
  10. void Exit0IrqCb(void)* E7 u# r. b6 T6 m! Z9 m
  11. {
    " O) B0 C6 ^6 R+ B( N
  12.   if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0))% j& t$ Z8 k3 k, X6 X" e. `
  13.   {
    * x7 ]0 w7 r  W9 ]+ n
  14.     ExitBitSta ^= 1;) v+ `3 E$ D/ n7 {3 O
  15.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, (GPIO_PinState)ExitBitSta);
    + n3 r  x; O+ D9 n+ c
  16.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);) Z4 [$ p& {/ o5 o: e" X
  17.   }
    # G; V9 {, d9 C, v
  18. }
    0 C) F3 K* [, C- j
  19.   Y! U6 ?% K1 r) S1 T
  20. void Usart1IrqCb(void)& Q# C# @4 ?; ]' K5 x
  21. {. t! I& L" Y4 V- H5 j& B
  22.   if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)); q0 ?% v( q  n3 a/ e; s" T  u
  23.   {" G% V( P5 B) k# Y1 D) u2 _, \4 l
  24.     USART1->ISR;8 q0 c' |$ w6 [' R: i8 \# K1 U
  25.     USART1->RDR;
    6 u) H" [  H* T) j
  26.       # t) ^  Z2 Y; B6 o, [/ f4 G
  27.     if ( (1==TestUartRcvBuf[0]) && (5==TestUartRcvBuf[4]) )4 p- }; N$ k( T% j3 v3 z" k
  28.     {4 o1 M+ C' ^, U# \* `2 E6 G; K6 e. [
  29.       UsartBitSta ^= 1;5 \3 f$ X: T, @% F. B
  30.       HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, (GPIO_PinState)UsartBitSta);
    $ G& F  X8 A" Z# n( w% |  ^  [
  31.       TestUartRcvBuf[0] = 0;
    * y4 V$ k+ O8 i# u
  32.       TestUartRcvBuf[4] = 0;3 B$ P2 M# o9 @" u( T' s
  33.     }
      C$ ~2 O' R6 j/ R. h/ {
  34.    
    3 N' d* v/ u4 y" _/ f: i& R
  35.   }
    " g- v' i  z; g0 O' L! t" i" n
  36.   HAL_UART_AbortReceive_IT(&huart1);
    3 \. C) h, K$ e% u( m
  37.   HAL_UART_DMAStop(&huart1);
    ' ~. s6 q) ]! ^3 M0 v( p5 A3 d) w
  38.   __HAL_UART_CLEAR_IT(&huart1, UART_FLAG_IDLE);2 Z3 Q  \, j6 ~3 [
  39. }
复制代码
      中断服务程序:
3 S: `! b( Q: ^7 G: \( E
  1. void EXTI0_1_IRQHandler(void)
    / J2 P8 W: W5 v) ~; D0 p/ R
  2. {
    3 e7 D) d; s0 \5 t* i# X
  3.   # ^2 ~4 _) G5 C/ Y1 W7 O8 @
  4.   Exit0IrqCb();) E& i' K$ A: a
  5. }
    % t0 A- [0 [! X0 [0 W6 P
  6. " D7 t1 b4 A! Z* H* b2 O3 w
  7. # l) P) |3 i% p8 S4 E4 }* J

  8. 4 b- _; P/ X6 f- T/ F& {
  9. /**
    5 r# ]. s# v- W  ?9 U' Z$ ]" f( y
  10.   * @brief This function handles TIM3 global interrupt.
      v# v. v, L$ s. U1 P
  11.   */& p9 a+ W0 C2 n  [
  12. void TIM3_IRQHandler(void)
    $ ^' O2 ~2 F& V9 I& X+ O' L5 S
  13. {
    # b; c  i" ^6 e3 M: r7 Z6 i/ S$ `
  14.   /* USER CODE BEGIN TIM3_IRQn 0 */
    . }' T0 ^' ^9 `3 H3 W6 j

  15. 4 ?! ?; `1 d/ B% x
  16.   /* USER CODE END TIM3_IRQn 0 */- p, ]# @# d# s  G5 L
  17.   HAL_TIM_IRQHandler(&htim3);
    0 C9 N: b! e# e5 G  a; v  i
  18.   /* USER CODE BEGIN TIM3_IRQn 1 */
    + q9 T% T) ]2 P: Q* F
  19. ( _8 p- T! S: G) [7 U# i
  20.   /* USER CODE END TIM3_IRQn 1 */
    . W% F. ?  u  H1 X
  21. }% ~. p2 l$ M- \: H5 O9 p
  22. ! c" o! E, z, o" f% r" A( R0 |9 Y

  23.   }" H3 e3 ~" `; {' U( f! j
  24. void USART1_IRQHandler(void): p0 E8 }0 }9 W" P
  25. {
    . W. H7 a4 J1 f- I
  26.   /* USER CODE BEGIN USART1_IRQn 0 */
      D! t* O5 x3 e) {+ a2 M" I
  27.   Usart1IrqCb();
    ; W* `8 p) u; q6 x
  28.   /* USER CODE END USART1_IRQn 0 */) B( H# u6 T. Y$ o3 g; {
  29.   HAL_UART_IRQHandler(&huart1);
    - c2 ^) g! c% n/ h2 E& r+ N9 C
  30.   /* USER CODE BEGIN USART1_IRQn 1 */
    2 T5 |% S9 m4 ]+ l& v1 v* p4 l7 |

  31. 8 P% q9 `1 ?, Q/ b6 i% m( i$ e$ d
  32.   /* USER CODE END USART1_IRQn 1 */
    + K7 W/ O. t9 @2 {( P& N9 h
  33. }
复制代码
      主程序:! X7 M$ q$ \7 d, C
  1. int main(void)
    9 H7 \( H- s6 ?  a" u+ f0 [
  2. {7 C( t% o1 o7 d; V
  3.   /* USER CODE BEGIN 1 */0 Q) u/ ?/ @8 y* [* U1 L- D
  4.   uint32_t tmp;
    / ]* O8 ^- w7 P' R9 J
  5.   0 L( R9 x2 i$ O6 T3 c0 b* R7 e
  6.   AppVectorTblRemap();
    9 B9 v/ V% c' Y/ r* B# b$ j
  7.   /* USER CODE END 1 */( L3 ]6 o/ U# t6 O  |
  8. - m+ j5 q. g( u; z
  9.   /* MCU Configuration--------------------------------------------------------*// q3 ^$ T" `! t" p

  10. % V! |- `) |+ z  N& |
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 O1 c; j; M2 c! q& a/ I# l
  12.   HAL_Init();( l  M0 d+ j5 l* ]
  13. + i7 J! Q. G% B% m
  14.   /* USER CODE BEGIN Init */: k! V: }) L4 r1 Y5 g8 b
  15. / y& _8 M6 v) S/ Z$ U+ ?6 t  a" R
  16.   /* USER CODE END Init */' N/ F! f1 E' c" ]% G
  17. # M) `6 \$ ?1 n& a# _6 d% G% O
  18.   /* Configure the system clock *// N$ x7 B6 G2 ~8 j5 q
  19.   SystemClock_Config();# i, I4 @) o# f" U; Y  }
  20. 2 S, W4 E. T" V
  21.   /* USER CODE BEGIN SysInit */
    5 \9 Q6 X7 n. [

  22. - s) ~" H. n4 Y6 r+ _- S$ ^9 O) [
  23.   /* USER CODE END SysInit */9 D" i) v# q" }  a1 a/ X2 w* Q9 D0 ]; m7 U
  24. 6 i- S8 V8 j. |; y
  25.   /* Initialize all configured peripherals */
    . D8 b6 X4 Z8 u9 y) P, ?+ o) A
  26.   MX_GPIO_Init();# V! M3 G& }' H7 P- K
  27.   MX_DMA_Init();
    5 V6 X4 Y9 N/ }9 D
  28.   MX_USART1_UART_Init();
    6 K  Y7 S! W$ x8 V! w  o
  29.   MX_TIM3_Init();
    . e4 _9 T/ a3 I. C
  30.   HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);  B+ y, N) x  C, s* N
  31.   + E1 v- Y; o( @) U3 ]/ v
  32.   /* USER CODE BEGIN 2 */5 F: b/ d% s3 u/ r
  33.   HAL_TIM_Base_Start_IT(&htim3);$ K6 D/ {& z$ I, O* C6 u
  34.   __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);/ Z1 M/ r9 @& ], F/ R  @! U( ~
  35.   __set_PRIMASK(0); //// close interrupt in IAP, so open
    & C0 y2 B7 A( I
  36.   
    $ H- X5 P2 b( w
  37.   /* USER CODE END 2 */
    . H0 ^4 @8 i4 L8 m: j( p( \

  38. 5 @* f7 j3 g+ U, ~3 ?, D  g9 ~# @0 n
  39.   /* Infinite loop */
    * G8 ^/ m3 a; G* f. ~# o
  40.   /* USER CODE BEGIN WHILE */
    ) C% b6 l7 k/ P) ]
  41.   while (1)  Z( |' U  T. w" ^
  42.   {
    9 X& j9 X( Y: R8 \* P& M
  43.     HAL_UART_Receive_DMA(&huart1, TestUartRcvBuf ,UART_BUF_LEN);
    8 a, _+ n' w5 u' i
  44.     HAL_UART_Transmit(&huart1, TestUartSndBuf ,UART_BUF_LEN, UART_BUF_LEN);
    + D, r/ v# {" e, F
  45.     0 g" s3 d+ A- |
  46. ////          HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
    2 Z0 t; e9 N( `4 R' H
  47. ////    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
    3 l+ S1 p. Q6 U2 k' {7 N4 H" \0 c5 _
  48.    
    4 Y/ M+ z5 B3 _4 ?
  49. ////    for (tmp=0; tmp<600000; tmp ++);
    . n& Z8 Q2 B4 ^6 \4 {
  50.    
    & W- \4 V! n6 c3 P
  51.    
    4 I' t* N9 [- n0 P( U0 m
  52.     WhileBitSta ^= 1;8 d. n- D7 a2 J9 t
  53.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, (GPIO_PinState)WhileBitSta);# b) a' q. O, E/ a/ f# t# a& h
  54.     for (tmp=0; tmp<600000; tmp ++);
    , Q5 Y- j  ?0 M9 }. m* I8 G- t
  55.    
    . a0 j0 V. ~6 x" A" p2 w8 J8 D
  56.     /* USER CODE END WHILE */
    * n( ~9 o! V: P& b0 U/ J

  57. 6 O% N$ \, o$ t' {- k
  58.     /* USER CODE BEGIN 3 */
    ( {! l( I0 a$ A& D0 l
  59.   }& E1 y( H, o' a; o9 j: d
  60.   /* USER CODE END 3 */
    3 r/ v5 B* G3 E, P3 F% q; K2 v
  61. }
复制代码

+ X: X" ~! R3 k* T. J9 r- R' r9 \, k8 E. i
       两个工程编译通过后,使用仿真器将执行文件烧录到MCU,程序运行正常。TIM3定时中断你控制的灯一直亮,但是亮度没有其余的灯亮,因为占空比不是100%;测试串口时,使用镊子或者金属片将串口连个引脚短接起来后,在串口中断内控制翻转控制的LED均正常没有出现网上说的中断不响应等问题。9 \& W/ r: _1 A0 L' `1 F9 n
       整个工程代码见附件。
7 i+ A- i/ H) G7 N! D  b# B
0 ?, k8 q7 E, ]) r$ H' G( R6 ]/ M       F072TestIap.rar (487.8 KB, 下载次数: 156)

MB1076.pdf

下载

878.24 KB, 下载次数: 27

F072 Nucleo开发板原理图

赞 收藏 8 评论9 发布时间:2019-4-17 09:44

举报

9个回答
STMWoodData 回答时间:2019-4-17 10:07:59
提示: 作者被禁止或删除 内容自动屏蔽
STMCU-管管 回答时间:2019-4-17 10:16:45
感谢分享~
毫无性格特点的果冻 回答时间:2019-9-19 10:54:11
谢谢楼主分享!
generalcircuits 回答时间:2019-9-19 17:04:10

- a$ `4 T0 Y% s" t$ h6 \$ n谢谢楼主分享!
wdliming-222461 回答时间:2019-11-5 10:29:29
谢谢分享~~
jeffhe1 回答时间:2019-11-5 13:23:48
學習了
wdliming-222461 回答时间:2020-8-10 22:06:50
谢谢分享
zhangjun1105 回答时间:2020-9-3 11:22:10
感谢分享
zhangjun1105 回答时间:2020-9-3 11:22:38
不错,很好的帖子

所属标签

相似技术帖

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