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

获取STM32代码运行时间的技巧

[复制链接]
STMCU-管管 发布时间:2021-6-22 10:02
前言6 A* ^4 E% q- i( p5 A+ S. \" J2 g+ h
: `" r8 A( W. q. K& T
1 |4 Z9 `0 u, U$ L
测试代码的运行时间的两种方法:1 q  B) ^6 v) l, t' G' u/ Y, K
5 ~$ _6 k8 T0 O0 R  X

: [3 Y/ G) V3 I% L1、使用单片机内部定时器,在待测程序段的开始启动定时器,在待测程序段的结尾关闭定时器。为了测量的准确性,要进行多次测量,并进行平均取值。1 B: @2 E. V% g2 C

: u# P0 ^  S% L$ `7 w% O' k0 B
' Y5 c5 y- L2 o6 M6 ~
2、简便。0 c2 m; g' {' F; n

1 X3 x: V% O) r# n; p) D1 @1 r

7 S" |% X" F9 Y1 d5 q借助示波器方法的实例
5 e  o6 p( h) `3 {    Delay_us函数使用STM32系统滴答定时器实现:/ X& T2 O1 s' y8 B
  1. #include "systick.h"5 z" C/ L" c( b  y" \# i& N! g/ w- b

  2. ) Q0 q  O0 d. ?. x9 q  `% U
  3. /* SystemFrequency / 1000    1ms中断一次
    ' W. K( F. e" Q3 n4 z9 R
  4. * SystemFrequency / 100000     10us中断一次
    4 r, X. I  M9 w% ~* j
  5. * SystemFrequency / 1000000 1us中断一次
    $ Y0 _( e, \" ~/ \) |9 W
  6. */
    : B/ T- ~9 N% l/ K/ C

  7. 8 f( V. ?3 v# q
  8. #define SYSTICKPERIOD                    0.000001
    4 P/ Y3 B  j" P4 X( {0 S. g
  9. #define SYSTICKFREQUENCY            (1/SYSTICKPERIOD)
    7 a4 z9 D. a/ j9 M4 C% o
  10. 4 @6 _! n. c( `' z0 `+ Z8 [3 _
  11. /**$ v, V+ P  A5 U% W4 Q8 u4 g  z2 C
  12.   * @brief  读取SysTick的状态位COUNTFLAG
    / g5 D6 F3 H# N/ l4 ~
  13.   * @param  无
    3 v- \. {# H  w9 f: i
  14.   * @retval The new state of USART_FLAG (SET or RESET).
    , d8 c- g  i2 x5 C
  15.   *// ^  q- g1 o) P8 G" G) ?+ z7 F$ z1 k7 o" o
  16. static FlagStatus SysTick_GetFlagStatus(void) 3 r( b. M9 V5 h0 Y
  17. {
    3 T( _; j: Z7 d  `& q9 o# @
  18.     if(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk) 3 a' g6 W" B2 ]
  19.     {
    5 ?/ z& ]1 w7 r/ [& H; A% I
  20.         return SET;3 a- c8 O- X0 m
  21.     }
    . ~* m- R( ^4 d1 J$ {# {
  22.     else
      b( A. c8 f2 l- T0 Z
  23.     {1 l  M# S; C% m, T( ]1 X
  24.         return RESET;
    # f7 f# w" w- I* L% B) q& v
  25.     }
    2 u/ i5 o) V3 Q4 K
  26. }  l% D* c) o+ K, v% G7 x) C, a4 j9 g

  27. 2 |; V6 |4 c' P: {
  28. /**
    9 M  {, \5 Z1 @5 E) f4 D4 ]
  29.   * @brief  配置系统滴答定时器 SysTick
    ' G" R4 o6 T1 t9 ^% p. J
  30.   * @param  无. \* P# h% w1 P- E  L
  31.   * @retval 1 = failed, 0 = successful) X( S/ p2 q/ q
  32.   */1 L; L9 Y; O" [6 k
  33. uint32_t SysTick_Init(void)
    # z+ f( s% M+ O& d
  34. {( Z: R2 A3 }8 R) C. G0 a) u( Y
  35.        /* 设置定时周期为1us  *// J* m3 M2 E  ~, p
  36.     if (SysTick_Config(SystemCoreClock / SYSTICKFREQUENCY)) " @; z7 f9 b/ a, S+ l
  37.     {
    & u# E8 @7 Y! R# x% e
  38.         /* Capture error */ ' b  P4 r$ b- b, j; r7 X2 ?1 b
  39.         return (1);
    ! c' c  j5 d* t1 r* B/ m0 D9 s
  40.     }% y( j+ Z" A+ U) y( j3 x

  41. 8 A' i7 ~7 G# O
  42.     /* 关闭滴答定时器且禁止中断  */% l$ t. r) M. q/ [
  43.     SysTick->CTRL &= ~ (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);                                                  9 f% O5 X4 b9 X0 Y/ s
  44.     return (0);) `' O9 }) h  n5 p9 \
  45. }7 V0 l4 ~1 @( |+ D4 d* U. C/ T; s

  46. 5 e' w0 {5 U. }+ j6 v7 R
  47. /**
    6 R/ O$ V9 T% }# \
  48.   * @brief   us延时程序,10us为一个单位
      _+ k5 |, }4 [2 m: j: C6 b
  49.   * @param  6 b0 ~0 {3 @( g0 u3 b9 \5 d' \
  50.   *        @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us! l, t; g5 l: G  `7 C8 H* A) U
  51.   * @retval  无/ B# W" Q8 f% ~% H5 z) g  {
  52.   */
    " i8 w1 d" l; |( l, H  i
  53. void Delay_us(__IO uint32_t nTime)
    * E& X& J7 R# N% T
  54. {     
      J: h1 ~* k. a% j5 L
  55.     /* 清零计数器并使能滴答定时器 */  
    ! ]9 f1 d- v$ d. D
  56.     SysTick->VAL   = 0;  
    6 C4 a7 M9 h7 T4 u
  57.     SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;     
    ) I' j2 u+ Y- L8 ^$ h& b

  58. # Z! I" |4 |) L5 q% S) t/ Y
  59.     for( ; nTime > 0 ; nTime--)# y0 j) A9 f: d
  60.     {
    $ I$ N. T& }% q- Q; \
  61.      /* 等待一个延时单位的结束 */
    5 S' [4 s0 a7 C5 J9 K$ _& G
  62.      while(SysTick_GetFlagStatus() != SET);
    7 u* i. ~$ h- g  r( d' B3 J
  63.     }# L: ^- ^& F, R% _2 [

  64. ( I! A7 F3 _+ ^, I% k
  65.     /* 关闭滴答定时器 */, e( T% G8 `/ k$ N# a
  66.     SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;/ q. M! [* R1 a
  67. }
复制代码
检验Delay_us执行时间中用到的GPIO(gpio.h、gpio.c)的配置:; o  p; j, `2 J. v/ l
  1. #ifndef __GPIO_H
    6 G+ M( _% l! e6 m# \& N$ A  d
  2. #define    __GPIO_H3 p) U7 Q! X9 u

  3. 2 ?" R' L/ V( R5 E) C+ m! G9 u# i
  4. #include "stm32f10x.h"
    7 |) g3 R4 p, w) b) C
  5. ( D" J  G% P1 s4 O! Y. F
  6. #define     LOW          0
    ! r! E' C2 i9 f8 N# f
  7. #define     HIGH         1
    3 Z9 u2 g( x* g0 X! s$ Y, T8 |
  8. " d# }( b2 J; y3 T6 b7 G/ F  n
  9. /* 带参宏,可以像内联函数一样使用 */
    - e5 X3 F3 m& o1 V! L2 _
  10. #define TX(a)                if (a)    \% h* M/ f% l  E9 _+ \0 m/ N+ J
  11.                                             GPIO_SetBits(GPIOB,GPIO_Pin_0);\, J1 ?! N/ J! j, X% n4 h
  12.                                         else        \
    * i3 f( i) X' H) c* m" n
  13.                                             GPIO_ResetBits(GPIOB,GPIO_Pin_0)
    : x7 l$ O1 b8 R$ ~1 v- h
  14. void GPIO_Config(void);3 y$ q! q$ h) R

  15. / Q4 T  |- P" H9 Q
  16. #endif
    % R$ y! `" ~, T  I' n, C9 ^9 r

  17. 5 A7 `+ g: s7 E: c4 E- I3 T6 K
  18. #include "gpio.h"   " x* u+ f  w/ Y' I" \
  19. 1 J% A) g. }/ d6 w4 z, a8 Y1 ?
  20. /**
    3 P% e  U6 n3 y. k0 s2 ~5 @
  21.   * @brief  初始化GPIO
    + X; p, s+ l) ?1 W3 [
  22.   * @param  无' M! i# ?- e' k) K6 W
  23.   * @retval 无% F: l% s. p+ A# c* _) W# d3 y
  24.   */
    # {9 t+ A$ E% {5 O9 P0 [# ^( g
  25. void GPIO_Config(void); V- ]  F, x# O5 a, y4 O( W
  26. {        , R/ z# S. t+ F! b$ E- X5 L+ x7 r
  27.         /*定义一个GPIO_InitTypeDef类型的结构体*/
    9 A. g7 B2 U. e" e1 x9 J3 z  L
  28.         GPIO_InitTypeDef GPIO_InitStructure;) k% m) L1 s) J

  29. : D8 N; p9 ]0 v/ e! X5 ^
  30.         /*开启LED的外设时钟*/
    ( M5 b% |! B+ h  Z. w% u
  31.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); ! B) M9 v# |5 O5 \% E
  32.                                                            3 g4 q$ O6 {) H6 A
  33.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    3 w/ O1 c2 f. M
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     * S2 c" Q$ v" s0 F0 V2 h# F+ O2 A4 R
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 8 g. M. o& Q+ e8 D- E* }6 O( C4 T
  36.         GPIO_Init(GPIOB, &GPIO_InitStructure);   
    - O2 ]2 H) ?/ v3 h; l2 G4 {
  37. }
