你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G473 flash擦除时程序卡死

[复制链接]
lthuijoljnk 提问时间:2025-4-21 21:41 / 未解决

我在进行双bank升级的时候,会先进行FLASH的批量擦除。在连续的升级过程中发现成功几次后出现了执行擦除flash操作时程序卡死的情况,直观上看灯没有闪烁。成功次数不规律,可能更新2次后才卡死一次,也有更新4次、6次卡死的。我尝试在进行擦除之前关中断 __disable_irq();发现测试连续30次升级都没卡死,但没有找到根本原因。注:调用擦除bank的函数执行在CAN接收中断里的一个自定义函数中,有怀疑是进入了一些死循环中。

image.pngimage.png

image.png

之前怀疑过是上图的while循环,在擦除时有个等待的函数,使用了systick,如果再中断中执行,或者我使用了__disable_irq()会不会导致进不去systick中断,导致死循环超时不可用。但实际测试时好像没有影响

image.png
image.png
image.png
收藏 评论2 发布时间:2025-4-21 21:41

举报

2个回答
butterflyspring 回答时间:3 小时前
这个关闭中断会导致进不去systick 中断,这一点很容易验证。

如果程序正常逻辑不用到这个中断,那不会有什么问题,也就是说没有超时判断发生,标志位及时置位起来。

不过这样关闭中断不合适,使得某些函数失效,有特殊情况死循环发生。所以慎用。

可以考虑针对其他可能发生的中断进行关闭。注意最好是先关闭外设,再关闭内核的。

至于升级程序卡住,最好屏蔽其他无关功能后再测试分析哪些可能性,从你测试关闭中断上看,多半和某些时序有关。







xmshao 回答时间:2 小时前
从你的描述来看,问题跟中断处理强相关。问题终究只能结合你的具体代码确认问题症结。


我担心因为中断优先级方面问题,导致些访问互锁;或者中断的循环嵌套导致堆栈溢出进而程序崩溃;


临时地使用disableirq也不是不可以,但要清楚这只是临时关闭CPU端对中断请求的响应,外设端该申请中断的依然会申请,相关中断请求标志依然会出现,


等enableirq后会根据优先级高低依次处理;当然,如果在enableirq之前将可能出现的中断标志做个清零又是另外一回事。


另外,你调用disableirq后再做擦除操作,会永远检测不到超时,即会失去超时检测的意义;


建议将擦除操作放到主程序里来进行;

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版