//需要C语言基础
EEPROM
EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种可以通过电子手段实现擦除和编程的可读写存储器。简单来说,就是一种可以存储数据并且可以对数据进行修改的存储器。
EEPROM的工作原理类似于普通的存储器,但是有一点不同的是,它不需要外部的供电来保持数据的存储。当我们需要修改存储器中的数据时,可以通过传输电流来改变存储器中的电子状态,从而实现数据的修改。
相比于其他存储器,EEPROM具有可编程性和可擦除性的特点,也就是说我们可以随时修改存储器中的数据,而不需要更换存储器。这种特点使得EEPROM在很多应用中非常有用,比如在单片机中用于存储程序和数据。
STM32L071系列提供了高达6千字节的EEPROM,对EEPROM进行编程时采用在按字、半字或字节,可以页执行擦除操作。
代码工程
工程
为了看到效果,这次将LED的闪烁次数写到E2PROM中,因为系统是按照'字'来写入的,所以写入的地址必须是4的整数倍,否则会进入' hard fault '
*解锁函数*/
HAL_FLASHEX_DATAEEPROM_UnlockO; //解锁FLASHEX_DATAEEPROM/*锁定函数*/
HAL_FLASHEX DATAEEPROM_LockO:/*写操作函数*/
HAL_FLASHEx_DATAEEPROM_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data);//用来区分要写入的数据类型,取值为:FLASH_TYPEPROGRAM_BYTE(字节:8位),
FLASH_TYPEPROGRAM_HALFWORD(半字:16位),
FLASH_TYPEPROGRAM_WORD(字:32位)和FLASH_TYPEPROGRAM DOUBLEWORD(双字:64位)Address用来设置要写入数据的FLASHEX_DATAEEPROM地址Data写入的数据类型,这个参数默认是64位的,如果你要写入小于64位的数据比如16位,程序会进行类型转换
创建工程,初始化PA15引脚LED灯
代码
编写以下函数,EEPROM读取函数,将数据从地址读出并写到buffer中。
void EEPROM_Read(uint32_t addr,uint32_t *buffer,uint32_t length)
{
uint32_t *Whole_addr; //临时指针地址
HAL_FLASHEx_DATAEEPROM_Unlock(); //必须解锁
Whole_addr = (uint32_t *)(addr+DATA_EEPROM_BASE); //从起始地址按照4的整倍数写入
while(length--) //读取数据
{
*buffer++=*Whole_addr++;
}
HAL_FLASHEx_DATAEEPROM_Lock(); //锁定EEPROM
}
在main的初始化部分添加LED闪烁及闪烁次数写入EEPROM代码中,以下内容
uint32_t count[3]={0}; //数据缓冲数组
EEPROM_Read(0,count,1);//将数据读取到count中
count[0]++; //LED闪烁次数加一
HAL_FLASHEx_DATAEEPROM_Unlock();//必须解锁才能使用
//在EEPR0M地址4上写入count的值
//DATA EEPROM BASE(0x08080000UL)是FLASHEx DATAEEPROM的起始地址
HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD,DATA_EEPROM_BASE,count[0]);//
while(count[0]--)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(300);
}
到此,不断按复位键可以看到每一次重启后闪烁次数都会不断增多。
如果想要复位清除,请用
HAL_FLASH_Lock();//必须使用
HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError);//单页擦除
最后
距离比赛还有25天,加油