STM32实现掉电保存多个数据
本篇文章的具体内容:
1. 初步认识Flash
2. Flash写入多个数
3. 读取Flash中存储的数值
一、初步认识FLASH
如果想要实现掉电存储,首要的任务就是找到一个地方可以存放这些数据,当这些数据发生改变的时候,把数据存放进去,并且保证上电后不会被擦除。这么一来,等在次上电之后,通过读取掉电前存储的数据,实现掉电存储功能。
可以存放数据的地方可分为在两种片上flash和片外flash,常见的片上闪存有EEPROM,片外的存储芯片有W25QXXX。本篇文章使用的是直接在FLASH中存储。根据不同的芯片类型,闪存的大小都是不一样的。如下图(其他博客截取来的):
主控芯片的内存一般可分为8块:存放初始化程序的固化部分、数据段、代码段、堆空间、栈空间等。掉电存储数据的地方在第0块中的某个位置(0X0800 0000 ~0X0808 0000,这个的大小对应芯片闪存大小)只要存放的数据不超出这个范围,一切都好说。
二、FLASH写入数据
通过对上面的了解,大概知道了存放的位置。之后就可以向这个位置里面为所欲为啦?当然不是。下面以STM32标准库为例,你需要在工程里面加入stm32f10x_flash.c文件,这个文件抱恨了很多对flash操作的方法,我们只需要调用这些方法才可以为所欲为。(膜拜驱动大佬)。
怎么实现为所欲为呢?一般有两种:读和写。
写入:检查状态–>解锁–>擦除–>写入–>上锁–>完事。
读取:解锁–>读取–>上锁–>完事。
/*
功能:向flash中写入数据
参数:addr:地址 flashdata1:写入的数据 len:写入长度
返回值:
*/
void FLASH_WriteByte(u32 addr ,uint64_t *flashdata1,uint8_t len)
{
int i = 0;
FLASH_Status FLASHstatus = FLASH_COMPLETE;
FLASH_Unlock(); //解锁flash
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR); //清除标志位
FLASHstatus=FLASH_ErasePage(addr); //擦除指定地址页
for(i=0; i<len;i++)
{
FLASHstatus=FLASH_ProgramHalfWord(addr+i*4, flashdata1[i]);//从指定的地址写入数据
}
FLASH_Lock();//上锁
}
有了这个函数之后,在封装一个函数,把想要存储的变量数据对应放到一个数组里面,然后将整一个数组写到flash中,实现最终的写入功能。
三、读取FLASH中存储的数据
通过上面的写入函数,就可以把数据写入到flash中了,之后找到同一个地址,将数据读取出来,读取的长度和写进去的长度一致,之后将数据存到一个数组当中,再将数组的值对应赋值给保存进来的时的变量,就可以实现读取功能。
/*
功能:读取FLASH中指定地址的值
参数:addr:起始地址 len:读取的长度
返回值:无
*/
void Read_Flash(uint32_t addr,uint8_t len)
{
uint64_t NEW_ParArry[13] = {0};
u8 i=0;
uint64_t rdata = 0;
FLASH_Unlock();//解锁flash
for(i=0;i<len;i++)
{
NEW_ParArry[i] = *(u16 *)(addr + i*4); //读取flash地址中的值
}
FLASH_Lock();//上锁
/*********** 重新赋值给变量 ********/
S_num = NEW_ParArry[0];
F_num = NEW_ParArry[1];
R_num = NEW_ParArry[2];
total = NEW_ParArry[3];
I_reg = NEW_ParArry[4];
VL_reg = NEW_ParArry[5];
VH_reg = NEW_ParArry[6];
T_reg = NEW_ParArry[7];
line1 = NEW_ParArry[8];
line2 = NEW_ParArry[9];
line3 = NEW_ParArry[10];
line4 = NEW_ParArry[11];
line5 = NEW_ParArry[12];
}
最后,只需要在主程序中的适当位置,调用闪存写入函数(一般是当数据发生改变时写入)。但尽量减少写入的次数,flash的读写次数在十万次左右。
STM32实现掉电保存功能的详细工程
点击即可跳转下载。
https://download.csdn.net/download/janson_24/12629396