硬件平台STM32F407VE,HAL库。标准库不会有此问题
软件跑freertos
问题描述:STM32 擦除flash失败,CPU跳不出串口中断,看门狗重启。
问题一、FlashStatus!=HAL_OK解决办法:
1、flash擦写前禁止flash数据缓存,操作完后恢复
/* Disable data cache */
__HAL_FLASH_DATA_CACHE_DISABLE();//FLASH操作期间,必须禁止数据缓存
/* Enable data cache */
__HAL_FLASH_DATA_CACHE_ENABLE();//开启数据缓存
2、如果上述办法还不行可以在操作flash前增加清标志操作
/* Clear pending flags (if any) */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
3、看门狗影响
操作flash期间不要调用HAL_IWDG_Refresh(&hiwdg);
并且看门狗未开启或者屏蔽MX_IWDG_Init();的初始化
软件最好不调用HAL_IWDG_Refresh(&hiwdg);
单次擦除失败(返回非HAL_OK),延时后再次尝试擦除
问题二:擦除flash失败,死机问题
我用了串口空闲中断+DMA接收、发送模式
软件仿真发现很容易在擦flash的时候CPU频繁进入串口中断(其他任务无法进入),最后复位
关键问题是:
HAL_UART_IRQHandler(&huart2);必须在中断里优先执行,放在最前端,不能放在用户程序以后。
如果不用flash擦写,顺序其实关系不大。
可能跟芯片也有关系(之前用F429就没这个问题)