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

STM32F4中Flash相关问题解答

[复制链接]
STMCU小助手 发布时间:2023-1-12 14:00
前不久,几乎举国上下在同一时间段内整齐划一地被感染了新冠。

: w5 ~+ q8 C9 A& }/ S
很多人感染后都不同程度地出现味觉、嗅觉失灵的情形。本人也有相同经历。这几天,味觉恢复,嗅觉也在慢慢恢复中。既能闻到诱人的煎饼香,也能闻到清新的花香了。
" O$ y. b2 `! B4 E- i
今天在此分享两个STM32应用中的实战案例,权作提醒,以免重蹈覆辙。

8 [; a$ z0 n  H4 J9 T* s$ [- Q/ @
案例1:
系统联机工作时,Flash编程偶发性失败

, e2 D: k; M* M" q
有人使用STM32F4系列芯片做开发,代码里涉及到FLASH编程。他发现FLASH编程过程中时不时地出现编程错误,即提示HAL_FLASH_ERROR_PGP错误。

2 I3 p: k6 ^0 k' g# N( K! f. i
他的产品系统有用到CAN通信。当他不将芯片做系统联机工作时不会发生该错误,只有在做整体联机测试时才可能发生编程异常。

3 {/ |! r2 J0 ~4 E  `: ]3 e3 r3 S" L
起初,客户使用4字节编程模式,平常单独就flash编程功能测试也正常,整体联机运行时才可能出问题。后来,无意中尝试将FLASH单次编程宽度调整为1个字节后则异常消失。
& t" z: z* P7 F$ ?# K& G
那是为什么呢?

! W% A& g( {9 w7 _6 h/ Y
微信图片_20230111140818.png
  }% w2 z& M# w' O/ i6 U
其实,在做FLASH编程时,选择不同的编程宽度所需的芯片供电电压是不一样的。上面截图来自STM32F4系列参考手册。从图中不难看出,选择的编程宽度越宽,芯片所需供电电压越高。

* g, I$ a& C! j) D: H7 G* V
若不运行其它功能,只是单独就芯片做flash编程,功耗需求相对较小、电源波动也小。当联机工作时,系统功耗、串扰都有所增大,电源波动也可能加剧,这时很可能出现电源难以保证支持4字节编程方式的稳定需求。由于单字节编程模式所需电源电压相对较低,在系统联机工作时,相同的电源条件下,即使电源有所波动,但完全可能依旧能提供满足单字节编程的稳定电压需求,因而不会出现因供电问题导致的编程异常。

7 R8 T+ R" o9 D% @) ]+ N
案例 2:( }: s, K/ a5 {
芯片工作时偶发性出现死机现象

, X: |8 S( X& t3 B- Y  k4 Y
有人在做STM32芯片做产品开发,会偶发性地出现芯片进入死机状态的现象。
* ]# N, q' ]5 f1 K3 {
代码里有做FLASH编程操作,有UART的收发动作及相关中断,另外还开启了某定时器更新中断。经过测试发现,如果关闭定时器中断,FLASH编程、UART收发动作保持的情况下,则不会出现死机的现象。可是定时器中断怎么会导致芯片死机呢?感觉没有找到根本原因。后来,进一步跟踪调试发现,芯片出现死机,实际上是程序不停地进入UART接收中断。

. I# P% L. z# i& c5 k1 m
用户代码里的确使能了UART收发中断,但在中断代码里程序实实在在有对接收非空标志【RXNE】做清零处理,不应该没完没了地进接收中断啊!经进一步确认,发生死机现象时总是对应着UART接收溢出事件【ORE】。哦,如果这样,当UART接收发生溢出时的确也会产生接收非空中断。下图为STM32 USART的各个中断请求事件及中断使能控制位。从下图可以看出,当使能RXNEIE时,RXNE和ORE事件都可产生接收中断。
3 P. A% G0 }# N$ g* t5 E; C- H+ p
微信图片_20230111140828.png

* g1 F$ j! K: k: B; `# I
用户虽然在UART接收中断里有对RXNE标志清零,但当发生溢出事件而进入中断时,他并没有对ORE标志做检测及相应的清零操作。

' J0 w; h8 U& r" G- q1 u
微信图片_20230111140835.png
' R2 t. [( _+ o0 {' g( J: R
实际上,用户根本就没有意识到发生ORE事件时也可以产生接收中断,在其代码里根本没有对ORE标志进行检测,更没有对ORE标志做清零,导致UART接收中断没完没了的进入,感觉芯片犹如死机一般。

0 r! V4 R0 I! l8 k2 G1 I
为什么关闭定时器中断能防止死机现象发生呢? 我们知道,UART接收产生溢出是因为数据接收到后不能及时取走才产生的,而定时器中断的存在,因为中断竞争的原因导致了UART接收中断的及时性受到影响,进而容易发生溢出。如果关闭定时器中断或或将UART接收中断的优先级配置成可以抢占定时器中断就可以避免UART接收不及时的问题,也就不会发生溢出。这样的话,即使用户的UART接收中断里没有对ORE事件的处理也无所谓。

( h' J* \: y9 |; T2 n  n
当然,我们做UART的中断接收时,中断代码里最好加上对ORE事件的检测处理,当发生溢出事件时,及时对ORE事件标志清零。否则,万一发生溢出,就可能因ORE事件而发生没完没了进中断的问题,进而导致功能异常。
具体到本案例,再顺便提醒一点,除非片内FLASH采用双BANK结构,FLASH编程也是会影响中断响应的。即该操作也可能让UART的接收中断的响应因临时堵塞而发生接收溢出。

5 f: K4 p1 @) x5 h% L
好,今天的分享到此打住。也愿这里的分享能给有需要的人带来一些帮助。
# U( U- z% ~/ O! Y; c; z
目前尚是冬季,大家注意防寒保暖并保证休息,以利新冠康复。如有咳嗽,除了使用适当药剂外,尽量避免说话,尤其是高声说话。

; k. `; K# v& j4 m9 Q" y, O
转载自: Miler
+ |5 }: x  [! p" K/ h/ I. H
赞 收藏 评论0 发布时间:2023-1-12 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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