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

【经验分享】stm32 l0相关的eeprom

[复制链接]
STMCU小助手 发布时间:2021-11-18 22:00
   内部FLASH和EEPROM这种掉电后还能保存内容的内存统称为non-volatile memory(NVM),STM32L053内部有2K的EEPROM.7 p* }- H, y6 {
内部EEPROM的页大小为一个Word为单位,擦除是必须以页为单位,所以库函数里的擦除函数也是每次擦除4个字节:9 N1 E8 F" [+ I( n

8 U7 ^6 p9 |! ]' N; H. \+ H  n
  1. <p>/** </p><p>  * @brief  Erase a word in data memory. </p><p>  * @param  Address: specifies the address to be erased. </p><p>  * @note   To correctly run this function, the HAL_FLASHEx_DATAEEPROM_Unlock() function </p><p>  *         must be called before. </p><p>  *         Call the HAL_FLASHEx_DATAEEPROM_Lock() to the data EEPROM access </p><p>  *         and Flash program erase control register access(recommended to protect  </p><p>  *         the DATA_EEPROM against possible unwanted operation). </p><p>  * @retval HAL status </p><p>  */  </p><p>HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t Address)  </p><p>{  </p><p>  HAL_StatusTypeDef status = HAL_OK;  </p><p>    </p><p>  /* Check the parameters */  </p><p>  assert_param(IS_FLASH_DATA_ADDRESS(Address));  </p><p>    </p><p>  /* Wait for last operation to be completed */  </p><p>  status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);  </p><p>    </p><p>  if(status == HAL_OK)  </p><p>  {  </p><p>    /* Clean the error context */  </p><p>    ProcFlash.ErrorCode = HAL_FLASH_ERROR_NONE;  </p><p>  </p><p>    /* Write "00000000h" to valid address in the data memory" */  </p><p>      *(__IO uint32_t *) Address = 0x00000000;  </p><p>  </p><p>    status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);  </p><p>  }  </p><p>    </p><p>  return status;  </p><p>}    </p>
复制代码
8 p8 }- l- e$ D
写EEPROM的顺序和使用flash类似,要先解锁(UNLOCK) 才能写,写的时候可以字节、半字、字为单位都可以。
5 @  d$ ^- {: O& b* e, ?) R: O  o  A' p
写的时候可以不擦除,内部会自动擦除。需要注意的是写EEPROM会消耗固定的时间,所以需要在程序对时间要求严格时; M) P) z) ^# f" e

( t7 d$ P9 ^# w2 {+ p正确安排写EEPROM的时机。
# o0 u% Y. A- U  a$ W* Y; T5 l2 ]5 E# F" Y* W4 S
写EEPROM的函数如下:1 j1 O# w3 W8 s- ^6 b0 E6 b
# J2 ^6 l+ D9 A
  1. <p>void EEPROM_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)  </p><p>{  </p><p>    uint16_t t;  </p><p>    HAL_FLASHEx_DATAEEPROM_Unlock();      </p><p>    for(t = 0;t < NumToWrite;t++)  </p><p>    {  </p><p>        HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE,DATA_EEPROM_BASE + WriteAddr + t,*(pBuffer + t));  </p><p>    }  </p><p>    HAL_FLASHEx_DATAEEPROM_Lock();  </p><p>}  </p>
复制代码
- N# _. N" L' v9 V* ]* C
main函数里面先写EEPROM,然后再读出来验证是否和写一样,一样的话点亮LED:1 W2 ]* Q' N# ~( F2 b$ }, n

+ |* s5 |7 y( Q9 v, x; ]! Q
  1. <p>#include "main.h"  </p><p>uint8_t Test[25] = "http://www.eepw.com.cn/";  </p><p>uint8_t Buff[25];  </p><p>int main(void)  </p><p>{  </p><p>    uint8_t res;  </p><p>    HAL_Init();  </p><p>    SystemClock_Config();  </p><p>    LED_Init();  </p><p>    EEPROM_Write(0,Test,25);  </p><p>    EEPROM_Read(0,Buff,25);  </p><p>    res = strcmp((const char*)Buff,(const char*)Test);  </p><p>    if(0 == res)  </p><p>    {  </p><p>        while(1)  </p><p>        {     </p><p>            HAL_Delay(500);  </p><p>            LED_TOG;              </p><p>        }  </p><p>  }  </p><p>}  </p><p></p>
复制代码
" ]) P0 g9 O+ D0 Z& f$ r2 N

) U' e: `' z' N- J7 @4 m; _% g
赞 收藏 评论0 发布时间:2021-11-18 22:00

举报

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