复制代码
  在main函数中检验Delay_us的执行时间:
' M. d$ i6 \; L! C
# f1 W! b+ y3 k

  1. & H, a4 R8 @: H1 K  ?$ [3 U
  2. #include "systick.h"
    - [+ I( W# G3 E3 d9 _7 ?& d* x
  3. #include "gpio.h"
    1 O" g$ g" n0 \) l6 L0 B

  4. " g6 y. c% Q) l" b; i$ O: l/ G
  5. /**4 q) n: u3 g; z; `5 O4 W
  6.   * @brief  主函数
      m3 {+ v  U% q5 F; p& |0 i' H
  7.   * @param  无  3 H/ D( s6 U: }& {* E4 y
  8.   * @retval 无
    $ k+ f3 e+ w5 y
  9.   */
    ' E5 d- }5 [/ ?# p+ h
  10. int main(void)/ T5 C9 g+ \7 {' f5 q
  11. {   
    & d/ A* g+ u3 q7 E7 u* u3 g+ }. h+ b
  12.     GPIO_Config();
    ; L/ {& a; x/ Q2 _+ z5 @
  13. $ S$ E' c) q" T  E7 J$ O* ]1 N
  14.     /* 配置SysTick定时周期为1us */
    & s$ Z) J+ ^. t* j3 ]# h" K, Q
  15.     SysTick_Init();
    9 r. v- s! `2 N" Y8 g% Y

  16. ! @7 T; a2 _" D! h* i  k
  17.     for(;;)% Z1 g8 y+ w9 Z" M7 S6 G8 \
  18.     {
    8 y3 _3 {$ y, g' P7 _
  19.         TX(HIGH); 4 J  m7 }9 ]6 d6 ?' R% ^. k  |
  20.         Delay_us(1);. K! Y& ~" S: e; `$ A' @' \# e
  21.         TX(LOW);# B/ `" q0 u' P* Q; n8 p$ [4 l
  22.         Delay_us(100);/ e+ C' U8 _( {5 S$ t6 V4 Y: E
  23.     }     8 z$ U3 F: ^, A' S6 p
  24. }
