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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 23:00
不知道为为什么,STM32 LL库并没有FLASH的库函数,于是决定写一个
& }+ }6 W+ L8 \& g# {
- e; `& \% g7 e5 @2 O2 TLL库的特色,就是一个函数,只占用一个指令周期,比如,设置GPIO输出的状态,就是LL_GPIO_SetOutputPin();
- y; i; U1 W- Y# q& ]4 S8 p2 d
  1. __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
    2 p1 j+ t8 m/ P
  2. {& a( b& G+ Z* ~+ e# X3 D! ^
  3.   WRITE_REG(GPIOx->BSRR, PinMask);
    . M7 w. L* r; a4 w2 l
  4. }
复制代码
于是我根据这种风格,已经常用的操作写了一个.h和.c文件7 ?2 L6 s0 M+ G( J% C
0 ]* m. A7 b* t9 N" c3 K
头文件代码
0 Z2 g! k5 p6 C: v
  1. #ifndef __STM32F0xx_LL_FLASH_EX_H
    8 M3 P( f+ h+ L+ c
  2. #define __STM32F0xx_LL_FLASH_EX_H4 y5 A% b7 x9 \3 D( [: E' P

  3. 2 l! L6 L2 [8 F* J  S0 m
  4. #include "stm32f0xx.h"
    6 x. w3 \: {0 T; S

  5. 9 p+ s7 r& i6 k0 J3 h

  6.   l! U4 \& w3 y/ p) Z2 \5 o
  7. #define FLASH_FLAG_BSY             FLASH_SR_BSY            /*!< FLASH Busy flag                           */ 4 P, p8 }3 f& H: X4 c
  8. #define FLASH_FLAG_PGERR           FLASH_SR_PGERR          /*!< FLASH Programming error flag    */
    9 O- u6 j5 \+ Y, x  s( l
  9. #define FLASH_FLAG_WRPERR          FLASH_SR_WRPERR         /*!< FLASH Write protected error flag          */& f5 ]6 r& X* P- J0 Q# v) e$ e  i3 ^6 N
  10. #define FLASH_FLAG_EOP             FLASH_SR_EOP            /*!< FLASH End of Operation flag               */
    " _: O2 w% ~( E6 H! ]

  11. 8 @. z3 }' ]  K
  12. #define FLASH_TYPEERASE_PAGES          FLASH_CR_PER         /*!< FLASH_CR_PER          */5 I: H( |8 l" [9 Y$ Z6 E* n
  13. #define FLASH_TYPEERASE_MASSERASE      FLASH_CR_MER            /*!< MASSERASE              */) Q3 {  q8 [5 ?$ Q

  14. , e; |8 M' L( o/ h' p. b

  15. 0 X* M+ N3 ]* A/ m, @
  16. #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) \; e5 R7 ], }2 @9 a% a
  17. || defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx) || defined(STM32F070x6)* W9 }; U& R2 n4 J, x& D- L% @6 L
  18. #define FLASH_PAGE_SIZE          0x400U6 Y0 _3 J& q, {1 Y3 S2 z; \
  19. #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */0 u- a& e( o$ R& p' [
  20. ; s7 }7 Z3 _. V" A
  21. #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) \
      _- e; f5 b* T( x
  22. || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)/ s1 z6 A6 s* {  R2 P2 j/ D1 e6 _
  23. #define FLASH_PAGE_SIZE          0x800U
    $ r% ~: m7 f' A# A, w
  24. #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC */
    " q, r. {  M7 V& x, N6 U- q

  25. 0 L8 p' ]: s) i% N7 V  t
  26. typedef enum {: Y8 q2 z. G# l& J5 T2 j! H  W7 V
  27.         ProgaraType_DATA64,
    # F* I. q; X6 }. T3 X
  28.         ProgaraType_DATA32,
    9 N9 Z& `/ t7 U; `9 X0 I5 H
  29.         ProgaraType_DATA16
    ) ~" K% x* M. h4 ?/ e% |# r
  30. }ProgaramDataType;( {" Z9 Y* I4 O1 m  W
  31. $ S; Q, R; X) k2 v
  32. typedef enum {\
    & S  a- ^) M% l! H
  33.         FLASH_Lock=1U,Flash_Unlock=!FLASH_Lock\
      r; _) B# Q( o9 `: }1 C) P% S0 ?
  34. }FlashStates;( T. K3 U  j, Y" B

  35. $ C  ]0 n+ g; B% W" E# w6 m, ?
  36.   /* Set the OBL_Launch bit to launch the option byte loading */' b$ ^% s$ h0 a; J! t- u
  37. __STATIC_INLINE void LL_FLASH_SET_OBL_Launch(FLASH_TypeDef *FLASHx)' a: T+ Z8 i( x$ ]) I
  38. {
    9 C! _/ e& ^- D
  39.   SET_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH);
    1 q" [: s" g$ J- x1 Q
  40. }  R* r3 R: z  i1 d( c
  41. __STATIC_INLINE void LL_FLASH_Lock(FLASH_TypeDef *FLASHx)6 p1 w0 {( o2 n0 O! @, u
  42. {
    * a* c+ G/ I- w* R
  43.   SET_BIT(FLASHx->CR, FLASH_CR_LOCK);/ e- h1 W: Q/ i& P: M
  44. }
    + L; c( h& O4 S7 d, V

  45. % k1 a9 E& Q7 E; ~- E! s- e
  46. 0 R% x9 \' r0 P/ d( v, X
  47.   /* @brief  Set flash erase type.1 @& x" m- O; q3 K
  48.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.1 o+ t% h- n" P8 [" k( i
  49.   *          This parameter can be any combination of the following values:; K7 P- ]: x  x7 @0 s
  50.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase$ j3 s( w7 @% a5 A: f3 ~$ @" \
  51.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag
    ; J( K$ W3 Y. d' ?- L; D
  52.   * @retval none*/
    ) Z1 d6 r& I$ f" }  E% k! D

  53. : v  h+ O& ]. }; V
  54. __STATIC_INLINE void LL_FLASH_SetTypeErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)+ v. W' r7 M4 r1 H8 \) M' \$ j, {
  55. {
    , Y9 P; F/ j! M6 j, [
  56.   SET_BIT(FLASHx->CR, FLASH_TYPEERASE);0 {) @- F! k& w
  57. }
    4 h, F  u+ z- J9 B0 Y( l6 q
  58.   /* @brief  Set flash erase ADDR.
    0 A  c$ A: P. F& j
  59.   *          This parameter can be any combination of the following values:
    - g0 z0 t7 l/ w3 \6 O; j) v. D- ~
  60.   *            @arg @ref EraseADDR         uint32_t value7 y' |8 H0 _: D2 p9 Z8 S0 `2 i
  61.   * @retval none*/! a* U( @0 r+ O( u9 Q2 T- @

  62. + S2 b5 W0 g8 M4 c
  63. __STATIC_INLINE void LL_FLASH_SetEraseADDR(FLASH_TypeDef *FLASHx,uint32_t EraseADDR); P' a' r# w6 f1 Q2 O
  64. {: A. r: I: N9 s+ D" \7 l: p( g
  65.   WRITE_REG(FLASHx->AR, EraseADDR);
    * _; L% r  c/ {" ^
  66. }  j# \5 c- x' _% Z9 i( ?4 M
  67.   /* @brief  Set flash erase ADDR.
    % V. x( N! [, t1 p" |( L
  68.   *          This parameter can be any combination of the following values:; e  ]/ Q/ _* T  e
  69.   *            @arg @ref EraseADDR         uint32_t value
    , M8 o$ `8 I1 W1 V5 P: J4 I
  70.   * @retval none*/8 w4 B. M7 `( H" G; R

  71. & ?( k7 w, n# ~1 B( N6 O
  72. __STATIC_INLINE void LL_FLASH_StartErase(FLASH_TypeDef *FLASHx)
    0 n' l) z" F2 p  W+ ^$ a0 R
  73. {
    3 Y* S+ g% h; [$ ^/ B3 s
  74.   SET_BIT(FLASHx->CR, FLASH_CR_STRT);' z( G2 @5 U  G% C& o9 j
  75. }
      K/ _0 Z, t% J9 N1 a6 h  A

  76. 4 c1 o, Y1 K& T* n( x& b( ?
  77.   /* @brief  Clear the specified FLASH flag.- G8 V0 K- E) K
  78.   * @param  __FLAG__ specifies the FLASH flags to clear., b# J# n0 t" e. o4 x5 B3 Y9 h
  79.   *          This parameter can be any combination of the following values:0 q) E$ m8 ~& j+ m! p
  80.   *            @arg @ref FLASH_FLAG_EOP         FLASH End of Operation flag + _( S/ N; y6 J
  81.   *            @arg @ref FLASH_FLAG_WRPERR      FLASH Write protected error flag 4 k4 _4 j; \. L; h7 z0 f- {7 K
  82.   *            @arg @ref FLASH_FLAG_PGERR       FLASH Programming error flag
    5 @1 g! D2 y) C, B
  83.   * @retval none*/- l" R9 u2 B! Y! s" L

  84. " f9 B$ h6 O/ j
  85. __STATIC_INLINE void LL_FLASH_ClearFlag(FLASH_TypeDef *FLASHx,uint32_t STATE_FLAG)! m4 a& t4 E! a* f
  86. {) J! L/ s1 T* A2 J
  87.   WRITE_REG(FLASHx->SR, STATE_FLAG);
    / `& r/ \! B+ x5 r* Q4 g% T* |
  88. }. b8 ~' ^3 W+ W7 t4 K" b9 i
  89.   [3 D! ]) J& B( P  {# M
  90.   /*get bit flash bsy*/
    + r. v* J1 L7 t9 M+ @* l2 j
  91. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_BSY(FLASH_TypeDef *FLASHx)3 w; `6 l. F* ^& i
  92. {
    7 Y8 }5 n6 w+ A  V: Y# G# H
  93.   return (READ_BIT(FLASHx->SR, FLASH_SR_BSY) == (FLASH_SR_BSY));
    8 g& _; A7 v0 ~# e! K- g* {
  94. }) m: h; Y7 D" F  G$ c6 o) x' K
  95. /*get end of operation bilt*/$ Y# K+ t) R7 t, G1 _
  96. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_EOP(FLASH_TypeDef *FLASHx)
    9 P* s2 _) C4 G- K  C! X3 R1 W; F
  97. {
    # p7 {9 a( i) b: p8 u# F  R
  98.   return (READ_BIT(FLASHx->SR, FLASH_SR_EOP) == (FLASH_SR_EOP));; n  d1 m' q# A( b- R# x
  99. }" R2 f/ z0 ~3 w( r) @9 x; N6 a
  100. /*clear end of operation bilt*/
    2 D5 e/ P# E6 N7 t4 U" v
  101. __STATIC_INLINE void LL_FLASH_ClearFlag_EOP(FLASH_TypeDef *FLASHx)
    & Y+ u" \  z5 U0 j& B5 t& J3 C
  102. {- v1 M7 W+ A+ n6 }
  103.   SET_BIT(FLASHx->SR, FLASH_SR_EOP);//EOP bit Set clear, e; V1 k( K9 t$ w7 Q" k
  104. }
    . N: `0 i$ `( a6 r! b( ~) B; ?
  105.   /* @brief  Set flash erase type.* }& ?1 v6 p: T  M/ E  w
  106.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.) Q- x5 w# z% }
  107.   *          This parameter can be any combination of the following values:
    ; ^# G. |" v& F6 e4 q) R; T
  108.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase/ M  ?3 S& b( D) c1 |* q
  109.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag
    8 q5 b; g+ [2 I8 J$ R
  110.   * @retval none*// n+ [6 j6 E) Q3 t: Q, n
  111. __STATIC_INLINE void LL_FLASH_DisenableErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)
    * v! W( _8 Z; \9 F
  112. {
    * ]1 D  ~4 Q. h- Z
  113.   CLEAR_BIT(FLASHx->CR, FLASH_TYPEERASE);: E7 u) |4 S  x* ]+ c; X6 r& |* c
  114. }
    6 |3 W5 m) J+ j9 e7 \" y5 a3 Z

  115. 9 \0 Q3 @7 B' o
  116. /*EnableProgram*/
    ( }/ v( p' J- s/ I6 }
  117. __STATIC_INLINE void LL_FLASH_EnableProgram(FLASH_TypeDef *FLASHx)* b% y6 _' {: m+ F
  118. {
    , W& ?0 Z8 K1 p$ P+ \0 E
  119.   SET_BIT(FLASHx->CR,FLASH_CR_PG);
    : q& q4 f( c' J" y
  120. }
    # g" o- s5 M% {8 k% R0 `0 x/ j
  121. /*DisenableProgram*/
    " {- e& W- d* N+ L$ w5 w# Q1 P
  122. __STATIC_INLINE void LL_FLASH_DisenableProgram(FLASH_TypeDef *FLASHx)
    1 l% J+ W$ j; j
  123. {8 W) y+ |+ C5 i; M0 N& @3 ?& M1 ]
  124.   CLEAR_BIT(FLASHx->CR,FLASH_CR_PG);
    $ s% B; V9 K4 L, h8 K% O
  125. }, g6 h8 L5 L. w7 W. J
  126. /*read flash's states of lock or unlock*/3 d  z! y5 I) g- h  u5 O0 e
  127. __STATIC_INLINE FlashStates LL_FLASH_LockState(FLASH_TypeDef *FLASHx)
    7 f, n6 E( N% D! r- I
  128. {  s3 T$ O2 W( N5 v+ r: A1 `7 t
  129.         return (FlashStates)(READ_BIT(FLASHx->CR,FLASH_CR_LOCK));- F6 H8 b8 n) b7 m
  130. }/ V6 d: L! m5 {6 p
  131. /*set key for flash*/+ V9 t0 D6 @3 X: W! X
  132. __STATIC_INLINE void LL_FLASh_SetKey(FLASH_TypeDef *FLASHx,uint32_t key)
    / S; |$ s7 a) R1 v
  133. {. ~1 N* r$ p7 y8 D' `5 _' H
  134.         WRITE_REG(FLASH->KEYR,key);
    * z, w0 r1 G$ c. s5 h  t' u
  135. }
    ( X* ^0 l2 [0 G% m1 ?

  136. " `3 t) D+ y: \4 F6 q: Z$ S

  137. 8 q3 q& C( G3 f/ l5 b7 J* L
  138. LL_StatusTypeDef LL_Flash_Unlock(void);* g) s) E1 s6 J- v9 L% ]' E
  139. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t NbPages);3 y, m! i2 e  w/ [
  140. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data);+ J+ z  E; O( m" Y- `
  141. #endif
复制代码

7 m6 N& \/ T: A3 W# r: ~C文件代码
( {: Y6 H) m2 A1 N/ ?8 ~
  1. #include "stm32f0xx_ll_flash_ex.h"
      ~; ~- H& e- a. @5 G
  2. ( \' d" V% C0 S0 C6 `7 {% {
  3. & {. Y& {1 {; T2 f" `; {
  4. void static LL_FLASH_Program_TwoBtye(uint32_t flash_addr,uint16_t data)  ]+ \+ K2 ]5 D$ e% ^6 f
  5. {6 e( n; m$ C$ a: I% ]* ~2 F; U
  6.         LL_FLASH_EnableProgram(FLASH);
    6 f2 T; \' s& k0 I" F6 b. W
  7.         *(__IO uint16_t*)(flash_addr) = data;0 ?" A/ B0 j0 U$ o* y( p, [
  8. }9 c8 l6 \6 b% G4 e
  9. " c5 n: S+ J2 v- Y# b3 d
  10. LL_StatusTypeDef LL_Flash_Unlock(void)
    / T  j- T% Z3 x- T: X: G& M! }4 L- g
  11. {
    8 l6 q/ W6 ^+ \$ J* L3 ]# B
  12.         while (LL_FLASH_IsActiveFlag_BSY(FLASH))  
    2 U: _  ?0 b# C
  13.         {0 V. p, z- U% X2 P9 B
  14.         } ' g* P( x4 ~# r& s$ ]8 _& w
  15.         if (LL_FLASH_LockState(FLASH)) - n0 |9 @; J- d5 D
  16.         { - D9 @5 M$ J" k" u! ]: D: n
  17.                 LL_FLASh_SetKey(FLASH,FLASH_KEY1);
    1 K( k+ W. x# I% z+ q
  18.                 LL_FLASh_SetKey(FLASH,FLASH_KEY2);
    , _+ {& D/ w) T+ `* A$ b$ O3 F; M
  19.         }; ?& Z4 J9 K* r! W/ k
  20.         return LL_OK;0 k, @# U: q* U- m
  21. }' b0 P, |5 ^- e. ^) K7 \
  22. : G9 Z" g4 V+ p5 H6 K. B2 b. R
  23. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t Nb)( Q0 ^% j- X# y
  24. {6 q& V. _6 p, ?, _8 L4 L
  25.         uint32_t End_addr =  10* FLASH_PAGE_SIZE +page_addr;
    + ?- l% h6 Z6 b4 S/ ]5 W
  26.         uint32_t Start_addr = page_addr;% R8 k& B8 y+ ^
  27.         for(;Start_addr < End_addr;(Start_addr += FLASH_PAGE_SIZE))0 R/ {9 e% d) b; R
  28.     {% ]1 p% m  X7 W6 V
  29.         LL_FLASH_SetTypeErase(FLASH,FLASH_TYPEERASE_PAGES);
    . ]* {' X  E, s, t7 g8 i
  30.                 LL_FLASH_SetEraseADDR(FLASH,Start_addr);) [+ ~, T& `6 f# H% X& x* \5 k
  31.                 LL_FLASH_StartErase(FLASH); + z5 H0 j9 ?# c7 J: I
  32.                 while (LL_FLASH_IsActiveFlag_BSY(FLASH)) " i8 j1 t" I; F0 ?# \8 c' o! s
  33.                 { / o" n% l) |& I# u
  34.                 }
    3 q9 O" j0 h. e/ c
  35.                 if (LL_FLASH_IsActiveFlag_EOP(FLASH))
    ( V. P6 L0 k# p- D$ S* {
  36.                 {
    - u. C6 o: W8 O! \1 s4 O8 r
  37.                         LL_FLASH_ClearFlag_EOP(FLASH);;
    : y" k" G) U4 r, M/ Q
  38.                 }
    . r. a# j) C" }% q4 u& s0 X4 n
  39.                 else
    , P7 S5 y% s0 e" b. _( \2 F. `+ C
  40.                 { ! V5 x; [. S9 S* g6 I% d  W( x: w
  41.                         return LL_ERROR;/ L0 b7 n& c* m; d( l0 Z
  42.                 }
    # F; \, p  G& X
  43.                 LL_FLASH_DisenableErase(FLASH,FLASH_TYPEERASE_PAGES);
    - z4 o! _9 r' G" ]$ a+ o
  44.     }
    2 Q9 g* ]3 a3 X/ w  n5 o+ F- \
  45.         return LL_OK;) P% q+ Y+ @+ P+ Z
  46. }* u, i, P0 N. s' O9 n. k  t

  47. 9 v9 B5 o, [' P7 w4 U4 d
  48. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data): a0 o# b8 {7 Q- ~" ]$ Z* U, b8 A
  49. {
    0 `2 V7 t* \0 j8 M; l% o) A: U
  50.         
    % m7 U3 s$ T! \: ^: E7 [+ y; y
  51.         uint8_t index = 0U;, d& ~6 o6 s, U; D7 u$ ~* q
  52.         uint8_t nbiterations = 0U;% \2 U" S/ x5 D8 Q0 M  n/ ^" O
  53.         
    ( a! ^- F2 [. N: \. S6 q8 l
  54.         if(ProgramType == ProgaraType_DATA16)* F$ s, G1 K0 ~" b- B
  55.                 nbiterations = 1U;
    6 c* y( H- Q: m$ j  T, X# E
  56.         else if(ProgramType == ProgaraType_DATA32)4 t) a' e7 q: e) j+ [+ Q
  57.                 nbiterations = 2U;4 p: a8 |5 _6 ^0 P" f; H% H% e0 x* @' g
  58.         else0 s& E2 R- D9 x, L) W" z2 N7 q
  59.                 nbiterations = 4U;; r& p" i" k; z6 m
  60.         for(index = 0U; index < nbiterations; index++)  E4 ?/ j: J$ K. A
  61.         {6 b$ s% J# `1 p* f  A/ ]1 H
  62.                  LL_FLASH_Program_TwoBtye((flash_addr + (2U*index)), (uint16_t)(data >> (16U*index)));& S1 ?. g0 L5 ]0 x
  63.         }
    1 u1 W/ I2 m" E% M
  64.         0 w( @# _3 M& X' q: R: e( X% b  m
  65.         while (LL_FLASH_IsActiveFlag_BSY(FLASH)) : L/ f7 T0 m& W* O5 }
  66.         {" W3 L& U" B- d( X$ p: B
  67.         }
    ( Z4 ]1 l+ ~3 [: m
  68.         if (LL_FLASH_IsActiveFlag_EOP(FLASH))        - @+ J- r4 b( K/ i) ~
  69.         {9 e9 o/ v) u2 P* p; D; O  n
  70.                 LL_FLASH_ClearFlag_EOP(FLASH);# R# P; P. N$ {; u- W
  71.         }
    4 e& e# Y0 {7 `" g. g, m+ ?
  72.         else  s; `6 K1 i7 W8 y; f
  73.         {! V' X2 H: \7 \. j
  74.                 return LL_ERROR;
    2 G* @; o% E  ^) t8 H; n
  75.         }! }" g2 O( H$ S
  76.         LL_FLASH_DisenableProgram(FLASH);
    9 E3 `: Q. \: J$ S* `
  77.         return LL_OK;2 x; l0 G) U) }1 `
  78. }0 U" L* V& j% @0 M! l# o+ ]
复制代码

* S7 f+ K  ]3 z* ~' D
- G3 a* ]5 [2 |/ [4 p
收藏 评论0 发布时间:2021-11-13 23:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版