HAL_Deleay() 函数 导致程序卡死

项目场景:

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)什么的值是保存在代码末尾的。

记录一下,谨防再犯。