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

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

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

LL库的特色,就是一个函数,只占用一个指令周期,比如,设置GPIO输出的状态,就是LL_GPIO_SetOutputPin();
  1. __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask)
  2. {
  3.   WRITE_REG(GPIOx->BSRR, PinMask);
  4. }
复制代码
于是我根据这种风格,已经常用的操作写了一个.h和.c文件

头文件代码
  1. #ifndef __STM32F0xx_LL_FLASH_EX_H
  2. #define __STM32F0xx_LL_FLASH_EX_H

  3. #include "stm32f0xx.h"


  4. #define FLASH_FLAG_BSY             FLASH_SR_BSY            /*!< FLASH Busy flag                           */
  5. #define FLASH_FLAG_PGERR           FLASH_SR_PGERR          /*!< FLASH Programming error flag    */
  6. #define FLASH_FLAG_WRPERR          FLASH_SR_WRPERR         /*!< FLASH Write protected error flag          */
  7. #define FLASH_FLAG_EOP             FLASH_SR_EOP            /*!< FLASH End of Operation flag               */

  8. #define FLASH_TYPEERASE_PAGES          FLASH_CR_PER         /*!< FLASH_CR_PER          */
  9. #define FLASH_TYPEERASE_MASSERASE      FLASH_CR_MER            /*!< MASSERASE              */


  10. #if defined(STM32F030x6) || defined(STM32F030x8) || defined(STM32F031x6) || defined(STM32F038xx) \
  11. || defined(STM32F051x8) || defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F058xx) || defined(STM32F070x6)
  12. #define FLASH_PAGE_SIZE          0x400U
  13. #endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F051x8 || STM32F042x6 || STM32F048xx || STM32F058xx || STM32F070x6 */

  14. #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F070xB) \
  15. || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC)
  16. #define FLASH_PAGE_SIZE          0x800U
  17. #endif /* STM32F071xB || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx || STM32F030xC */

  18. typedef enum {
  19.         ProgaraType_DATA64,
  20.         ProgaraType_DATA32,
  21.         ProgaraType_DATA16
  22. }ProgaramDataType;

  23. typedef enum {\
  24.         FLASH_Lock=1U,Flash_Unlock=!FLASH_Lock\
  25. }FlashStates;

  26.   /* Set the OBL_Launch bit to launch the option byte loading */
  27. __STATIC_INLINE void LL_FLASH_SET_OBL_Launch(FLASH_TypeDef *FLASHx)
  28. {
  29.   SET_BIT(FLASHx->CR, FLASH_CR_OBL_LAUNCH);
  30. }
  31. __STATIC_INLINE void LL_FLASH_Lock(FLASH_TypeDef *FLASHx)
  32. {
  33.   SET_BIT(FLASHx->CR, FLASH_CR_LOCK);
  34. }


  35.   /* @brief  Set flash erase type.
  36.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.
  37.   *          This parameter can be any combination of the following values:
  38.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase
  39.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag
  40.   * @retval none*/

  41. __STATIC_INLINE void LL_FLASH_SetTypeErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)
  42. {
  43.   SET_BIT(FLASHx->CR, FLASH_TYPEERASE);
  44. }
  45.   /* @brief  Set flash erase ADDR.
  46.   *          This parameter can be any combination of the following values:
  47.   *            @arg @ref EraseADDR         uint32_t value
  48.   * @retval none*/

  49. __STATIC_INLINE void LL_FLASH_SetEraseADDR(FLASH_TypeDef *FLASHx,uint32_t EraseADDR)
  50. {
  51.   WRITE_REG(FLASHx->AR, EraseADDR);
  52. }
  53.   /* @brief  Set flash erase ADDR.
  54.   *          This parameter can be any combination of the following values:
  55.   *            @arg @ref EraseADDR         uint32_t value
  56.   * @retval none*/

  57. __STATIC_INLINE void LL_FLASH_StartErase(FLASH_TypeDef *FLASHx)
  58. {
  59.   SET_BIT(FLASHx->CR, FLASH_CR_STRT);
  60. }

  61.   /* @brief  Clear the specified FLASH flag.
  62.   * @param  __FLAG__ specifies the FLASH flags to clear.
  63.   *          This parameter can be any combination of the following values:
  64.   *            @arg @ref FLASH_FLAG_EOP         FLASH End of Operation flag
  65.   *            @arg @ref FLASH_FLAG_WRPERR      FLASH Write protected error flag
  66.   *            @arg @ref FLASH_FLAG_PGERR       FLASH Programming error flag
  67.   * @retval none*/

  68. __STATIC_INLINE void LL_FLASH_ClearFlag(FLASH_TypeDef *FLASHx,uint32_t STATE_FLAG)
  69. {
  70.   WRITE_REG(FLASHx->SR, STATE_FLAG);
  71. }

  72.   /*get bit flash bsy*/
  73. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_BSY(FLASH_TypeDef *FLASHx)
  74. {
  75.   return (READ_BIT(FLASHx->SR, FLASH_SR_BSY) == (FLASH_SR_BSY));
  76. }
  77. /*get end of operation bilt*/
  78. __STATIC_INLINE uint32_t LL_FLASH_IsActiveFlag_EOP(FLASH_TypeDef *FLASHx)
  79. {
  80.   return (READ_BIT(FLASHx->SR, FLASH_SR_EOP) == (FLASH_SR_EOP));
  81. }
  82. /*clear end of operation bilt*/
  83. __STATIC_INLINE void LL_FLASH_ClearFlag_EOP(FLASH_TypeDef *FLASHx)
  84. {
  85.   SET_BIT(FLASHx->SR, FLASH_SR_EOP);//EOP bit Set clear
  86. }
  87.   /* @brief  Set flash erase type.
  88.   * @param  FLASH_TYPEERASE specifies the FLASH flags to clear.
  89.   *          This parameter can be any combination of the following values:
  90.   *            @arg @ref FLASH_TYPEERASE_PAGES         PAGES Erase
  91.   *            @arg @ref FLASH_TYPEERASE_MASSERASE      FLASH Write protected error flag
  92.   * @retval none*/
  93. __STATIC_INLINE void LL_FLASH_DisenableErase(FLASH_TypeDef *FLASHx,uint32_t FLASH_TYPEERASE)
  94. {
  95.   CLEAR_BIT(FLASHx->CR, FLASH_TYPEERASE);
  96. }

  97. /*EnableProgram*/
  98. __STATIC_INLINE void LL_FLASH_EnableProgram(FLASH_TypeDef *FLASHx)
  99. {
  100.   SET_BIT(FLASHx->CR,FLASH_CR_PG);
  101. }
  102. /*DisenableProgram*/
  103. __STATIC_INLINE void LL_FLASH_DisenableProgram(FLASH_TypeDef *FLASHx)
  104. {
  105.   CLEAR_BIT(FLASHx->CR,FLASH_CR_PG);
  106. }
  107. /*read flash's states of lock or unlock*/
  108. __STATIC_INLINE FlashStates LL_FLASH_LockState(FLASH_TypeDef *FLASHx)
  109. {
  110.         return (FlashStates)(READ_BIT(FLASHx->CR,FLASH_CR_LOCK));
  111. }
  112. /*set key for flash*/
  113. __STATIC_INLINE void LL_FLASh_SetKey(FLASH_TypeDef *FLASHx,uint32_t key)
  114. {
  115.         WRITE_REG(FLASH->KEYR,key);
  116. }


  117. LL_StatusTypeDef LL_Flash_Unlock(void);
  118. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t NbPages);
  119. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data);
  120. #endif
