硬汉嵌入式论坛

 找回密码
 立即注册
查看: 475|回复: 6
收起左侧

[技术讨论] STM32G473 FLASH擦除出现程序卡死的现象

[复制链接]

6

主题

13

回帖

31

积分

新手上路

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

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


下载.png

下载 (2).png

下载 (1).png


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-4-22 12:41:15 | 显示全部楼层
擦写Flash期间,开关中断非常有必要。虽然擦写间隙时可以执行程序的,但还是怕有影响。
回复

使用道具 举报

5

主题

157

回帖

172

积分

初级会员

积分
172
发表于 2025-4-22 16:03:34 | 显示全部楼层
使用DMA的方式写入就不怕了
回复

使用道具 举报

6

主题

13

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2025-4-23 18:25:51 | 显示全部楼层
2859932063 发表于 2025-4-22 16:03
使用DMA的方式写入就不怕了

主要是擦除,我发现写入是关了中断的,包括HAL库中的中的编程函数好像都进行了使能的。
回复

使用道具 举报

6

主题

13

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2025-4-23 18:47:36 | 显示全部楼层
这个问题已经找到原因了。

在进行FLASH擦除时从FLASH_FlushCaches函数里进入了中断。

这个函数进行了指令缓存的关闭和复位。
在程序卡死时可以通过仿真单步执行,当单步执行到开启指令缓存后就可以全速运行了。DMA通道中断太多了,升级多次就容易在这个点被打断导致程序卡死。目前通过关中断可以解决。但关闭中断,HAL库中用于等待超时的systick中断就无法实现了。
回复

使用道具 举报

6

主题

13

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2025-4-23 18:58:49 | 显示全部楼层
回复

使用道具 举报

0

主题

78

回帖

78

积分

初级会员

积分
78
发表于 2025-5-24 21:59:47 | 显示全部楼层
eric2013 发表于 2025-4-22 12:41
擦写Flash期间,开关中断非常有必要。虽然擦写间隙时可以执行程序的,但还是怕有影响。

对于stm32h7,操作片上flash的话,flash的内存需要配置吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 22:36 , Processed in 0.411067 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表