关于STM32中调用 HAL_FLASHEx_Erase 扇区擦除后发生 HardFault_Handler 的问题

标题中提及的对象是Flash扇区擦除,而实际上引起 HardFault_Handler 的是栈溢出。我直接在函数中创建了一个 uint32_t 类型的数组且数目为256个(1024字节),而程序中设定的堆栈却只有0x400(1024字节,这个可以在startup_stm32XXXX.s启动文件查找并修改),包包栈溢出的!但是这个排查却耗费了我不少时间,因为我的关注点就是如标题所示。下面贴一段案发现场代码:

void flash_debug(void){
    uint32_t buf[256] = {0};
	flash_erase(APP1_ADDR, 1);
}

在出现了 HardFault_Handler 后,我进行单步调试,发现程序是在 flash_erase -> HAL_FLASHEx_Erase -> FLASH_WaitForLastOperation -> FLASH_SetErrorCode -> return HAL_ERROR; 这个流程后进入的 HardFault_Handler ,于是才以为是Flash程序哪里出了问题。回想起之前调用LVGL也是因为栈溢出导致的 HardFault_Handler ,以后出现了HardFault_Handler还是第一时间看一下有没有栈溢出……

栈溢出后,重定向到串口的printf也打印不出东西了,难怪添加在HardFault_Handler中的printf打印不出东西……原来是弄OTA升级的,测试着从一块flash内存读出程序数据再写到另一块flash内存,竟然有各种问题(什么读出来的和内存中不一样、写入后和原先读出来的不一样,什么“注释掉这个无关的代码又好了”),问题也由此发现了栈溢出这一问题。

posted on 2025-10-26 16:54  fhbui  阅读(116)  评论(0)    收藏  举报