0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32单片机 来源:未知 2023-01-07 12:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

关键词:死机, 外扩 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的方式,代码仍然保持为原先可以重现问题的代码。如下图所示 :

4445814e-8e47-11ed-bfe3-dac502259ad0.png

如上图所示,在代码运行到使用 CACHE 后一行设置断点,当程序停下来后,打开 Sys Ctrl/Cfg 窗口(菜单 view->system viewer->Core peripherals->system control and configuration),将对应的位去掉。最终客户反馈,关闭 DC,或者 IC 任何一个或者两个都关闭,问题现象消失。至此可以确定地是,此问题与 CACHE 相关 !

于是查看客户的 MPU 相关配置,并将 Cube 包里的 H750 示例工程中的 MPU 配置发给客户测试下,但问题仍然存在。

接下来查看勘误手册,发现 2.4.4 节有 QSPI 相关的内容:

44ad7592-8e47-11ed-bfe3-dac502259ad0.png

这里有提到在 QSPI 外设 FLASH 并工作在 memory-mapped 模式的时候,当读取由FSIZE 定义的最后一个字节的时候,不管内容如何,有可能会导致 AXIs 总线 STALL 掉。

并同时给出了三种规避措施。其中第一种是将 FSIZE 定义得比实际大,以留有足够的裕量。于是让客户修改代码:在 QSPI 初始化时将 size 设置成大一倍:

面红色部分表示的 nor flash 设置成实际的两倍大小。

同时考虑到此处定义了实际两倍大小的 FLASH,多出来的另外一半实际是不存在的,为了避免 CPU 意外访问这个实际不存在的区域,使用 MPU“告诉”CPU 这多出来的一半区间是不可访问的。

于是 MPU 按如下来配置:

使用串口终端工具,分别连接 USART1,USART3,发送对应的 UART Bootloader 命令,得到下图 3 的命令交互。

图3.MPU 配置

4525955e-8e47-11ed-bfe3-dac502259ad0.png

客户再次测试,问题不再重现。为了进一步验证问题,客户尝试按原先的代码直接读取 NOR FLASH 的最后一个字节,问题还会重现,再次验证此方法的有效性,至此问题解决。

3.后记

有些人可能会问,NOR FLASH 的最后一个字节 CPU 真的会去访问吗 ? 客户的程序占满了整个 FLASH 空间了吗 ? 若那个地址没有代码那还会不会有这个问题。

其实勘误手册 2.4.4 节也提到了,不管 FSIZE 定义的空间最后的一个字节内容是什么,均会有此问题。那么 CPU 为什么会去访问此地址呢 ? 其实这是 M7 内核的指令预取和分支预测试探性访问导致的。

在 M7 编程手册中可以找到如下内容:

45d8a81a-8e47-11ed-bfe3-dac502259ad0.png

正是上述特性才导致 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.

45e849be-8e47-11ed-bfe3-dac502259ad0.png

长按扫码关注公众号

更多资讯,尽在STM32

点击“阅读原文”,可下载原文档


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

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663482
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371135

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

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32H750的SD卡必须复位一次才能挂载成功,否则就像死机了一样,如何解决?

    STM32H750,SD卡接在SDMMC1,JTAG仿真时,可以mount,拔掉卡,也可以unmount掉。拔掉仿真器时,程序
    发表于 11-05 08:15

    studio有没有通过更改下载算法,同时下载到内部flash和外部flash

    我现在使用的stm32h750,内部flash很小,需要使用外部qspiflash来储存程序。 studio可以像mdk一样设置个下载算法吗? 这样才能一个
    发表于 09-26 07:04

    STM32H750定时器抓最高30M信息源,定时器能不能配置成100M?

    你好,我们要用 STM32H750 定时器抓最高30M 信息源,定时器能不能配置成100M?超过1M用适波器无法看到波形,不知道是哪的问题
    发表于 08-08 06:23

    stm32h750h743区别是什么?

    stm32h750h743区别
    发表于 07-18 07:21

    STM32H750B-DK 板载STLINK 烧录自己程序导致无法使用了,怎么解决?

    STM32H750B-DK 板载STLINK 烧录自己程序导致无法使用了,说有此开发板的板子STLINK 程序,谢谢! 补充:STM32H750B-DK 自带的STLK 无法
    发表于 06-20 06:15

    如何使用cubeide配置stm32H750环境?

    如何使用cubeide配置stm32H750环境,但是在SYS中没有debug选项,也就选不了serial wire
    发表于 04-23 07:55

    请问STM32H750如何搭配88E6320使用?

    STM32H750如何搭配88E6320來使用?
    发表于 03-13 07:33

    STM32H750更改时钟程序无法运行怎么解决?

    各位大佬,我想请教一个问题: 为了验证H750主时钟频率和功耗的关系: 用STM32CUBEMX配置STM32H750VBT6的主时钟为:100MHz,程序可以正常
    发表于 03-12 06:38

    STM32H750内部flash读写的疑问求解

    请教下,STM32H750XBHx我看资料内置flash为128K,并且flash擦除的最小单元也是128K。这样的话我有数据要保存应该怎样处理好呢?写数据时是要将程序部分一起擦除再写
    发表于 03-12 06:29

    stm32h750vbt6设置了LSE,装载RESET失效了怎么解决?

    stm32h750vbt6设置了LSE,装载RESET失效
    发表于 03-07 15:16

    STM32H750 FDCAN发送异常的原因?

    最近在调CANopen,用的芯片是STM32H750VBT6,发现按照ST的例程生成简单的测试程序,只要执行一次发送,CAN模块就会自动一直往外发送这帧数据,查看寄存器发现发送挂起
    发表于 03-07 08:42

    STM32H750VBT6程序只有在调试时可以运行,为什么?

    最近在调试 STM32H750VBT6 时遇到程序只有在调试时可以运行,虽然勾选了 rest and run ,但下载完任然不运行。检查了 boot 和 reset 电压均正常。最后,
    发表于 03-07 06:19

    焊板子前,焊板子,硬件工程师居然幅面孔!# #电工 #电路知识 #电路原理

    硬件工程师
    MDD辰达半导体
    发布于 :2025年01月07日 18:15:30