[应用相关] 实战经验 | RT-Thread环境下Flash错误标志问题解析

[复制链接]
818|11
 楼主| STM新闻官 发表于 2025-4-20 01:08 | 显示全部楼层 |阅读模式
本帖最后由 STM新闻官 于 2025-4-20 01:10 编辑

885226803d87e1d579.png

1简介
客户在使用STM32G474RE进行产品开发的时候,操作系统软件使用了RT-Thread 5.0,同时由于要做ClassB认证,所以在RT-Thread系统上,移植了ClassB 2-3-0版本安全库。用户程序另外一个功能是固件升级,在调试固件升级程序的过程中,发现一旦执行了ClassB的启动自检,就会出现固件升级失败。调试发现,固件升级失败的原因是写Flash的时候发现Flash状态寄存器的错误标志被置位,导致Flash写操作失败。客户根据现此象反馈ClassB的自检代码有隐患,导致Flash出错。
本文分析了出现该错误的原因以及解决办法。
2问题描述
根据客户的问题反馈,我在NUCLEO-G474RE开发板上单独移植ClassB,通过调试,没有发现类似问题。为了复现该问题,从RT-Thread官方网站上下载了5.0版本的RT-Thread代码。RT-Thread对STM32的支持是相当友好的,代码中包含了对多数STM32开发板的支持,所以对于NUCLEO-G474RE开发板,只需要找到对应的目录,打开工程即可,如下图。

38906803d8b1c25f5.png

▲ 图1. RT-Thread工程目录
在上述工程下,直接添加ClassB的启动自检代码即可生成客户出现问题的软硬件环境。移植完ClassB的启动自检代码,通过NUCLEO-G474RE开发板调试发现,当执行启动自检,跳转到主函数之后,通过查看Flash的寄存器,发现Flash状态寄存器的PGAERR,PGSERR标志被置位,如下图所示。
212056803d8c31569b.png
图2. Flash错误标志
从RM0440参考手册上关于PGAERR和PGSERR的描述可知,这两个标志位只能由硬件置起,而且是由于写Flash才会导致该错误标志被置起,而在测试的代码中,并没有Flash的写操作,由于之前有发现Keil调试器导致G0出现的Flash错误标志的问题,刚开始也怀疑Keil调试器导致类似问题,实际测试发现该问题与调试器无关。
3问题分析与解决
结合参考手册对PGAERR以及PGSERR的描述,只能从写Flash的角度去分析问题产生的原因,最终通过单步调试,发现其中一句代码导致了该错误标志位的置起,如下图所示。
966786803d8d0d911d.png
▲ 图3. 错误代码
在SysTick_Handler中断服务程序中,调用了RT-Thread的函数rt_tick_increase,该函数中的变量thread为一个空指针,其地址为0x000000,在STM32G4中,该地址恰好映射为Flash的地址,从上面语句--thread->remaining_tick实际上产生了Flash写操作,所以最终导致了Flash的错误标志置位。
找到该问题原因之后,反馈给客户,客户在其板子上验证了同样的现象,所以该问题与ClassB的自检代码没有关系,而是由于指针变量没有赋值,导致指针指向的地址为Flash地址,如果此时对该指针变量进行赋值操作,就会产生Flash错误标志位被置位的现象。
4小结
在STM32软件开发中,不当的指针操作,尤其使用未经初始化的指针可能会引起莫名奇妙的问题,所以在使用指针变量的时候,需要注意指针地址的正确性。
▼▼▼

点击按钮下载《RT-Thread环境下Flash错误标志问题解析》原文档。点击下载
相关阅读






 楼主| STM新闻官 发表于 2025-4-20 01:11 | 显示全部楼层
xiaoqizi 发表于 2025-5-6 17:26 | 显示全部楼层
Flash芯片本身可能存在硬件故障,如存储单元损坏、引脚接触不良等
木木guainv 发表于 2025-5-6 19:42 | 显示全部楼层
需要检查Flash芯片的硬件连接是否正确,包括引脚是否虚焊、芯片是否正常供电等
Jiangxiaopi 发表于 2025-5-6 21:55 | 显示全部楼层
电源纹波过大、信号线受到电磁干扰等,都可能导致Flash读写数据出错
荣陶陶 发表于 2025-5-7 08:42 | 显示全部楼层
通过优化电路设计、增加滤波电容、采用屏蔽线等方式来减少干扰。同时,检查开发板的接地情况,确保接地良好,以避免地线反弹等问题对Flash操作产生影响
Zhiniaocun 发表于 2025-5-7 11:13 | 显示全部楼层
RT-Thread的Flash驱动需要进行正确的配置,包括Flash的起始地址、大小、扇区划分等
Zuocidian 发表于 2025-5-7 13:39 | 显示全部楼层
在进行Flash操作时,如果使用了未经初始化的指针或指针指向错误的地址,可能会导致对非法内存区域的访问,进而引发Flash错误标志
Puchou 发表于 2025-5-7 15:52 | 显示全部楼层
RT-Thread是一个多任务操作系统,如果多个任务同时对Flash进行操作,可能会导致资源竞争和数据不一致的问题,从而触发Flash错误标志
Xiashiqi 发表于 2025-5-7 18:31 | 显示全部楼层
如果使用了文件系统对Flash进行读写操作,文件系统的异常也可能导致Flash错误标志
小海师 发表于 2025-5-7 20:45 | 显示全部楼层
编译器的优化选项可能会影响代码的执行逻辑和内存访问方式,从而导致Flash错误标志的出现
Haizangwang 发表于 2025-5-7 23:03 | 显示全部楼层
确保所使用的RT-Thread版本是稳定且与硬件平台相匹配的,同时检查其他软件组件的兼容性
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1391

主题

1687

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部