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

程序运行在 STM32H750 的外扩 FLASH 上两小时后死机

[复制链接]
STMCU小助手 发布时间:2023-2-17 16:03
1. 问题现象. P4 o2 U8 e$ a

6 ]+ S9 R( R  c/ P# l+ Z3 ?, u客户使用 STM32H750VBT6,通过 QSPI 外扩了一个 4M 的 NOR FLASH,采用memory map 模式。当程序跳转运行到外设 FLASH 后,大约两个小时后程序死机。
2 {4 I5 m0 x5 n$ {客户使用的 IDE 是 KEIL,此问题可以固定重现。 在 KEIL 调试模式下重现问题时,通过多次观察发现,程序死的位置总体上会停在两个位置,并不是同一个位置。一个是 TIM15函数的入口;另一个是进入中断函数后的一个赋值语句。8 l1 T$ J& ~2 O: q, S0 C

5 n' Q; o' m( m: T7 K

7 \& Y" h- N& ^% S2 o& U2. 问题分析及测试- V* M3 J% _- \
通过拜访客户,观察到死机位置处于即将进入 TIM15 中断入口处,但还未进入之时。查看客户的原理图,发现两个 VCAP 并未从外部相连,于是要求客户直接从外部将此两个引脚飞线短连。 但是,后来经测试问题仍然重现。
4 l# {7 U5 @7 @2 y' y7 T& O又观察到 PC13 连接为 GPIO 输出引脚,用于驱动一外部组件。 考虑到备份域相关的一些引脚其驱动能力相对弱一些,于是让客户将 PC13 引脚断开后再测试,结果问题仍然重现。0 m: k" T) z" w# `. Y- t
上面是一些硬件相关的怀疑点,经测试结果来看,与此问题无关。 看来主要可能还是软件方面的问题。( E3 d+ x* z/ n" ~! x5 {. @
在软件上确定客户已经打开了 IO 补偿功能,但 IO 速度设置的是 HIGH,于是让客户修改成 “VERY_HIGH”,经测试问题仍然存在。
/ b! f4 D9 J; o% R$ i6 y由于之前发生过一个从低功耗唤醒后死机的问题,是与 Cache 相关的问题,于是要测试下将 CACHE 关闭的情况。 这次经测试客户反馈问题没现重现 ! 但客户同时也反馈,之前的代码也存在稍微修改一处代码,问题就不再重现的现象,没有找到具体规律。 这次代码修改也没排除这种可能性。2 U2 @- W* s* n3 Q4 v, i
为了让关闭 Cache 的方法更具效力,于是让客户在调试模式下通过手动关闭 CACHE的方式,代码仍然保持为原先可以重现问题的代码。如下图所示 :
6 F- C- H2 B* e$ i7 R4 Z- t& n$ Y2 {  b4 t+ }; h
1 E" h* W8 |& B
UB$~E1`7OO9B48(X34AF9_7.png : m, y- h9 T! c1 I' n
/ c& X& z7 u! `
! T: `; Q( l& g% \0 ~  W
如上图所示,在代码运行到使用 CACHE 后一行设置断点,当程序停下来后,打开 Sys Ctrl/Cfg 窗口(菜单 view->system viewer->Core peripherals->system control and configuration),将对应的位去掉。 最终客户反馈,关闭 DC,或者 IC 任何一个或者两个都关闭,问题现象消失。 至此可以确定地是,此问题与 CACHE 相关 !! E# Y% Y! N3 t% _; \- t
于是查看客户的 MPU 相关配置,并将 Cube 包里的 H750 示例工程中的 MPU 配置发给客户测试下,但问题仍然存在。
% q6 A0 E1 j* I( H+ U; S2 L" z接下来查看勘误手册,发现 2.4.4 节有 QSPI 相关的内容:
& I$ U1 z$ {$ A  y; e
' T% @) `2 J& {) f( i& J

2 z' V4 ?% ?* J7 f. d) d) L+ T" g QH(A00HU{RITIQYE]R8HNJ1.png # J: F: r, C) `
7 x" P# _8 Z% r

- I* K' |% t# W  D这里有提到在 QSPI 外设 FLASH 并工作在 memory-mapped 模式的时候,当读取由FSIZE 定义的最后一个字节的时候,不管内容如何,有可能会导致 AXIs 总线 STALL 掉。并同时给出了三种规避措施。 其中第一种是将 FSIZE 定义得比实际大,以留有足够的裕量。 于是让客户修改代码:
" K. }7 ~; `: T- m4 o在 QSPI 初始化时将 size 设置成大一倍:
8 L/ o# k9 a/ Z 上面红色部分表示的 nor flash 设置成实际的两倍大小。5 |) R, H9 e' K
同时考虑到此处定义了实际两倍大小的 FLASH,多出来的另外一半实际是不存在的,为了避免 CPU 意外访问这个实际不存在的区域,使用 MPU“告诉”CPU 这多出来的一半区间是不可访问的。 于是 MPU 按如下来配置:
- k$ g; q4 R3 b9 B2 Y0 X- z' t
( G% T. u! s' l) n$ Z% B+ o8 C

( ?& g  x- D( o6 f) @ Q(B}H}[%LGRI(AM62S3E31F.png - L, X( g; D/ q2 M6 X( E1 n# w

4 u' ^/ W, K% L

# a- Q; d" H2 G2 l2 I& O客户再次测试,结果问题不再重现。 为了进一步验证问题,客户尝试按原先的代码直接读取 NOR FLASH 的最后一个字节,结果问题也会重现,再次验证此方法的有效性,至此问题解决。' `- v4 @1 k) |" K2 S; v1 r7 V. R
$ t1 v$ i1 |3 N5 f3 ?2 i: ~
1 H# p0 J6 ~' ]; U0 D
完整版请查看:附件 程序运行在 STM32H750 的外扩 FLASH 上两小时后死机.pdf (452.44 KB, 下载次数: 3)
赞 收藏 评论0 发布时间:2023-2-17 16:03

举报

0个回答

所属标签

相似技术帖

官网相关资源

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