复制代码
示波器的观察结果:
$ s) q" f$ \* W$ O 11.png $ F- Q) @; o4 X. `
可见Delay_us(100),执行了大概102us,而Delay_us(1)执行了2.2us。
# |+ C$ M9 b% y5 B, g5 Z  S- F6 u* A5 z2 S8 ?. ]- W+ W! A! E  J
更改一下main函数的延时参数:
& P* C5 _) H: ?. ^7 G+ O
  1. - f2 S6 S8 f9 M
  2. int main(void)
    $ M4 Y0 H$ v+ \
  3. {    1 d- |* Z& ~; Y/ k+ X$ d
  4.     /* LED 端口初始化 */
    7 q2 r) `( v" |9 T4 `, \; ]
  5.     GPIO_Config();
    $ ?& w4 z/ p/ [4 |

  6. 4 Q1 ^. b1 B) w: ?
  7.     /* 配置SysTick定时周期为1us */' n9 C5 r3 n' h% y+ _1 f) ^
  8.     SysTick_Init();- @# D3 p! z. A4 a' x

  9. 6 q! h# M9 A7 o( F$ P: }8 z
  10.     for(;;)0 v5 A% L! F0 m2 j+ I
  11.     {
    ' d9 T$ W- N( h! [
  12.         TX(HIGH); . N+ w0 \5 W7 {2 `: E
  13.         Delay_us(10);, h; U1 u* A3 _& E
  14.         TX(LOW);
    ! P  {8 \2 p( H4 ?$ w7 K
  15.         Delay_us(100);
    ( K2 a1 C; n; U- j! o4 S
  16.     }     
    ( m0 X5 h( Z/ ?4 w5 e9 c6 O
  17. }
复制代码
示波器的观察结果:6 |4 x% n3 I# }8 O0 J) \

12.png


3 b, l& h$ @( @/ ~8 o  q% a( h- G4 [' P$ e
    可见Delay_us(100),执行了大概101us,而Delay_us(10)执行了11.4us。
* X1 e: i* r; y7 R* O: y% J9 t+ @5 P/ t# M3 u- G( S) U
    结论:此延时函数基本上还是可靠的。
! H8 e8 A- Z% Q( `* Z& w: S" r) S4 Y4 b
使用定时器方法的实例
  l0 X+ ^/ i7 f0 m- `& k& f0 w4 f5 c7 Y$ w' e, w/ }
    Delay_us函数使用STM32定时器2实现:8 o. T; l5 u' @( t4 Q, ~

5 q- F+ D" S. S% _, @% n* A
  1. #include "timer.h"
    9 ?4 Z. `, N6 j! y
  2. - R/ j/ Y/ Z# Z* f# W: o" O! [
  3. /* SystemFrequency / 1000            1ms中断一次
    ' h& v) {1 D% h" F
  4. * SystemFrequency / 100000     10us中断一次/ }1 ^- t5 E! k8 O+ ?
  5. * SystemFrequency / 1000000         1us中断一次
    5 S4 b! {( l9 o3 I/ U8 Y$ ]+ ]) K
  6. */  m* d9 Z$ `  u! T* R: p/ k

  7. ! D6 B' h" r7 F
  8. #define SYSTICKPERIOD                    0.000001/ s8 C  d) c9 j4 {
  9. #define SYSTICKFREQUENCY            (1/SYSTICKPERIOD)) L! z. @, J- S; @" `" ^" w- }% R: J& L
  10. 8 @, O7 F* K0 s7 c
  11. /**
    & e& ^8 d: M% z. c1 M) u6 R
  12.   * @brief  定时器2的初始化,,定时周期1uS
    & H3 r  ]6 V6 t+ d
  13.   * @param  无( @; I; T( D6 P/ L- u4 Y8 t
  14.   * @retval 无1 Z( Q. W+ M+ q% J
  15.   */+ I) }# J6 u7 ]$ e- h
  16. void TIM2_Init(void): r# \: l( }; {4 |
  17. {: |; z# g8 t/ \: s+ M3 V
  18.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    / N( ?& z( [& W# Q  [" n

  19. 9 i  j5 C( X# J& v
  20.     /*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */; g- g' A" t+ y2 {
  21.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);$ }( R$ m% f: T7 F- J7 Z9 g
  22.    
    5 j7 Q: c2 W. `8 \. x0 J' |5 @, C
  23.     /* Time base configuration */         9 R6 l2 F; O3 ?6 w, ]7 [
  24.     TIM_TimeBaseStructure.TIM_Period = SystemCoreClock/SYSTICKFREQUENCY -1;
    + N; ~8 f5 h3 {" z
  25.     TIM_TimeBaseStructure.TIM_Prescaler = 0;
    * a: l5 n8 G; Y- b* r+ S% m0 S
  26.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  m) C' d7 D3 V$ T# ?( {3 F, `" ~3 R5 ^
  27.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    5 q3 ?7 Q1 b: ?( l$ g
  28.       @5 @' ]9 o) }* S
  29.     TIM_ARRPreloadConfig(TIM2, ENABLE);+ a* F2 F8 g; _6 x+ O5 |
  30.    
    ( ]3 _, D$ B" |; {- G  ^" c" G
  31.     /* 设置更新请求源只在计数器上溢或下溢时产生中断 */
    1 w9 k3 h3 Q" U5 z% h! }
  32.     TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global);
    ( u4 R  z( `8 V
  33.     TIM_ClearFlag(TIM2, TIM_FLAG_Update);8 e, O& K- a( `1 k5 F- y
  34. }7 c4 k& d, o" r1 j7 f' ]

  35. 6 Z5 f1 G/ \$ d8 h* h; K
  36. /**
    * R9 u8 p, P7 R: e6 h5 m  m
  37.   * @brief   us延时程序,10us为一个单位4 @5 ?' s- v: w. z6 f1 |: @
  38.   * @param  
    , p2 O  }6 o, j, @1 ~0 V% _$ O
  39.   *        @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us! b( t. |$ X9 I/ j+ O$ l8 N
  40.   * @retval  无
    # x8 `4 Z& M5 I+ A
  41.   */0 H8 U( s. @4 I4 W$ r
  42. void Delay_us(__IO uint32_t nTime)
    & J$ x& `0 V9 q% m, x. ?
  43. {     
    ! r( p* e6 \/ A1 d3 F
  44.     /* 清零计数器并使能滴答定时器 */  3 V% o2 G: u& a0 }
  45.     TIM2->CNT   = 0;    ]# u4 `9 e0 s7 l9 w* X# o
  46.     TIM_Cmd(TIM2, ENABLE);     
    * [! s6 x8 P6 T$ z( `

  47. , N/ ^' M+ O, R( }/ Z4 ~1 V
  48.     for( ; nTime > 0 ; nTime--)
    8 ~/ K; H1 ?0 g5 l9 t/ p* M
  49.     {3 p2 P7 z& l7 P/ \; q3 ~
  50.      /* 等待一个延时单位的结束 */
      m! J) n' U, w/ d% o7 A5 `7 ^
  51.      while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET);2 m* X+ |0 h2 D+ z1 d- o( e
  52.      TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    ; _' k" \* }4 E) t& [; B( P
  53.     }. I5 j0 q$ N" G' ]0 z

  54.   K6 n  ]8 v; S2 g
  55.     TIM_Cmd(TIM2, DISABLE);
    9 j0 l4 g5 H3 [! l9 E
  56. }
复制代码
  在main函数中检验Delay_us的执行时间:
+ V0 e$ @/ n3 u4 Q
  1. 9 t6 @/ E. e) V' S# _
  2. #include "stm32f10x.h"
    7 L# S/ ?0 c6 X4 b% C# K# D, F
  3. #include "Timer_Drive.h"
    ; J$ h/ t- T& c+ `9 W
  4. #include "gpio.h"
    8 k, j3 r1 l/ U5 M% ^  \% y
  5. #include "systick.h", T% M# F; q4 z1 \( q! P
  6. $ Q- G% Y6 z) Q
  7. TimingVarTypeDef Time;
    1 ?& N  t4 N: Q. L

  8. ; U6 Z% Y- g+ {: i
  9. int main(void)
    1 s2 y4 f; n# [5 D8 B
  10. {    - S2 T& i" X3 u  d# ~  E
  11.     TIM2_Init();   
    , y! u: U; ?# F! O' l
  12.     SysTick_Init();  e7 `8 V3 _! c0 z+ B2 b5 h
  13.     SysTick_Time_Init(&Time);8 G' L9 `4 r: D8 Z7 ~2 |
  14.     8 ]; g% i5 n: b& A# m
  15.     for(;;)2 H6 J; j# f4 j* D
  16.     {
    6 l* X9 L! ^. D+ g, R- n. u5 v
  17.         SysTick_Time_Start(); ( t0 D0 y1 ?, n2 `  @% O
  18.         Delay_us(1000);
    $ S/ ], T! [; I8 K
  19.         SysTick_Time_Stop();, ^9 p1 ?4 X/ _  q3 V6 x( }
  20.     }     # v7 q1 g4 J. O% p
  21. }
复制代码
怎么去看检测结果呢?用调试的办法,打开调试界面后,将Time变量添加到Watch一栏中。然后全速运行程序,既可以看到Time中保存变量的变化情况,其中TimeWidthAvrage就是最终的结果。
3 E3 t7 O6 W+ ~& `; x" i8 M9 T 13.png / s' L( r; T8 F& W3 }1 _# c1 a7 P9 q
    可以看到TimeWidthAvrage的值等于0x119B8,十进制数对应72120,滴答定时器的一个滴答为1/72M(s),所以Delay_us(1000)的执行时间就是72120*1/72M (s) = 0.001001s,也就是1ms。验证成功。
) Z& P% G( s; ~& T9 i0 c$ Q( p
& v7 j+ _6 y, [- C' x! E    备注:定时器方法输出检测结果有待改善,你可以把得到的TimeWidthAvrage转换成时间(以us、ms、s)为单位,然后通过串口打印出来,不过这部分工作对于经常使用调试的人员来说也可有可无。
0 }8 c( h. I" N; ]7 K( k4 E) k! N+ Y" F0 v% F+ R
两种方法对比7 n/ `/ s/ l& U( M
软件测试方法) K, v+ O5 H* |1 p9 w8 C
6 c) L3 y9 s) u  T% w* A( B
    操作起来复杂,由于在原代码基础上增加了测试代码,可能会影响到原代码的工作,测试可靠性相对较低。由于使用32位的变量保存systick的计数次数,计时的最大长度可以达到2^32/72M = 59.65 s。
* U0 B; D! \& Q( F" _* t9 O+ |2 k( `4 S+ {( A( F. J& j7 a7 W9 V8 ^
示波器方法, f" I! ?$ C4 q9 A" y- O" u

" y1 J. ]6 b1 e5 G, v2 q8 m    操作简单,在原代码基础上几乎没有增加代码,测试可靠性很高。由于示波器的显示能力有限,超过1s以上的程序段,计时效果不是很理想。但是,通常的单片机程序实时性要求很高,一般不会出现程序段时间超过秒级的情况。6 s9 F8 Y* J# d9 D# m! T
7 n9 I  o  p6 Z: f7 i

$ d9 W9 _3 k7 e+ }5 |" r! f' W: L8 r) R( }- a5 Z2 \

% b) s4 W$ L: O! n; c: T/ n
  o  D9 P$ e! Q$ D" L! ^, e% R8 {0 n
4 V9 E6 @- T: D9 L1 X
" n1 E' R0 F8 _* A  r& j
0 k: B- P0 \# l) G: ~* P7 l  q
1 F# n  A( \$ r/ T, G( i
4 o0 c2 j- N6 [& H; `

) }, d) s' a" |( w4 C2 J
收藏 评论0 发布时间:2021-6-22 10:02

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版