
项目场景:
通过STM32 cubeMX创建程序后,把以前的flash驱动、UART等移植,实现产品相关功能。
问题描述
flash驱动移植后,程序在运行到FLASH_Read()函数时会进入到HardFault_Handler()硬件死循环中,而且单步运行发现该if(upgrade_finesh_flag == 0x5a5a) 条件可以进入。问题走向很明显编译环境出现了问题。
void InitDevice(void)
{
__IO uint32_t upgrade_flag = 0;
__IO uint32_t upgrade_finesh_flag = 0;
HAL_FLASH_Unlock();
upgrade_flag = *(__IO uint32_t*)UPDATE_FLAG_ADDR;
upgrade_finesh_flag = *(__IO uint32_t*)UPDATE_FINISH_FLAG_ADDR;
if (upgrade_flag == 0xa5a5)
{
FLASH_PageErase(UPDATE_FLAG_ADDR);
}
if(upgrade_finesh_flag == 0x5a5a) //判断是否进行软件升级
{
FLASH_PageErase(UPDATE_FINISH_FLAG_ADDR);
osDelay(500);
__disable_fault_irq();
NVIC_SystemReset();
}
osDelay(500);
deviceInitSM = GET_RS485_BAUD;
init_read_only_data();
FLASH_Read(SERNUMBER_ADDR,&st_FactoryData.SerNumber,sizeof(st_FactoryData.SerNumber));
FLASH_Read(FACTORYADDR_ADDR,&st_FactoryData.address,sizeof(st_FactoryData.address));
FLASH_Read(MANUFACDAY_ADDR,&st_FactoryData.Manufacday,sizeof

在STM32项目中,将旧代码移植后遇到在执行FLASH_Read()函数时触发HardFault_Handler的问题。分析发现是由于编译优化导致的,原来代码使用的是-O0优化级别,而新代码可能使用了更高级别的优化。优化等级越高,虽然代码体积减小,但可能影响调试信息和代码逻辑。解决方案是将优化级别调整为-O0,以保持与未移植代码一致的调试友好性和代码逻辑。经过测试,建议使用-O0优化等级进行编译。
最低0.47元/天 解锁文章
5913

被折叠的 条评论
为什么被折叠?



