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

实战经验 | RT-Thread环境下Flash错误标志问题解析

[复制链接]
STMCU-管管 发布时间:2025-4-29 15:43
1
; b( P/ S: w" c* |( o! D2 r' @2 Z8 M简介6 t4 I8 i5 J! b
客户在使用STM32G474RE进行产品开发的时候,操作系统软件使用了RT-Thread 5.0,同时由于要做ClassB认证,所以在RT-Thread系统上,移植了ClassB 2-3-0版本安全库。用户程序另外一个功能是固件升级,在调试固件升级程序的过程中,发现一旦执行了ClassB的启动自检,就会出现固件升级失败。调试发现,固件升级失败的原因是写Flash的时候发现Flash状态寄存器的错误标志被置位,导致Flash写操作失败。客户根据现此象反馈ClassB的自检代码有隐患,导致Flash出错。4 S+ \% U$ ~( C* a" b( w
本文分析了出现该错误的原因以及解决办法。
# i" P9 o+ |9 b) M- s5 M8 P8 n1 g# P( ^. x4 C+ B8 O* Q/ c* [
; d2 u1 H6 l) W5 K# z
2+ x0 `' q, Z3 i5 Z3 T! j
问题描述4 G) y6 ^6 Z/ k2 N

" T0 \( p$ H0 q- Q. m
- M0 n4 u  N1 {: h: M) G3 @' G
根据客户的问题反馈,我在NUCLEO-G474RE开发板上单独移植ClassB,通过调试,没有发现类似问题。为了复现该问题,从RT-Thread官方网站上下载了5.0版本的RT-Thread代码。RT-Thread对STM32的支持是相当友好的,代码中包含了对多数STM32开发板的支持,所以对于NUCLEO-G474RE开发板,只需要找到对应的目录,打开工程即可,如下图。
" m0 l5 y+ u5 d* V7 \
12.png
▲ 图1. RT-Thread工程目录
0 j; x* S/ m2 U
9 ^, g) a+ R* L. \
在上述工程下,直接添加ClassB的启动自检代码即可生成客户出现问题的软硬件环境。6 @: Q! p4 R' v, J
移植完ClassB的启动自检代码,通过NUCLEO-G474RE开发板调试发现,当执行启动自检,跳转到主函数之后,通过查看Flash的寄存器,发现Flash状态寄存器的PGAERR,PGSERR标志被置位,如下图所示。
. j8 p& `8 w2 N$ U5 `2 H
13.png
▲ 图2. Flash错误标志
从RM0440参考手册上关于PGAERR和PGSERR的描述可知,这两个标志位只能由硬件置起,而且是由于写Flash才会导致该错误标志被置起,而在测试的代码中,并没有Flash的写操作,由于之前有发现Keil调试器导致G0出现的Flash错误标志的问题,刚开始也怀疑Keil调试器导致类似问题,实际测试发现该问题与调试器无关。) I6 Q/ z8 F; R! z: J5 i6 a. q

: d, b3 _/ g. V5 c6 k
0 l9 S) R. d* Y: F7 D' N8 x( R
3& ^  l1 C$ }; N2 M9 e1 }" F& X
问题分析与解决
8 i2 Y  y# [" K" E5 {- o
% O) [+ A  d# X* |
- k0 t$ i, k2 Y! J
结合参考手册对PGAERR以及PGSERR的描述,只能从写Flash的角度去分析问题产生的原因,最终通过单步调试,发现其中一句代码导致了该错误标志位的置起,如下图所示。& u- ~* ]  a5 B5 S
14.png
▲ 图3. 错误代码

  a3 l$ e) F1 t: Q

" E- Z; J% y# V! v2 t- S' t3 I在SysTick_Handler中断服务程序中,调用了RT-Thread的函数rt_tick_increase,该函数中的变量thread为一个空指针,其地址为0x000000,在STM32G4中,该地址恰好映射为Flash的地址,从上面语句--thread->remaining_tick实际上产生了Flash写操作,所以最终导致了Flash的错误标志置位。8 R; _, _" U) G7 F0 F& h3 P) W
找到该问题原因之后,反馈给客户,客户在其板子上验证了同样的现象,所以该问题与ClassB的自检代码没有关系,而是由于指针变量没有赋值,导致指针指向的地址为Flash地址,如果此时对该指针变量进行赋值操作,就会产生Flash错误标志位被置位的现象。
' @9 `0 u+ x) t/ q9 y% M/ q
. k/ n( g- E& e1 u2 E9 M
, b9 k# v3 t% ?2 \4 U- N) I  g; q
42 W. i% h8 t: n/ X: g" q
小结
( I4 F& j& y4 t/ z  |; p
7 e8 m6 e# _$ r+ x: B' M5 G! v

; c, {; B2 m; G( s. F9 V在STM32软件开发中,不当的指针操作,尤其使用未经初始化的指针可能会引起莫名奇妙的问题,所以在使用指针变量的时候,需要注意指针地址的正确性。
4 x+ N2 v# C% f# b% @/ [! c* q
! M- `1 r# p7 s. y7 i0 p
赞 收藏 评论0 发布时间:2025-4-29 15:43

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版