项目场景:
STM32F031F6想要实现掉电数据不丢失,将数据保存在flash后几页
问题描述
提示:这里描述项目中遇到的问题:
/************************
函数名: Write_Flash
传 参: @addr :写入Flash的地址
@Data :写入地址的数据,16位
功 能: 将数据写入Flash以保证数据可以掉电保存
返回值: 无
************************/
void Write_Flash(int addr, unsigned int Data)
{
HAL_FLASH_Unlock(); //解锁
FLASH_EraseInitTypeDef Erase_Init_Struct;
Erase_Init_Struct.TypeErase = FLASH_TYPEERASE_PAGES;
Erase_Init_Struct.PageAddress = addr;
Erase_Init_Struct.NbPages = 1;
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&Erase_Init_Struct, &PageError); //擦除数据
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr,Data); //写入数据
HAL_FLASH_Lock(); //上锁
}
使用HAL库函数将数据存储在FLASH里的指定位置。
一开始是可以正常工作、存储的。
后面继续添加其他内容,下载后初次运行时正常的,但只要复位一下,程序就卡在了HAL_Deleay() 函数,
但串口还是正常的
上网查了下原因,可能是中断优先级不够,加了HAL_NVIC_SetPriority之后还是一样。
原因分析:
—最后发现是代码量越来越大,渐渐靠近我设定的FLASH的写入地址,当存储我的数据时,HAL_FLASHEx_Erase页擦除连带着代码数据的末尾部分一起擦除了。
解决方案:
没有找到其他可用的地址,于是直接将地址改为FLASH最后,保证2KB的距离,就不会出现卡死的问题了。
具体原因不清楚,猜测是(HAL_GetTick() - tickstart)什么的值是保存在代码末尾的。
记录一下,谨防再犯。