使用cubemx生成的模板实现IAP升级时失败,调试发现NVIC_SystemReset()被优化掉,将优化等级调到level0后才能运行这条函数
另外,NVIC_SystemReset()会通过设置SYSRESETREQ位触发复位,但在触发到实际复位之间存在延迟。如果此期间有中断发生,可能导致复位失败。
解决方法:在调用NVIC_SystemReset()前,使用__set_FAULTMASK(1)关闭所有中断,确保复位过程不被打断。
__set_FAULTMASK(1); // 禁用所有中断
NVIC_SystemReset(); // 执行复位