内部FLASH和EEPROM这种掉电后还能保存内容的内存统称为non-volatile memory(NVM),STM32L053内部有2K的EEPROM.
内部EEPROM的页大小为一个Word为单位,擦除是必须以页为单位,所以库函数里的擦除函数也是每次擦除4个字节:
view plaincopy to clipboardprint?
/**
* @brief Erase a word in data memory.
* @param Address: specifies the address to be erased.
* @note To correctly run this function, the HAL_FLASHEx_DATAEEPROM_Unlock() function
* must be called before.
* Call the HAL_FLASHEx_DATAEEPROM_Lock() to the data EEPROM access
* and Flash program erase control register access(recommended to protect
* the DATA_EEPROM against possible unwanted operation).
* @retval HAL status
*/
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t Address)
{
HAL_StatusTypeDef status = HAL_OK;
/* Check the parameters */
assert_param(IS_FLASH_DATA_ADDRESS(Address));
/* Wait for last operation to be completed */
status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
if(status == HAL_OK)
{
/* Clean the error context */
ProcFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
/* Write "00000000h" to valid address in the data memory" */
*(__IO uint32_t *) Address = 0x00000000;
status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
}
return status;
}
写EEPROM的顺序和使用flash类似,要先解锁(UNLOCK) 才能写,写的时候可以字节、半字、字为单位都可以。
写的时候可以不擦除,内部会自动擦除。需要注意的是写EEPROM会消耗固定的时间,所以需要在程序对时间要求严格时
正确安排写EEPROM的时机。
写EEPROM的函数如下:
void EEPROM_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
{
uint16_t t;
HAL_FLASHEx_DATAEEPROM_Unlock();
for(t = 0;t < NumToWrite;t++)
{
HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE,DATA_EEPROM_BASE + WriteAddr + t,*(pBuffer + t));
}
HAL_FLASHEx_DATAEEPROM_Lock();
}
main函数里面先写EEPROM,然后再读出来验证是否和写一样,一样的话点亮LED:
#include "main.h"
uint8_t Test[25] = "http://www.eepw.com.cn/";
uint8_t Buff[25];
int main(void)
{
uint8_t res;
HAL_Init();
SystemClock_Config();
LED_Init();
EEPROM_Write(0,Test,25);
EEPROM_Read(0,Buff,25);
res = strcmp((const char*)Buff,(const char*)Test);
if(0 == res)
{
while(1)
{
HAL_Delay(500);
LED_TOG;
}
}
}
上一篇:STM32——EEPROM
下一篇:STM32系统保存参数到eeprom的实现方法
设计资源 培训 开发板 精华推荐
- 用于仪表的 5V 模拟放大器
- LT1172HVCT、-12/1.25A 正负降压-升压转换器的典型应用
- 使用 ColdFire MCF5208 拆分总线架构的系统设计,适用于 2.5V、16 位 DDR SDRAM 系统
- USB-KW41Z: Bluetooth Low Energy/IEEE® 802.15.4数据包嗅探器/USB Dongle
- ZR431GTA 可调精密齐纳并联稳压器的典型应用
- LTC3621HMS8E-23.3 2.5V Vout 和 400mA 突发钳位、fSW = 1MHz 同步降压稳压器的典型应用
- LT1676、宽输入范围、高效率、降压型开关稳压器
- 多云端物联网平台
- AM2G-4818SZ 18V 2 瓦 DC/DC 转换器的典型应用
- 用于消费电子产品的 65W、19V 交流转直流单输出电源