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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 23:00
不知道为为什么,STM32 LL库并没有FLASH的库函数,于是决定写一个, Q0 {; f% x. O+ q

' n( d, u' L5 Y, z$ f1 lLL库的特色,就是一个函数,只占用一个指令周期,比如,设置GPIO输出的状态,就是LL_GPIO_SetOutputPin();7 ?  c0 @8 [! @3 G2 o* h3 {
  1. __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)+ g7 L* Z; C, s9 y3 m. w8 M" L# r
  2. {2 l# g) n% q, J
  3.   WRITE_REG(GPIOx->BSRR, PinMask);
    2 W3 F$ z4 H& v
  4. }
复制代码
于是我根据这种风格,已经常用的操作写了一个.h和.c文件; J' D$ s- C- Z! a

3 A2 {; y. `' ^2 U. v+ T& V8 o8 |头文件代码
, g' ?- t  x, F/ {
  1. #ifndef __STM32F0xx_LL_FLASH_EX_H7 P' d4 \6 U: T6 B3 h9 }5 b
  2. #define __STM32F0xx_LL_FLASH_EX_H
    7 Y; o3 r: y5 N- U

  3. . S. B( }+ t3 c) a
  4. #include "stm32f0xx.h"2 N$ k" a" l& p" q! q

  5. 3 Q; e2 k8 q2 B% l

  6. - ~/ A- D/ {, V9 T$ N$ l5 G% r
  7. #define FLASH_FLAG_BSY             FLASH_SR_BSY            /*!< FLASH Busy flag                           */
    & i' q8 \6 i8 d7 B7 B
  8. #define FLASH_FLAG_PGERR           FLASH_SR_PGERR          /*!< FLASH Programming error flag    */
    $ d: E6 W( K: }9 f+ c& i, g
  9. #define FLASH_FLAG_WRPERR          FLASH_SR_WRPERR         /*!< FLASH Write protected error flag          */
    : B6 }3 @. S! W
  10. #define FLASH_FLAG_EOP             FLASH_SR_EOP            /*!< FLASH End of Operation flag               */
    . E0 H8 m0 _  F% V+ Z: F" O

  11. 5 u$ L/ P9 N9 q2 f
  12. #define FLASH_TYPEERASE_PAGES          FLASH_CR_PER         /*!< FLASH_CR_PER          */
    3 G: _  J) t. i( M1 L+ T
  13. #define FLASH_TYPEERASE_MASSERASE      FLASH_CR_MER            /*!< MASSERASE              */
    % S9 Q4 X/ I- y0 X$ _& ]
  14. , g( {2 M4 x6 p2 _) `+ b8 c) `
  15. 3 E7 R' {, S0 ]+ H/ J; t5 u9 _( L
  16. #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) \8 Q6 x3 q( ?( p" S6 A0 A
  17. || defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx) || defined(STM32F070x6); e: E0 H. `2 e2 _  p: Q
  18. #define FLASH_PAGE_SIZE          0x400U! H5 G2 X- J1 a
  19. #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */6 u# p/ Y* f/ F# B
  20. . E( v, N+ Y3 H3 c. w5 G  d; O
  21. #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) \3 k, C" l  ~" Q8 m5 L
  22. || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
    2 `! B2 A; q1 X& G; S
  23. #define FLASH_PAGE_SIZE          0x800U7 f, t, _- \- c" C7 e4 q2 ~
  24. #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC */
    ' L& C! ?* L2 V' `9 D9 |7 c$ r9 j
  25. 6 I2 M5 u) q2 U% S5 J
  26. typedef enum {
    : G8 s( V7 l# G" p; e; W
  27.         ProgaraType_DATA64,
    9 w1 D7 J0 u. s0 t5 C
  28.         ProgaraType_DATA32,
    7 A! a2 E3 @9 p3 f; Z- i
  29.         ProgaraType_DATA16
    ) x5 j" f; |$ a. B& \4 w6 r& j
  30. }ProgaramDataType;! ^2 T; h; a1 D& |0 U
  31. 4 p' A+ M! _# f, ~* s4 \! R8 F
  32. typedef enum {\" k( @3 h% _! H
  33.         FLASH_Lock=1U,Flash_Unlock=!FLASH_Lock\
    1 [8 y0 S; h* ^7 n8 @6 T+ U
  34. }FlashStates;
    * i/ H. `! r/ U7 I
  35. 9 K* z) q" |8 V: Z* r$ m
  36.   /* Set the OBL_Launch bit to launch the option byte loading */6 i( [6 E! a! i# s8 T8 N; B% a
  37. __STATIC_INLINE void LL_FLASH_SET_OBL_Launch(FLASH_TypeDef *FLASHx); A* H' i& T* ~% w2 I, n
  38. {
    # m/ p0 G% K5 x' v3 p; M  X+ w. }
  39.   SET_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH);# p! t2 q5 w% ^# h/ R/ L$ u( ^' G
  40. }
    ; k# M4 h) O( L! P! V
  41. __STATIC_INLINE void LL_FLASH_Lock(FLASH_TypeDef *FLASHx)
    - B2 ]. V- Z" i: l: v$ y# e  R
  42. {
    , P. G$ I" d0 p$ {) d; g
  43.   SET_BIT(FLASHx->CR, FLASH_CR_LOCK);
    5 C* M0 r4 L# y5 `& v2 j- r. b
  44. }) T) \# m' K0 T6 j5 R0 [
  45. 3 \. J6 |$ D! T5 C* k

  46. % n/ x7 J' W' R% n2 D
  47.   /* @brief  Set flash erase type.
    ) G0 w8 L* b3 `1 j4 S5 u% h# U
  48.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.
    " v, u, `- C& G) S
  49.   *          This parameter can be any combination of the following values:
    % g& L5 x7 J* a  y
  50.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase5 I/ W- [* Z8 i/ M
  51.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag
    + q+ t/ w0 N- L/ b0 H# v: v% C
  52.   * @retval none*/
    & V8 i4 y, w4 r  a, F

  53. 1 \! r) s5 b; Y- m/ Y
  54. __STATIC_INLINE void LL_FLASH_SetTypeErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)4 T. V& c! l$ U) i2 Z
  55. {
    ; b! i7 _- _  ]5 `7 P' v
  56.   SET_BIT(FLASHx->CR, FLASH_TYPEERASE);
    1 {. Y; z4 b/ \+ S
  57. }0 {  k: e: R  ?" Y0 P
  58.   /* @brief  Set flash erase ADDR.7 `9 |3 W: p- O" ^
  59.   *          This parameter can be any combination of the following values:
    5 C/ v% Z# F1 L$ _! _5 L0 c3 S
  60.   *            @arg @ref EraseADDR         uint32_t value4 r- {( s4 j7 R7 {
  61.   * @retval none*/. I5 Z/ N6 A) h5 G
  62. 9 J0 T# g' o' J0 v
  63. __STATIC_INLINE void LL_FLASH_SetEraseADDR(FLASH_TypeDef *FLASHx,uint32_t EraseADDR)+ u( ?/ C7 w/ [! E* B- R
  64. {
    / y* ?8 t3 O) R, m2 i
  65.   WRITE_REG(FLASHx->AR, EraseADDR);
    # H, f* m; Z" n" K, W
  66. }
    ' t! e! Y1 f6 }* ?/ }% ?, U
  67.   /* @brief  Set flash erase ADDR.
    2 C8 \) R$ l* h7 P5 j6 ~, ]
  68.   *          This parameter can be any combination of the following values:) E4 ^( Q! r6 K$ E4 x$ ?
  69.   *            @arg @ref EraseADDR         uint32_t value+ C  X5 T9 t- n9 ^+ s6 ~4 f5 E
  70.   * @retval none*/! X8 [8 f( t" Y: n$ R

  71. , G' G, }" }7 e. y* |
  72. __STATIC_INLINE void LL_FLASH_StartErase(FLASH_TypeDef *FLASHx)& x4 }, d- l2 m5 Q/ g
  73. {
    8 m# H4 X1 X% P1 u$ e
  74.   SET_BIT(FLASHx->CR, FLASH_CR_STRT);8 G* T' G1 n. Z# J( {! P, u
  75. }8 f: ?0 A5 _. G. n
  76. 3 y! r8 t+ U0 v! @; ]- [6 Q' `
  77.   /* @brief  Clear the specified FLASH flag.: x6 u; K+ ^5 f% p; R
  78.   * @param  __FLAG__ specifies the FLASH flags to clear.
    2 n/ W4 B. j$ U- c
  79.   *          This parameter can be any combination of the following values:# n. V. N- f& m! E
  80.   *            @arg @ref FLASH_FLAG_EOP         FLASH End of Operation flag 1 F( c( `* e, F3 b' d
  81.   *            @arg @ref FLASH_FLAG_WRPERR      FLASH Write protected error flag 1 X$ s9 X3 s) m5 ]& a# E4 |
  82.   *            @arg @ref FLASH_FLAG_PGERR       FLASH Programming error flag# Q% i  d& C/ |4 Z* h3 ?. g0 U# F
  83.   * @retval none*/
    , n: T2 f9 z4 N5 w7 E
  84. $ g' n* y' c1 d* I
  85. __STATIC_INLINE void LL_FLASH_ClearFlag(FLASH_TypeDef *FLASHx,uint32_t STATE_FLAG). G6 z2 F& \  J; g
  86. {: L- e( h6 a1 F  P1 _
  87.   WRITE_REG(FLASHx->SR, STATE_FLAG);4 s$ K8 ~& H" Y6 Z; |+ t0 {: y
  88. }
    " b: C' S7 y3 R

  89. $ p) ]: ]$ H' l5 c+ c4 y
  90.   /*get bit flash bsy*/
    9 \8 _$ c: g7 @+ e( I% \
  91. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_BSY(FLASH_TypeDef *FLASHx)
    3 o" H; e0 `# j: W
  92. {0 B7 ?& D  D) i% h5 }6 X8 m
  93.   return (READ_BIT(FLASHx->SR, FLASH_SR_BSY) == (FLASH_SR_BSY));$ Y. Y3 h7 b- ]. B7 E
  94. }
    % t$ q; a" e: _; q9 d# B* j
  95. /*get end of operation bilt*/6 H9 B! Z1 X0 N, w7 K1 D" D
  96. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_EOP(FLASH_TypeDef *FLASHx)2 T( N+ G" }$ A9 d
  97. {
    2 A: S! w" Q( L/ ?
  98.   return (READ_BIT(FLASHx->SR, FLASH_SR_EOP) == (FLASH_SR_EOP));
    - ]% x4 n" x' \) ]" G  U5 s5 o
  99. }
    2 I$ K- ^  B3 }* w+ x
  100. /*clear end of operation bilt*/
    1 Q, G1 A" A! g4 F, q
  101. __STATIC_INLINE void LL_FLASH_ClearFlag_EOP(FLASH_TypeDef *FLASHx)
    + k% F. }: c8 ]1 @& M
  102. {& O5 \7 w& t0 K1 R$ |! `
  103.   SET_BIT(FLASHx->SR, FLASH_SR_EOP);//EOP bit Set clear' a4 X) K6 k% x. L1 X* K
  104. }! ~! N; z) S9 S
  105.   /* @brief  Set flash erase type.
    : E9 s. J' Y: K% Z1 ^% I+ i
  106.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.
    8 Y8 M" C3 x) l# O/ c& s2 W
  107.   *          This parameter can be any combination of the following values:6 e5 U; {- C9 l# z
  108.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase
    6 \& _: g' `) K1 l5 ]) P2 F: U$ [
  109.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag ' Q8 T# f  I; r7 }" v7 \/ a3 B/ A
  110.   * @retval none*/
      [& i1 \" U/ M0 u8 N7 B' B
  111. __STATIC_INLINE void LL_FLASH_DisenableErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)
    4 R& ^0 V* S/ J& m9 I0 M
  112. {
    5 F) F; o0 D, N7 a
  113.   CLEAR_BIT(FLASHx->CR, FLASH_TYPEERASE);
      k( a5 J, y; s1 n# K( ?1 H
  114. }
    % d' P4 w. C! n

  115. 0 i" _6 a9 w. _4 _$ ~
  116. /*EnableProgram*/
    ' g% y" H6 {! B
  117. __STATIC_INLINE void LL_FLASH_EnableProgram(FLASH_TypeDef *FLASHx)0 W) F# p4 ~# G% f- |' F
  118. {* {$ m$ Z5 N2 j) u* Q
  119.   SET_BIT(FLASHx->CR,FLASH_CR_PG);, q2 W8 v; \0 [
  120. }- v6 j3 ^$ ^- G. ?, d8 ?0 B6 _
  121. /*DisenableProgram*/
    ) J9 F9 k# |6 g4 e$ q
  122. __STATIC_INLINE void LL_FLASH_DisenableProgram(FLASH_TypeDef *FLASHx)
    1 j* I  z. R$ x) l8 J& w
  123. {8 t+ I' c0 C3 B4 _! z2 y
  124.   CLEAR_BIT(FLASHx->CR,FLASH_CR_PG);# M# ]9 I) U! X9 a9 a1 C, ]
  125. }2 o, o8 l, L! c% {. _/ ^
  126. /*read flash's states of lock or unlock*/6 ^8 m! H- _$ n- B3 V' I; S/ S
  127. __STATIC_INLINE FlashStates LL_FLASH_LockState(FLASH_TypeDef *FLASHx)
    5 [6 ^- k9 u6 @* |
  128. {
    6 d$ R2 w$ B% r6 E- V
  129.         return (FlashStates)(READ_BIT(FLASHx->CR,FLASH_CR_LOCK));$ ]. x1 |1 V" A) M+ P3 W0 T) h
  130. }2 }% v9 b0 R( H: N1 o
  131. /*set key for flash*/
    3 z- l4 F- M$ D4 Q0 L! [
  132. __STATIC_INLINE void LL_FLASh_SetKey(FLASH_TypeDef *FLASHx,uint32_t key)+ [: M8 i: e8 F( {$ t
  133. {% i6 H. B7 _: U1 {7 ^- s% n4 t
  134.         WRITE_REG(FLASH->KEYR,key);- w- p$ E# W0 `
  135. }
    , i- a. R% z- L' M) k- x( u( f
  136. 7 \5 z, i7 n, L- k$ f9 S
  137. " }3 l" t" t  s" a: a  [$ v3 e
  138. LL_StatusTypeDef LL_Flash_Unlock(void);
    ' n1 d+ s( |. w5 y+ H: Q% r
  139. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t NbPages);
    3 Y. t2 Y$ \' M2 s& r* y) f
  140. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data);
    7 N7 I6 ^& s0 `, Y# ^
  141. #endif
复制代码
, L5 z( `6 U2 b9 T- q
C文件代码4 {# @" Y1 {" P6 h+ o
  1. #include "stm32f0xx_ll_flash_ex.h"! }7 O+ s) D; Y% Q2 _1 @
  2.   W$ F. C+ C& Z  l. y
  3. , N1 ~$ q: v' `( C
  4. void static LL_FLASH_Program_TwoBtye(uint32_t flash_addr,uint16_t data). [/ U8 T, o  R- T& D3 H
  5. {
    4 I) o3 y7 M2 }7 u9 r" e  Q: P
  6.         LL_FLASH_EnableProgram(FLASH);$ Q: x: |" b0 z
  7.         *(__IO uint16_t*)(flash_addr) = data;
    8 E  e9 f5 t+ e
  8. }# H0 `- J. V2 V1 {0 t/ W! L
  9. # t, T7 ]: B( P% K
  10. LL_StatusTypeDef LL_Flash_Unlock(void)
    ( @- r" U1 {% B( P
  11. {( \9 D/ Y0 \' r( @8 ^. W, d& c
  12.         while (LL_FLASH_IsActiveFlag_BSY(FLASH))  
    0 e/ T, D' M7 q% ^& ~
  13.         {9 |- b8 X$ H0 `0 m5 H
  14.         } + N/ I% |( g& v, `- p
  15.         if (LL_FLASH_LockState(FLASH)) + K- K/ i7 r1 {9 ?( ?" j
  16.         { & ?8 p2 e2 ^/ u7 A, g6 [
  17.                 LL_FLASh_SetKey(FLASH,FLASH_KEY1);3 D* e, F6 b3 W6 [7 S
  18.                 LL_FLASh_SetKey(FLASH,FLASH_KEY2);! t4 o5 c4 l7 J' h
  19.         }
    * V: f5 ?, w/ \) M' Q' I
  20.         return LL_OK;% J0 e$ n, H3 H3 R2 \; D% n$ o' Q6 ^8 S5 d, Z
  21. }
    + P8 ]% s$ G3 i

  22. ; H  T& a7 M1 D! F" \8 D* J! ^
  23. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t Nb). d/ B( j- h# u, x
  24. {
    & K1 r- R3 H5 x) Y7 ~2 k. F
  25.         uint32_t End_addr =  10* FLASH_PAGE_SIZE +page_addr;
    ! P$ N0 q9 E9 y9 _  n/ q" i8 i
  26.         uint32_t Start_addr = page_addr;- g  U7 m; V& g) u
  27.         for(;Start_addr < End_addr;(Start_addr += FLASH_PAGE_SIZE)); d! ^) Y! Z' F; E9 o) {7 I
  28.     {
    6 ^0 m. ]/ e- O  v* i
  29.         LL_FLASH_SetTypeErase(FLASH,FLASH_TYPEERASE_PAGES);
    : X1 b9 O$ |  y
  30.                 LL_FLASH_SetEraseADDR(FLASH,Start_addr);( @0 l/ D5 v2 r9 P+ `' e
  31.                 LL_FLASH_StartErase(FLASH); ; J+ A$ C5 Z8 q
  32.                 while (LL_FLASH_IsActiveFlag_BSY(FLASH)) ' i8 ^7 W5 W& o6 f! P
  33.                 {
    ( ~7 c( g. R( p
  34.                 } % o& t& s! i: J! l4 T
  35.                 if (LL_FLASH_IsActiveFlag_EOP(FLASH))
    $ W' G) R3 ^) g# Q
  36.                 { 8 Q! ~2 d4 m: \. I( e
  37.                         LL_FLASH_ClearFlag_EOP(FLASH);; : s* Z' c! j2 V8 k! {
  38.                 } 6 v& f" A3 b, [* [9 ?, V: O8 X
  39.                 else
    - \% t6 c/ L6 f2 ~* Q& a1 O$ ]/ M1 |! X
  40.                 { ! M0 k& w% e0 q3 ^! \% c8 D: ]
  41.                         return LL_ERROR;
    2 `4 |. B! i( l' ?, K5 a0 ]8 w7 k1 j
  42.                 }$ J! y( A6 Q1 @, J# h
  43.                 LL_FLASH_DisenableErase(FLASH,FLASH_TYPEERASE_PAGES);! T7 _& b6 v! m; h6 t0 K
  44.     }4 L. l. c) m1 Q- J! P2 I3 f
  45.         return LL_OK;6 o( b( y$ t9 _2 W# v, B( @: \
  46. }/ K( Q; p9 B7 D& V: ^$ d
  47. 9 ], Y+ S2 q% H
  48. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data)
    : C* z% o3 n! B" A! V0 P
  49. {9 ?0 e2 h& s4 c# n
  50.         8 _4 |# ?5 ~" f, N" G
  51.         uint8_t index = 0U;( z- m9 {1 N' p' c: |, w
  52.         uint8_t nbiterations = 0U;0 E7 S# V' U& n3 H
  53.         
    , i$ S0 a/ {2 E
  54.         if(ProgramType == ProgaraType_DATA16)4 T. A& X/ H" C0 S5 v
  55.                 nbiterations = 1U;0 U9 Q; n, p+ M) U$ m. t- y* \
  56.         else if(ProgramType == ProgaraType_DATA32)
    8 r- n$ c. O5 d. \. g7 t
  57.                 nbiterations = 2U;
    8 m$ f, Y6 N4 W4 d. r1 M
  58.         else
    ; m' _# ^- P, F! A
  59.                 nbiterations = 4U;
    " a' @3 i7 p4 v! C( J! E: N
  60.         for(index = 0U; index < nbiterations; index++)
    6 N& a" z& l! e# s
  61.         {
    # H( r; T7 \, u5 J0 @) Q
  62.                  LL_FLASH_Program_TwoBtye((flash_addr + (2U*index)), (uint16_t)(data >> (16U*index)));
    . j" R- g( ~' F! E# G. V% ]! s' P, F
  63.         }3 _3 |: `/ [. v  ^+ G6 f) F8 P$ k
  64.         : h) z& d+ i6 p( ]  i! U+ x) ^9 h" A, B
  65.         while (LL_FLASH_IsActiveFlag_BSY(FLASH))
    4 M$ S; p9 h1 U2 M4 G6 s
  66.         {* c2 K. e. y% l; b. N/ \4 K
  67.         }: t3 G% e! R' V& Z" k) Y
  68.         if (LL_FLASH_IsActiveFlag_EOP(FLASH))        
    # T& b8 _( u4 Y4 J3 R4 W/ G* s9 `
  69.         {7 D/ D1 V( _( A0 z! T; H
  70.                 LL_FLASH_ClearFlag_EOP(FLASH);
    ( p) B3 X, P) X' o$ u7 }$ i. r
  71.         }
    % H# i! n( T5 g& q4 M6 E$ H
  72.         else4 j' g- u) l8 H4 }; E" M
  73.         {
    % V, u, E. ?/ J
  74.                 return LL_ERROR;
    / O" {. d; ?. R" A, X0 c
  75.         }
    0 @- h- I! i. y4 R( `
  76.         LL_FLASH_DisenableProgram(FLASH);
    ) e2 i+ ]/ ]: o3 y) ]
  77.         return LL_OK;
    3 [. d: o5 K3 Q8 J# X$ I9 w( o1 k! ?
  78. }
    ( c$ e0 a9 h" t, c  [. L; j* t
复制代码

& X4 u2 U7 U, O- q6 W
% z, S: ^% O2 s: A: Q' E" |2 d
收藏 评论0 发布时间:2021-11-13 23:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版