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单片机】欢迎添加关注!文章转载请注明出处。


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

    关注

    6006

    文章

    44032

    浏览量

    622133
  • STM32
    +关注

    关注

    2243

    文章

    10683

    浏览量

    349303

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

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

收藏 人收藏

    评论

    相关推荐

    如何提快STM32H750的DMA中断响应时间?

    STM32H750程序在外部FLash运行,中断程序是在RAM中。测试中断响应时间有1us多,怎样能缩短这个时间。 上面的响应时间指的是触发
    发表于 05-20 08:19

    STM32H750可以仿真但运行又进不了main是为什么?

    STM32H750遇到可以仿真,但运行又进不了main的情况 仿真可以正常运行,但直接运行时就进不了main(),请问有兄弟遇到相同情况吗
    发表于 04-16 06:10

    测试LWIP UDP(STM32H750)接收接收5913及以上,5秒左右就进入HardFault_Handler死机状态的原因?

    请问测试原子的例子 lwip_udp_iperf(STM32H750/STM32H743)接收接收5913及以上,5秒左右就进入HardFault_Handler死机状态,有谁碰到过类似问题吗?
    发表于 04-15 07:12

    STM32H750不能使用IAR进行仿真是为什么?

    大家好,我现在正在使用STM32H750,使用的IDE 是IAR 现在在进行Debug的时候遇到一个问题,由于使用了QSPI-flash,现在程序可以下载,但是不能仿真,是参照CebuMX的例程写的,想请教下有没有前辈遇到过这个
    发表于 04-09 08:14

    STM32H750如何使用IAR调试运行在外部SDRAM的程序?

    正在使用STM32H750开发应用。 我的用户程序,储存在QSPI Flash中,运行在SDRAM中,采用了Bootloader来复制程序
    发表于 04-01 07:40

    求助,如何使用openOCD下载程序stm32h750外部flash

    我有一块stm32h750的核心板,并使用openOCD为它下载程序。我想将程序下载到外部的8MB Falsh中,但我没有思路该如何做。有没有朋友能分享下思路? openOCD文档中有针对st
    发表于 03-27 06:20

    STM32H750 HAL_MspInit(void)接口中不调用__HAL_RCC_SYSCFG_CLK_ENABLE(),高温死机的原因?

    STM32H750,HAL_MspInit(void)接口中不调用__HAL_RCC_SYSCFG_CLK_ENABLE(),高温死机,调用后高温不死机,求原因
    发表于 03-26 06:02

    STM32H750 QSPI flash重映射模式下有方法能实现读写操作吗?

    STM32H750 QSPI flash重映射模式下有方法能实现读写操作吗
    发表于 03-25 08:06

    STM32H750 BootLoader如何重刷?

    STM32H750 BootLoader如何重刷,在哪里可以找到文档
    发表于 03-20 06:44

    STM32H750可以使用Cube.AI吗?

    STM32H750,可以使用Cube.AI吗
    发表于 03-19 06:14

    stm32H750使用FreeRTOS有时死机的原因?

    stm32H750使用FreeRTOS,偶尔会出现所有线程停止运行的状况(流水指示灯不闪,程序不跑),此时点击触摸屏触发一下串口中断,所有的线程又会恢复运行,从堆栈调用情况看,有点像是
    发表于 03-18 07:54

    STM32H750通过spi向stm32发送同步帧,无法收到从机应答是怎么回事?

    翻阅应用笔记AN4286与AN2606,得知STM32H750自带的Bootloader支持spi烧录。可在实际尝试中,通过spi向stm32发送同步帧,无法收到从机应答。 H750
    发表于 03-07 06:45

    程序运行在STM32H750的外扩FLASH两小时死机该如何处理

    程序运行在 STM32H750 的外扩 FLASH两小时死机
    的头像 发表于 10-24 15:20 2264次阅读
    <b class='flag-5'>程序</b><b class='flag-5'>运行在</b><b class='flag-5'>STM32H750</b>的外扩<b class='flag-5'>FLASH</b>上<b class='flag-5'>两小时</b>后<b class='flag-5'>死机</b>该如何处理

    工程师笔记 | STM32G0 复位后死机

    工程师笔记 | STM32G0 复位后死机
    的头像 发表于 10-17 15:23 1065次阅读
    <b class='flag-5'>工程师</b><b class='flag-5'>笔记</b> | <b class='flag-5'>STM32</b>G0 复位后<b class='flag-5'>死机</b>

    stm32H750使用FreeRTOS偶尔会出现所有线程停止运行的状况怎么解决

    stm32H750使用FreeRTOS,偶尔会出现所有线程停止运行的状况(流水指示灯不闪,程序不跑),此时点击触摸屏触发一下串口中断,所有的线程又会恢复运行,从堆栈调用情况看,有点像是
    发表于 08-07 14:18