复制代码

C文件代码
  1. #include "stm32f0xx_ll_flash_ex.h"


  2. void static LL_FLASH_Program_TwoBtye(uint32_t flash_addr,uint16_t data)
  3. {
  4.         LL_FLASH_EnableProgram(FLASH);
  5.         *(__IO uint16_t*)(flash_addr) = data;
  6. }

  7. LL_StatusTypeDef LL_Flash_Unlock(void)
  8. {
  9.         while (LL_FLASH_IsActiveFlag_BSY(FLASH))  
  10.         {
  11.         }
  12.         if (LL_FLASH_LockState(FLASH))
  13.         {
  14.                 LL_FLASh_SetKey(FLASH,FLASH_KEY1);
  15.                 LL_FLASh_SetKey(FLASH,FLASH_KEY2);
  16.         }
  17.         return LL_OK;
  18. }

  19. LL_StatusTypeDef LL_Flash_PageErase(uint32_t page_addr,uint16_t Nb)
  20. {
  21.         uint32_t End_addr =  10* FLASH_PAGE_SIZE +page_addr;
  22.         uint32_t Start_addr = page_addr;
  23.         for(;Start_addr < End_addr;(Start_addr += FLASH_PAGE_SIZE))
  24.     {
  25.         LL_FLASH_SetTypeErase(FLASH,FLASH_TYPEERASE_PAGES);
  26.                 LL_FLASH_SetEraseADDR(FLASH,Start_addr);
  27.                 LL_FLASH_StartErase(FLASH);
  28.                 while (LL_FLASH_IsActiveFlag_BSY(FLASH))
  29.                 {
  30.                 }
  31.                 if (LL_FLASH_IsActiveFlag_EOP(FLASH))
  32.                 {
  33.                         LL_FLASH_ClearFlag_EOP(FLASH);;
  34.                 }
  35.                 else
  36.                 {
  37.                         return LL_ERROR;
  38.                 }
  39.                 LL_FLASH_DisenableErase(FLASH,FLASH_TYPEERASE_PAGES);
  40.     }
  41.         return LL_OK;
  42. }

  43. LL_StatusTypeDef LL_FLASH_Program(ProgaramDataType ProgramType,uint32_t flash_addr,uint64_t data)
  44. {
  45.         
  46.         uint8_t index = 0U;
  47.         uint8_t nbiterations = 0U;
  48.         
  49.         if(ProgramType == ProgaraType_DATA16)
  50.                 nbiterations = 1U;
  51.         else if(ProgramType == ProgaraType_DATA32)
  52.                 nbiterations = 2U;
  53.         else
  54.                 nbiterations = 4U;
  55.         for(index = 0U; index < nbiterations; index++)
  56.         {
  57.                  LL_FLASH_Program_TwoBtye((flash_addr + (2U*index)), (uint16_t)(data >> (16U*index)));
  58.         }
  59.         
  60.         while (LL_FLASH_IsActiveFlag_BSY(FLASH))
  61.         {
  62.         }
  63.         if (LL_FLASH_IsActiveFlag_EOP(FLASH))        
  64.         {
  65.                 LL_FLASH_ClearFlag_EOP(FLASH);
  66.         }
  67.         else
  68.         {
  69.                 return LL_ERROR;
  70.         }
  71.         LL_FLASH_DisenableProgram(FLASH);
  72.         return LL_OK;
  73. }
复制代码


收藏 评论0 发布时间:2021-11-13 23:00

举报

0个回答

所属标签

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