项目场景:
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)什么的值是保存在代码末尾的。
记录一下,谨防再犯。