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

【经验分享】STM32,仿照LL库,编写FLASH的LL库(内有完成代码)(STM32F0)

[复制链接]
STMCU小助手 发布时间:2021-11-13 23:00
不知道为为什么,STM32 LL库并没有FLASH的库函数,于是决定写一个; N+ g4 z% Q" @! O

2 r. w1 |" Z3 V/ x0 q  ALL库的特色,就是一个函数,只占用一个指令周期,比如,设置GPIO输出的状态,就是LL_GPIO_SetOutputPin();; u# J; i2 a) U( I
  1. __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
    8 n. E" [( X5 ^
  2. {6 ^& p# B' p* v  f
  3.   WRITE_REG(GPIOx->BSRR, PinMask);
    * F1 A2 r" j# W3 n
  4. }
复制代码
于是我根据这种风格,已经常用的操作写了一个.h和.c文件9 I8 _! G; e4 b9 U( r( P
5 S  Y9 M  m0 {/ U, }1 a
头文件代码$ T0 h  P& j% W
  1. #ifndef __STM32F0xx_LL_FLASH_EX_H* Y  o% z. X9 X  L) B
  2. #define __STM32F0xx_LL_FLASH_EX_H
    $ F6 m1 S# T- M) n0 d' O

  3. 6 Q. a' n! M# ^1 G" _/ i# m! j0 q
  4. #include "stm32f0xx.h"( [* u' a: V) O6 a5 o8 N$ P

  5. 9 Z, g4 l$ q* Z
  6. 8 Z2 z6 i& }1 V' G* |4 b
  7. #define FLASH_FLAG_BSY             FLASH_SR_BSY            /*!< FLASH Busy flag                           */ ) c+ i6 a4 D. p. R6 a
  8. #define FLASH_FLAG_PGERR           FLASH_SR_PGERR          /*!< FLASH Programming error flag    */
    ) F; P" a! k7 y+ l
  9. #define FLASH_FLAG_WRPERR          FLASH_SR_WRPERR         /*!< FLASH Write protected error flag          */
    9 Y" @/ T! b: ]9 D5 B
  10. #define FLASH_FLAG_EOP             FLASH_SR_EOP            /*!< FLASH End of Operation flag               */
    / u: N6 {/ d$ [# C! R: p$ K. C
  11. 8 U" f( y9 d/ I2 S( @
  12. #define FLASH_TYPEERASE_PAGES          FLASH_CR_PER         /*!< FLASH_CR_PER          */
    $ t; q9 B! C  o$ [- @' w
  13. #define FLASH_TYPEERASE_MASSERASE      FLASH_CR_MER            /*!< MASSERASE              */0 |1 v6 j( \: S9 N2 ?, ?# D+ D  {
  14. 0 a+ Y( I6 C- _# ^' ~5 N
  15. # ^1 C3 C4 n. q# `: Y- H2 c. H
  16. #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) \
    2 i5 y- d3 A1 D) O9 j* A, T, a
  17. || defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx) || defined(STM32F070x6)  s) P9 }+ r8 L: p) R% q
  18. #define FLASH_PAGE_SIZE          0x400U5 A9 W- D! X$ |% e0 o. F4 u9 r
  19. #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */
    0 a  @: e0 x8 I8 p0 N' u

  20. ' P, H4 R/ A" Z) l
  21. #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) \% z9 c! |4 ^( \
  22. || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)' |5 k( j! h: N& q5 p
  23. #define FLASH_PAGE_SIZE          0x800U
    ; C  t2 c% i. x! i
  24. #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC */
    ' W7 C) s7 z7 I5 Q( D
  25. 2 m7 t' u8 H- N0 G8 P6 b/ u
  26. typedef enum {7 K+ L7 R" Y6 z- ~
  27.         ProgaraType_DATA64,$ V+ U; x1 }# k" L5 ~! o
  28.         ProgaraType_DATA32,
    ) q: Z, l) v  s4 K5 d+ B( ]- `
  29.         ProgaraType_DATA16& V4 D/ T3 Y' t) |
  30. }ProgaramDataType;
    8 q9 D9 Z  O. i7 Z. R, u( o9 H9 p8 i
  31. ( x# e; E) k7 e" P% @
  32. typedef enum {\$ z3 ]% Z, U! z0 Z) x6 m1 S! J7 H
  33.         FLASH_Lock=1U,Flash_Unlock=!FLASH_Lock\$ E) r. E2 D, i0 t5 ^, K2 i' c5 |
  34. }FlashStates;) U9 P( l% }5 e4 f6 e; [3 s
  35. - t" ]* m7 y  i2 y, p4 @2 H1 U2 z
  36.   /* Set the OBL_Launch bit to launch the option byte loading */
    9 \$ }9 r8 K. U
  37. __STATIC_INLINE void LL_FLASH_SET_OBL_Launch(FLASH_TypeDef *FLASHx); `/ ^" b8 N+ J2 s, q$ s9 h
  38. {" X8 e+ S! W# n8 L0 B% H
  39.   SET_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH);
    * v" _# L  E, N
  40. }  I/ ~, ]" `8 |+ ]: T
  41. __STATIC_INLINE void LL_FLASH_Lock(FLASH_TypeDef *FLASHx)
    6 c! H; a& I4 S6 _8 Y
  42. {) a; h% `6 I; T' ?
  43.   SET_BIT(FLASHx->CR, FLASH_CR_LOCK);8 ^$ ~! \  U- u! z' R6 W+ a7 P
  44. }- s# E" r$ F2 T& z& O

  45. 1 \7 e% q0 {) P# o  n7 {5 F5 V9 j
  46. ' }, P& V5 w/ \0 b, m) h9 a6 ?
  47.   /* @brief  Set flash erase type.
    * t$ M; l# E% E/ b, `
  48.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.
      ?, E. ~" m8 u
  49.   *          This parameter can be any combination of the following values:( q: v; c  ]  ]% J6 X
  50.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase! e: x1 [4 B# d4 Q/ L
  51.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag
    1 l: L) n# @( @  G$ C
  52.   * @retval none*/
    " I: M8 B/ W& W3 u0 @. j

  53. 2 _/ }& p- {$ p8 P( [" ^( r* a1 h
  54. __STATIC_INLINE void LL_FLASH_SetTypeErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)
    " D9 n. @: f9 D1 j7 r8 [5 L
  55. {
    ! y* N+ E0 _& M, V+ I
  56.   SET_BIT(FLASHx->CR, FLASH_TYPEERASE);, O) v- B% P) c; |. h' H
  57. }
    & L6 `3 L( X. U2 `/ S; z: w
  58.   /* @brief  Set flash erase ADDR.
    , a4 r7 v5 P3 Y8 B7 o# Y
  59.   *          This parameter can be any combination of the following values:# h0 W/ g+ F& Z4 E; p
  60.   *            @arg @ref EraseADDR         uint32_t value
    6 K* _4 E/ m4 v
  61.   * @retval none*/2 D- ~3 k- X& w9 h  K/ q

  62. 8 ^4 i. ^5 \7 a! f0 Z  U( C- n
  63. __STATIC_INLINE void LL_FLASH_SetEraseADDR(FLASH_TypeDef *FLASHx,uint32_t EraseADDR). m5 D- h$ I5 Q! @
  64. {6 s7 i# C2 {6 O
  65.   WRITE_REG(FLASHx->AR, EraseADDR);, _) s5 D+ Y. O6 }$ e4 q
  66. }
      \# C6 r5 B% q$ J6 @
  67.   /* @brief  Set flash erase ADDR.  i/ z1 }5 b& z0 i, `$ r* F0 q
  68.   *          This parameter can be any combination of the following values:. P, p* C  N$ h% M& {& [: P! B
  69.   *            @arg @ref EraseADDR         uint32_t value
    6 V, L7 y* J) ?
  70.   * @retval none*/  c: [) `/ y& Z9 I* x/ W% e; w
  71. 0 a- t; e6 J  h% n4 l5 y
  72. __STATIC_INLINE void LL_FLASH_StartErase(FLASH_TypeDef *FLASHx)
    # D- d" X7 S" H8 I7 W9 i# c' S
  73. {
    - i2 L- O2 l  O* S; Y% ~
  74.   SET_BIT(FLASHx->CR, FLASH_CR_STRT);( Q) I) f7 f% O5 B
  75. }9 g, ~! u% R% m( Y* M" e
  76. 2 y5 _9 r3 I1 V/ l
  77.   /* @brief  Clear the specified FLASH flag.3 o1 i8 }6 k9 d
  78.   * @param  __FLAG__ specifies the FLASH flags to clear.
    5 z0 _  g# N. o6 O9 Q
  79.   *          This parameter can be any combination of the following values:
    3 M; W! T: T: V- i$ ^$ k
  80.   *            @arg @ref FLASH_FLAG_EOP         FLASH End of Operation flag
    - e4 A& D$ `: M0 s: F: x
  81.   *            @arg @ref FLASH_FLAG_WRPERR      FLASH Write protected error flag
    9 G; N8 {3 b' }; p# Z+ A# B$ P
  82.   *            @arg @ref FLASH_FLAG_PGERR       FLASH Programming error flag
    1 N* a; p9 p) F& R! u- c. G
  83.   * @retval none*/
    ! {, x; J5 {( y# p, o4 u7 s

  84. % f% T/ Q/ |4 J! T
  85. __STATIC_INLINE void LL_FLASH_ClearFlag(FLASH_TypeDef *FLASHx,uint32_t STATE_FLAG); W7 p% s1 }: m+ L. F. ?$ Z. Y
  86. {
    1 `9 D4 e+ U* R7 m9 J, m5 s
  87.   WRITE_REG(FLASHx->SR, STATE_FLAG);: A/ ~3 `( M/ b$ j- [* @( @
  88. }) H+ f8 x5 v* l6 h% W. j

  89. " c! K1 f9 T' g. H* {) X- E4 |
  90.   /*get bit flash bsy*/
    % u8 \) n. m' m( n9 w; P/ q& g* q
  91. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_BSY(FLASH_TypeDef *FLASHx)
    ; i( Z+ F0 Z4 I# |
  92. {
    " m: a6 M- n* K0 Z
  93.   return (READ_BIT(FLASHx->SR, FLASH_SR_BSY) == (FLASH_SR_BSY));
    4 a' V, {: ^3 H7 W
  94. }
    8 b6 O6 Z9 t9 W, l. |7 g, w
  95. /*get end of operation bilt*/
    4 Z) x* X* [, d+ J' b( \, k
  96. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_EOP(FLASH_TypeDef *FLASHx)0 N% h8 f& Q; C+ L% @8 m
  97. {/ d6 q) `9 l. Z- p1 b1 b
  98.   return (READ_BIT(FLASHx->SR, FLASH_SR_EOP) == (FLASH_SR_EOP));
    6 _5 @) o+ P7 j% t
  99. }& {6 O! h6 N* q; O4 I4 I
  100. /*clear end of operation bilt*/; t0 n' V  l% I0 h! o
  101. __STATIC_INLINE void LL_FLASH_ClearFlag_EOP(FLASH_TypeDef *FLASHx)6 q/ p+ j+ w- {8 m
  102. {4 Y, A. M1 N1 T5 q% n
  103.   SET_BIT(FLASHx->SR, FLASH_SR_EOP);//EOP bit Set clear0 H! {6 m5 |$ a0 M% ]
  104. }. e5 a3 w5 Q4 d& b' `& C+ W
  105.   /* @brief  Set flash erase type.
    , J/ \# |+ M4 Y
  106.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.
    2 [; d* S) u( |% F1 v
  107.   *          This parameter can be any combination of the following values:2 G, T5 a8 X5 S5 K# }& i+ p' S: g
  108.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase
    6 {2 e6 b$ D8 |, j) S
  109.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag
    5 J3 t& b1 l* z& ^. C
  110.   * @retval none*/* M5 n' r& Q' G7 e4 |1 l4 y8 a5 s
  111. __STATIC_INLINE void LL_FLASH_DisenableErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)' i) B" Y0 c$ c) i( A4 u
  112. {6 X! Q2 G4 q, _9 e+ c! x9 J
  113.   CLEAR_BIT(FLASHx->CR, FLASH_TYPEERASE);
    + x, ~; t, }! D. X$ y& x: |
  114. }) I" j* m9 s* I

  115. ( p. n% v2 k* N& \) h3 n6 ?: h
  116. /*EnableProgram*/* u3 Z, z' a; q' `! I6 ]8 Y6 J( ]
  117. __STATIC_INLINE void LL_FLASH_EnableProgram(FLASH_TypeDef *FLASHx). n/ `( Z% q0 p3 K; @3 K
  118. {
    ! |/ V1 ?0 R* z' _
  119.   SET_BIT(FLASHx->CR,FLASH_CR_PG);% Y- z# Y9 [/ z2 A
  120. }
    ( y! @$ g' Q0 C; i# S8 R! z
  121. /*DisenableProgram*/
    $ e3 U+ [1 w0 q1 _
  122. __STATIC_INLINE void LL_FLASH_DisenableProgram(FLASH_TypeDef *FLASHx)
    6 ?3 ^9 L) v3 i( O
  123. {
    # g# f! h( e, W* ^/ U  G& P+ W
  124.   CLEAR_BIT(FLASHx->CR,FLASH_CR_PG);
    . \1 e9 W  X7 h1 \
  125. }6 P; d1 U2 x  ]
  126. /*read flash's states of lock or unlock*/
    1 O4 ~$ Z6 L0 |8 ~/ c6 t7 M  G
  127. __STATIC_INLINE FlashStates LL_FLASH_LockState(FLASH_TypeDef *FLASHx)! t! x/ I- q8 [  r& o
  128. {
    " D7 s3 ]2 I8 Q* \
  129.         return (FlashStates)(READ_BIT(FLASHx->CR,FLASH_CR_LOCK));- F6 y) X9 \; B, X2 C5 q8 I7 }8 j
  130. }
    8 W6 Y% [8 q0 D
  131. /*set key for flash*/
      s! t( x  Z% E' a
  132. __STATIC_INLINE void LL_FLASh_SetKey(FLASH_TypeDef *FLASHx,uint32_t key)
    + E* G' H. R& A: q4 s
  133. {* O% ?1 O+ R/ X6 w
  134.         WRITE_REG(FLASH->KEYR,key);
    $ G3 Y6 P3 C$ @
  135. }
      S$ P6 o+ q3 ?& h
  136. 2 {$ w7 L" p# `3 J* i6 [/ J/ e8 E
  137. : q: u2 P: X* w3 [
  138. LL_StatusTypeDef LL_Flash_Unlock(void);. N+ S' l- m( o$ c3 D" Z
  139. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t NbPages);
    ! A% {  e7 V* a$ n. M# Z  `
  140. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data);$ F% w" }* r/ e) f+ u" u
  141. #endif
复制代码

, p( E" V/ {1 b7 H! t: M% iC文件代码3 k$ n0 C; \, c
  1. #include "stm32f0xx_ll_flash_ex.h"
    % I  j: k- Y# O, e. ?9 O0 Q/ y
  2. ( M, H9 O9 ~& I1 g' b5 }
  3. / T& X% ?* d, E+ P# L" R0 C
  4. void static LL_FLASH_Program_TwoBtye(uint32_t flash_addr,uint16_t data)9 I9 h; E/ g. z/ p. E! w
  5. {6 P5 P9 R( ]( D" y) I
  6.         LL_FLASH_EnableProgram(FLASH);
    + a8 U# l0 f; w" N. x
  7.         *(__IO uint16_t*)(flash_addr) = data;
    / i* `. L  B# ]) ]- r+ C
  8. }2 q! b+ [4 j% M3 {7 C, ]0 P1 l( T
  9. + T) B" `' A2 D) Q$ W
  10. LL_StatusTypeDef LL_Flash_Unlock(void)
    6 n) Z# G; M3 U) `9 W3 n2 ]$ T
  11. {+ @7 W0 g" `' O6 `) S) K
  12.         while (LL_FLASH_IsActiveFlag_BSY(FLASH))  8 C* I/ W  S( V! K% h
  13.         {
    . \1 G# B7 F, }5 N! W5 E& z0 Q* b8 K: \
  14.         }
    : ~( \3 i/ C0 @0 R
  15.         if (LL_FLASH_LockState(FLASH))   V3 ]6 Q9 I; C6 {. Y) G
  16.         { ' ^7 B  E: C! I; B5 m3 j5 m" Q
  17.                 LL_FLASh_SetKey(FLASH,FLASH_KEY1);
    ! _/ c; F4 g7 p+ k- |5 {
  18.                 LL_FLASh_SetKey(FLASH,FLASH_KEY2);
    + I# P: Q5 \) v8 U/ Y. v  o2 @! _
  19.         }
    ) `, b6 ]0 C7 `2 G
  20.         return LL_OK;
    / n- J& Y4 u) P% f7 V0 P
  21. }
    6 q# v( ^. s* M6 s3 B% Y$ u$ _
  22. - u/ q7 L& N3 y$ b6 Q, o
  23. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t Nb)( ?) f4 X3 o0 I; j$ G' c5 u, v$ g
  24. {! p; _" z( `5 H$ f8 j
  25.         uint32_t End_addr =  10* FLASH_PAGE_SIZE +page_addr;
    ( ?3 k3 Q* X& M' p
  26.         uint32_t Start_addr = page_addr;
    ( p# p8 k9 U' q" F. w% ?
  27.         for(;Start_addr < End_addr;(Start_addr += FLASH_PAGE_SIZE))# N+ a* t9 Y! n8 C( f5 z/ @. Z: W  a- s
  28.     {
    2 g6 f3 }4 U3 L9 w9 p
  29.         LL_FLASH_SetTypeErase(FLASH,FLASH_TYPEERASE_PAGES);5 y6 N6 G# i0 C& }
  30.                 LL_FLASH_SetEraseADDR(FLASH,Start_addr);
    ' j6 T. b% ^& x; @) _7 o" o
  31.                 LL_FLASH_StartErase(FLASH); $ k* n4 }9 P" J' j3 p" o$ u7 X
  32.                 while (LL_FLASH_IsActiveFlag_BSY(FLASH))
    1 M1 w6 Z2 N" \# a0 v* r4 d
  33.                 {
    6 f2 n4 R& K, d# ~
  34.                 }   j. g( Z- S* m# G! ]" \
  35.                 if (LL_FLASH_IsActiveFlag_EOP(FLASH))
    $ l2 k2 _% K+ d- m) M, Z
  36.                 {
    & l+ Q" w% F; ]1 [  \. D3 Z+ p
  37.                         LL_FLASH_ClearFlag_EOP(FLASH);; 3 R: }2 A' t* [1 C
  38.                 } % x$ q+ l6 Y- S0 T$ N
  39.                 else2 n. k0 {# Y6 X8 b5 y# D
  40.                 {
    $ a6 |/ k- l2 I) ]  C' G' C" Z% F! R/ B. T
  41.                         return LL_ERROR;, v" E7 h% Y( v
  42.                 }  q. W! l% t- l; t
  43.                 LL_FLASH_DisenableErase(FLASH,FLASH_TYPEERASE_PAGES);
    % B1 W- Q" v( u  B3 n- Z" z$ p
  44.     }
    # J4 c( h- J/ t* z, J! C" H
  45.         return LL_OK;, I0 J' }2 Y7 y% }& Q4 k- _6 I
  46. }) m5 n6 h8 ]! R- _, g* {
  47. ) q# ?$ ?9 y8 g4 r! d8 b
  48. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data)2 }) F6 a8 M/ W
  49. {& h0 O* T' F0 V2 U7 U
  50.         
    ( _/ S8 z( B& f' j  ]' q9 g/ y
  51.         uint8_t index = 0U;
    " s: z9 r& e4 Q# t1 n7 |1 j
  52.         uint8_t nbiterations = 0U;
      \0 Q2 g. l: c* H4 t
  53.         
    ' f. {  ^, F4 e( [7 G1 F6 f9 R
  54.         if(ProgramType == ProgaraType_DATA16)  j8 ^5 A, @* C% j" w
  55.                 nbiterations = 1U;
    6 J8 N1 O" C" h, z7 G6 G. |
  56.         else if(ProgramType == ProgaraType_DATA32)) _9 O& q- o% m$ r# k: N
  57.                 nbiterations = 2U;
    5 e4 k6 ^9 q! b% A! c% |$ s9 Z2 X  u
  58.         else
    ) X4 \8 t- I5 H2 M# f
  59.                 nbiterations = 4U;! S7 P3 j, U: u# [1 ~4 G" i
  60.         for(index = 0U; index < nbiterations; index++)( o- G( i0 h% W9 b! t' M; i: S# Q% t7 a0 Q
  61.         {8 l* P9 W9 W- c& N% P5 \: {6 A7 t
  62.                  LL_FLASH_Program_TwoBtye((flash_addr + (2U*index)), (uint16_t)(data >> (16U*index)));  V% \( `2 n/ K; p$ i/ g5 e
  63.         }- F4 F, k/ }  f. i, K
  64.         
    / d. c: v4 V* X7 _$ f  W& B: }8 F
  65.         while (LL_FLASH_IsActiveFlag_BSY(FLASH))
    7 A3 s! u5 Q' ~, o
  66.         {
    8 q0 Z/ r. ~; T( N, s. N5 h
  67.         }
    ' i& y4 j) _, x. G6 T
  68.         if (LL_FLASH_IsActiveFlag_EOP(FLASH))        $ j5 t8 w# {5 A# M; B+ L
  69.         {
    / M1 q' q: @4 L
  70.                 LL_FLASH_ClearFlag_EOP(FLASH);) n: L; S, g  @$ e
  71.         }+ H0 g4 V3 l/ @2 X% n$ G$ `
  72.         else
    8 m/ I6 K6 }& T4 k  i; m3 R( r4 O
  73.         {+ q8 z% S6 ]+ I7 `8 K
  74.                 return LL_ERROR;
    ; z: E. n4 e. r
  75.         }
    # X1 A# x: p3 G( W  }6 s" q) C
  76.         LL_FLASH_DisenableProgram(FLASH);3 T* |# b# r. g, t6 x9 J
  77.         return LL_OK;
    + P8 F7 f- z6 N( D! d
  78. }
    ; ^3 r' d0 U; K$ h% a. w2 P1 t) e
复制代码
! N% a' |1 y* }6 [" P: {' c
& K1 l2 m8 g- k
赞 收藏 评论0 发布时间:2021-11-13 23:00

举报

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