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

【经验分享】STM32L0 内部EEPROM写读

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 内部EEPROM写读
说明
STM32L0内部的EEPROM写操作由解锁,写入,加锁过程组成,读过程则无需解锁。至于STM32L0内部的非易失空间区分为FLASH和EEPROM,主要体现在用ST-LINK等工具进行整片擦除时,只擦除FLASH的空间,EEPROM的部分不会被擦除,如同外部EEPROM芯片,MPU的代码升级不影响EEPROM的内容。后面以内部EEPROM的写读作为范例。

基础写读函数
定义内部EEPROM的地址空间:
  1. //STM32L031K6T6
  2. #define EEPROM_BASE_ADDR        0x08080000
  3. #define EEPROM_BYTE_SIZE        0x03FF
复制代码

基础字节写函数
  1. //Byte write
  2. void EEPROM_WRITE(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
  3. {
  4.         uint16_t i;
  5.         HAL_StatusTypeDef status = HAL_OK;

  6.         HAL_FLASHEx_DATAEEPROM_Unlock();
  7.         for(i=0;i<len;i++)
  8.         {
  9.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
  10.                 Data++;
  11.         }
  12.         HAL_FLASHEx_DATAEEPROM_Lock();
  13. }
复制代码

基础字节读函数
  1. <span style="background-color: rgb(255, 255, 255);">/</span>/Byte read
  2. void EEPROM_READ(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
  3. {
  4.         uint8_t *wAddr;
  5.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
  6.         while(Len--)
  7.         {
  8.                 *Buffer++=*wAddr++;
  9.         }
  10. }
复制代码

带校验写读函数
如果考虑到写读过程中,可以出现错误的情况,为了保证操作的正确性,需要采用校验方式进行写读。
对于写过程,需要将写入的数据,读回做比较。
对于读过程,需要将两次读回的数据,进行比较。
如果比较正确,则操作完成。
如果错误,可重新进行写或读操作,并在设定的重新操作次数范围内,进行重新操作识别,如果正确,则报告正确,如果错误,则报告错误。

设定重复校验次数
  1. #include <string.h>
  2. #define iEEPROM_CHECK_NUM 2
复制代码


带操作校验的写函数
  1. HAL_StatusTypeDef EEPROM_WRITE_W_CHECK(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
  2. {
  3.         uint8_t buff[len];
  4.         uint16_t i;
  5.         for (i=0;i<iEEPROM_CHECK_NUM;i++)
  6.         {
  7.                 EEPROM_WRITE(BiasAddress, Data, len);
  8.                 EEPROM_READ(BiasAddress, buff, len);
  9.                 if (memcmp(Data, buff, len)==0)
  10.                 {
  11.                         return HAL_OK;
  12.                 }
  13.         }

  14.         return HAL_ERROR;
  15. }
复制代码

带操作校验的读函数
  1. HAL_StatusTypeDef EEPROM_Read_W_CHECK(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
  2. {
  3.         uint8_t buff0[len];
  4.         uint8_t buff1[len];
  5.         uint16_t i;
  6.         for (i=0;i<iEEPROM_CHECK_NUM;i++)
  7.         {
  8.                 EEPROM_READ(BiasAddress, buff0, len);
  9.                 EEPROM_READ(BiasAddress, buff1, len);

  10.                 if (memcmp(buff0, buff1, len)==0)
  11.                 {
  12.                         memcpy(Data, buff0, len);
  13.                         return HAL_OK;
  14.                 }
  15.         }

  16.         return HAL_ERROR;
  17. }
复制代码

其中BiasAddress为0对应内部EEPROM的0地址(EEPROM_BASE_ADDR定义了其基址),Data为数据字节指针,len为操作字节长度。

需要注意的是,基于工艺制程和设计,EEPROM的使用也分为两种,其中一种和FRAM相似,可以直接进行写入而不需要提前擦除,STM32内部的EEPROM也是这一种;另外一种和FLASH相似,需要先进行基于Page的擦除后才能正确写入,对于有的EEPROM,支持基于Page最小为Byte单元的擦除。

HAL提供的内部EEPROM擦除函数, 只是进行一个word的擦除,即在某个地址上将数据改写为0x00000000, 和直接调用写函数在该地址写入0x00000000效果一样。HAL的内部EEPROM擦除函数如下:

  1. /**
  2.   * @brief  Erase a word in data memory.
  3.   * @param  Address specifies the address to be erased.
  4.   * @note   To correctly run this function, the @ref HAL_FLASHEx_DATAEEPROM_Unlock() function
  5.   *         must be called before.
  6.   *         Call the @ref HAL_FLASHEx_DATAEEPROM_Lock() to the data EEPROM access
  7.   *         and Flash program erase control register access(recommended to protect
  8.   *         the DATA_EEPROM against possible unwanted operation).
  9.   * @retval HAL_StatusTypeDef HAL Status
  10.   */
  11. HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t Address)
  12. {
  13.   HAL_StatusTypeDef status = HAL_OK;

  14.   /* Check the parameters */
  15.   assert_param(IS_FLASH_DATA_ADDRESS(Address));

  16.   /* Wait for last operation to be completed */
  17.   status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);

  18.   if(status == HAL_OK)
  19.   {
  20.     /* Clean the error context */
  21.     pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;

  22.       /* Write 00000000h to valid address in the data memory */
  23.       *(__IO uint32_t *) Address = 0x00000000U;

  24.     status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
  25.   }

  26.   /* Return the erase status */
  27.   return status;
  28. }  
复制代码

上述的代码,如果要用于STM32内部FLASH的操作,还需要增加页擦除操作。


收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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