简介
客户在使用 STM32G474RE 进行产品开发的时候,操作系统软件使用了 RT-Thread5.0,同时由于要做 ClassB 认证,所以在 RT-Thread 系统上,移植了 ClassB 2-3-0 版本安全库。用户程序另外一个功能是固件升级,在调试固件升级程序的过程中,发现一旦执行了ClassB 的启动自检,就会出现固件升级失败。调试发现,固件升级失败的原因是写 Flash 的时候发现 Flash 状态寄存器的错误标志被置位,导致 Flash 写操作失败。客户根据现此象反馈 ClassB 的自检代码有隐患,导致 Flash 出错。本文分析了出现该错误的原因以及解决办法。
问题描述
根据客户的问题反馈,我在 NUCLEO-G474RE 开发板上单独移植 ClassB,通过调试,没有发现类似问题。为了复现该问题,从 RT-Thread 官方网站上下载了 5.0 版本的 RTThread 代码。RT-Thread 对 STM32 的支持是相当友好的,代码中包含了对多数 STM32开发板的支持,所以对于 NUCLEO-G474RE 开发板,只需要找到对应的目录,打开工程即可。
问题分析与解决
结合参考手册对 PGAERR 以及 PGSERR 的描述,只能从写 Flash 的角度去分析问题产生的原因,最终通过单步调试,发现其中一句代码导致了该错误标志位的置起。
小结
在 STM32 软件开发中,不当的指针操作,尤其使用未经初始化的指针可能会引起莫名奇妙的问题,所以在使用指针变量的时候,需要注意指针地址的正确性。