工程师笔记|程序运行在 STM32H750 的外扩 FLASH 上两小时后死机

关键词:死机, 外扩 flash
目录预览
1. 问题现象
2. 问题分析及测试
3. 后记
1.问题现象
客户使用 stm32h750vbt6,通过 qspi 外扩了一个 4m 的 nor flash,采用memory map 模式。当程序跳转运行到外设 flash 后,大约两个小时后程序死机。
客户使用的 ide 是 keil,此问题可以固定重现。在 keil 调试模式下重现问题时,通过多次观察发现,程序死的位置总体上会停在两个位置,并不是同一个位置。一个是 tim15函数的入口;另一个是进入中断函数后的一个赋值语句。
2.问题分析及测试
通过拜访客户,观察到死机位置处于即将进入但还未进入的 tim15 中断入口处。查看客户的原理图,发现两个 vcap 并未从外部相连,于是要求客户直接从外部将此两个引脚飞线短连。但是,后来经测试问题仍然重现。
又观察到 pc13 连接为 gpio 输出引脚,用于驱动一外部组件。考虑到备份域相关的一些引脚其驱动能力相对弱一些,于是让客户将 pc13 引脚断开后再测试,结果问题仍然重现。
上面是一些硬件相关的怀疑点,从测试结果来看,与此问题无关。看来主要可能还是软件方面的问题。在软件上确定客户已经打开了 io 补偿功能, io 速度设置的是 high,即使让客户修改成 “very_high”,经测试问题仍然存在。
由于之前发生过一个从低功耗唤醒后死机的问题,是与 cache 相关的问题,于是测试将 cache 关闭的情况。这次经测试客户反馈问题没再重现 !
但客户同时也反馈,之前的代码也存在稍微修改一处代码,问题就不再重现的现象,没有找到具体规律。
这次代码修改也没排除这种可能性。为了让关闭 cache 的方法更具说服力,于是让客户在调试模式下通过手动关闭 cache的方式,代码仍然保持为原先可以重现问题的代码。如下图所示 :
如上图所示,在代码运行到使用 cache 后一行设置断点,当程序停下来后,打开 sys ctrl/cfg 窗口(菜单 view->system viewer->core peripherals->system control and configuration),将对应的位去掉。最终客户反馈,关闭 dc,或者 ic 任何一个或者两个都关闭,问题现象消失。至此可以确定地是,此问题与 cache 相关 !
于是查看客户的 mpu 相关配置,并将 cube 包里的 h750 示例工程中的 mpu 配置发给客户测试下,但问题仍然存在。
接下来查看勘误手册,发现 2.4.4 节有 qspi 相关的内容:
这里有提到在 qspi 外设 flash 并工作在 memory-mapped 模式的时候,当读取由fsize 定义的最后一个字节的时候,不管内容如何,有可能会导致 axis 总线 stall 掉。
并同时给出了三种规避措施。其中第一种是将 fsize 定义得比实际大,以留有足够的裕量。于是让客户修改代码:在 qspi 初始化时将 size 设置成大一倍:
面红色部分表示的 nor flash 设置成实际的两倍大小。
同时考虑到此处定义了实际两倍大小的 flash,多出来的另外一半实际是不存在的,为了避免 cpu 意外访问这个实际不存在的区域,使用 mpu“告诉”cpu 这多出来的一半区间是不可访问的。
于是 mpu 按如下来配置:
使用串口终端工具,分别连接 usart1,usart3,发送对应的 uart bootloader 命令,得到下图 3 的命令交互。
图3. mpu 配置
客户再次测试,问题不再重现。为了进一步验证问题,客户尝试按原先的代码直接读取 nor flash 的最后一个字节,问题还会重现,再次验证此方法的有效性,至此问题解决。
3.后记
有些人可能会问,nor flash 的最后一个字节 cpu 真的会去访问吗 ? 客户的程序占满了整个 flash 空间了吗 ? 若那个地址没有代码那还会不会有这个问题。
其实勘误手册 2.4.4 节也提到了,不管 fsize 定义的空间最后的一个字节内容是什么,均会有此问题。那么 cpu 为什么会去访问此地址呢 ? 其实这是 m7 内核的指令预取和分支预测试探性访问导致的。
在 m7 编程手册中可以找到如下内容:
正是上述特性才导致 cpu 会提前访问 nor flash 上的地址,即使当前 pc 指针还未指到那里。我们可以通过合适的mpu配置防止因试探性访问外存而导致问题。
参考文献:
1. pm0235:stm32f7 series and stm32h7 series cortex-m7 processor programming manua.
2. es0396:stm32h750xb and stm32h753xi device limitations.
3. an4838:managing memory protection unit in stm32 mcus.
4. an4893:level 1 cache on stm32f7 series and stm32h7 series.
长按扫码关注公众号
更多资讯,尽在stm32
▽点击“阅读原文”,可下载原文档
原文标题:工程师笔记|程序运行在 stm32h750 的外扩 flash 上两小时后死机
文章出处:【微信公众号:stm32单片机】欢迎添加关注!文章转载请注明出处。

基于一种可以适用于多种异构网络场景的下一代网络协议New IP介绍
并行Nor Flash的结构和参数特性
国芯思辰 |兼容LTC2245,14位GAD2245可用于手持数字存储示波表
中芯国际2019年Q3营收8.165亿美元 下年目标看准5G
离子注入中的剂量和浓度之间有何关系呢?
工程师笔记|程序运行在 STM32H750 的外扩 FLASH 上两小时后死机
看似低调不起眼,5年坚持做一种芯片,远销海外
温度对CoolSiC™ MOSFET的影响
HPLC电力载波灯控的节能照明 智慧照明方案
京东方成为成都电子信息产业中的又一标志性品牌
打造本土半导体IC供应链,存储芯片联盟成立
基于凌华PCI-9846高速数字化仪的复杂超声场自动检测与分析
BMS_SOH算法模块-能量累积&衰退(模型)主要功能信息
霍尼韦尔新型纳安级传感器的特点介绍
荣耀V40新品发布会时间、价格曝光
米家互联网洗烘一体机评测 1999元的良心之作多成员大家庭最为适用
vivoX7高清图赏
智能化将成为低压电器领域未来的发展方向
无线网桥和微波产品的区别
在BI数据可视化工具制作的报表怎么样