今天跑程序发现在FLASH读写过程中程序会跑死并跳转至HardFault_Handler
,在网上查阅资料说有可能是首地址没有对齐4字节的问题,不过我stm32应该不存在这个问题,于是我打算改变一下读写宽度试试:
我之前用的是双字写入和读取,先将写入函数改为单字模式:FLASH_TYPEPROGRAM_DOUBLEWORD
改为FLASH_TYPEPROGRAM_WORD
,再将偏移量改为4,所有的uint64_t
改为uint32_t
,下面是修改后的读写函数。
uint8_t FLASH_EEPROM_Write(void)
{
uint8_t state;
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
eraseFlash();
HAL_FLASH_Unlock();
for(uint8_t i = 0;i < sizeof(SysStatus);i+=4)
{
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_BASE_ADDR+i,*((__IO uint32_t*)(&SysStatus.LockState[0]+i)))!= HAL_OK)//这里的数据由于是结构体,需要从里面取值,一定要以第一个成员的地址开始偏移,不能使用结构体自身的地址来偏移,否则数据会出错
{
HAL_FLASH_Lock();
state = 1;//write success
}
else
{
HAL_FLASH_Lock();
state = 2;//write fault
}
}
HAL_FLASH_Lock();
return state;
}
void FLASH_EEPROM_Read(void)
{
for(uint8_t i = 0;i<sizeof(SysStatus);i+=4)
{
*((uint32_t *)(&SysStatus.LockState[0]+i)) = *(__IO uint32_t*)(FLASH_BASE_ADDR + i);//注意赋值的左边,必须要用结构体第一个成员的地址来偏移,双字偏移量是8
}
}
经测试问题解决,毕竟stm32是32位处理器,可能处理64位数据可能会有问题。具体的问题原因之后如果有时间细究会更新上来。