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

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

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

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

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

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

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

在 QSPI 初始化时将 size 设置成大一倍:

QSPIHandle.Init.FlashSize = POSITION_VAL(MT25TL01G_FLASH_SIZE) - 1;

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

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

图 3 MPU 配置
在这里插入图片描述

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

3. 后记

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

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

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

图 4 M7 编程手册内容
在这里插入图片描述

正是上述特性才导致 CPU 会提前访问 NOR FLASH 上的地址,即使当前 PC 指针还未指到那里。 这个特性原本 M7 是为了增强性能的,这个特性本身并没有什么问题,但是放在 STM32H750 上,由于其在勘误手册中有这么一个限制,从而导致了问题。


本文档参考ST官方的《【应用笔记】LAT1151+程序运行在+STM32H750+的外扩+FLASH+上两小时后死机》文档。
参考下载地址:https://download.csdn.net/download/u014319604/88971358

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

triton入门实战

这篇文章主要讲的是基于官方镜像及, pytorch script 格式模型,构建tritonserver 服务 1、环境准备: 1.1. 下载 tritonserver镜像: Triton Inference Server | NVIDIA NGC a. 注意:tritonserver 镜像中的invdia驱动版本…

JWFD全面升级为WIN7系统

由于JWFD主控制器的核心模块已经完全支持WIN7系统,JWFD系统已经全面升级为WIN7平台 请各个用户升级自己的核心系统到WIN7,WIN7版本的JWFD和XP版本的JWFD保持完全的兼容 原来在XP及其以下的操作系统中开发的JWFD的各个模块和代码包均可以在WIN7版本中正…

Java基础知识总结(56)

/** Map集合常用Api */ public class MapDemo1 { public static void main(String[] args) { //创建Map集合对象 Map<Integer,String> map new HashMap<>(); //向Map集合中添加键值对 map.put(1,"田福军"); //在这里进行了自动装箱 map.put(2,"孙…

Java面试必问题39:SpringBoot自动配置原理(必问) SpringBoot(优点)

SpringBoot自动配置原理 Spring Boot的自动配置原理基于条件化配置和约定优于配置的机制。它通过扫描类路径下的依赖、配置文件和注解等信息&#xff0c;结合Spring Boot提供的自动配置类和条件注解&#xff0c;根据条件判断自动配置哪些组件&#xff0c;然后将它们注入到Spri…

mojo人工智能语言终于开源了,比Python 快了9万倍

让你久等的人 最后也不会选择你 没有什么人是你必须要交往的 原则上不可以 只是说明打破选择的利益 还不够大 女人喜欢追随 而不是领导 追求趋势,权利 而不是忠诚 前不久,Modular 公司宣布开源 Mojo 的核心组件。 Mojo 是一种专为编写人工智能软件设计的编程语言,去年…

百货商场用户画像描绘and价值分析(下)

目录 内容概述数据说明技术点主要内容4 会员用户画像和特征字段创造4.1 构建会员用户基本特征标签4.2 会员用户词云分析 5 会员用户细分和营销方案制定5.1 会员用户的聚类分析及可视化5.2 对会员用户进行精细划分并分析不同群体带来的价值差异 内容概述 本项目内容主要是基于P…

uniapp开发路由跳转

目录 底部导航栏 内置api跳转 uni.navigateTo uni.redirectTo uni.reLaunch uni.switchTab 使用页面链接 底部导航栏 pages.json "tabBar": {"color": "#f5deb3","selectedColor": "#f0e68c","borderStyle&qu…

C语言概述详解

1.什么是C语言&#xff1f; C语言是计算机编程语言的一种&#xff0c;主要用于人与机器交流&#xff0c;对于嵌入式工程师来说&#xff0c;C语言是必不可少的一门语言。 2.C语言的特点&#xff1f; C语言具有简洁、高效、可移植、模块化、标准化的特点。但对于C语言的简洁和高效…

数据结构-栈超详解

栈 一种先进后出的数据结构。 复杂度单次通常为 O ( 1 ) O(1) O(1) 用途&#xff1a;括号匹配&#xff0c;倒序问题等 例子&#xff1a; 序列A:{1,2,3,4,5}依次入栈再同一出栈&#xff0c;顺序为A’:{5,4,3,2,1} 代码&#xff1a; 插入&#xff1a; void insert(int x…

手写call,apply,bind,new

三种情况都是改变this的指向&#xff0c;不同的是bind返回的是一个函数 //call let foo {value: 1 };Function.prototype.call2 function (context) {const context2 context || window//this指的是要改变this函数context2.fn thisconst args [...arguments].slice(1)//调…

Springboot+Vue项目-基于Java+MySQL的免税商品优选购物商城系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【LeetCode热题100】【贪心算法】跳跃游戏

题目链接&#xff1a;55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 数组的元素表示可以跳的最大长度&#xff0c;要判断能不能跳到最后 不断更新可以跳到的最远距离&#xff0c;如果当前的位置大于可跳最远距离&#xff0c;说明不行 class Solution { public:bool …

【Qt】常用控件(LCD Number/进度条/日历)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、LCD Number(LCD显示器) 一个倒计时程序 二、ProgressBar(进度条) 1、创建一个进度条&#xff0c;100ms进度增加…

Android Binder——C++层注册服务实例(十二)

前面几篇内容都介绍了 C++ 中新增服务的调用流程,这里我们看一个 Android 源码中的实例进一步熟悉 C++ 服务的添加流程,这里以 MediaPlayerService 为例。 一、添加服务调用 1、main_mediaserver.cpp 源码位置:/frameworks/av/media/mediaserver/main_mediaserver.cpp i…

每天学习一个Linux命令之git

每天学习一个Linux命令之git Git是一个分布式版本控制系统&#xff0c;被广泛用于开发软件项目。它提供了许多强大的命令和选项&#xff0c;使开发人员可以更好地管理和跟踪代码的变化。在本篇博客中&#xff0c;我们将详细介绍一些常用的git命令及其选项。 git init git in…

✌粤嵌—2024/3/14—判断子序列

代码实现&#xff1a; 方法一&#xff1a;一次遍历 bool isSubsequence(char *s, char *t) {if (strlen(s) 0) {return true;}int i 0;for (int j 0; j < strlen(t); j) {if (s[i] t[j]) {i;}if (i strlen(s)) {return true;}}return false; } 方法二&#xff1a;动态规…

5.2 mybatis之autoMappingBehavior作用

文章目录 1. NONE关闭自动映射2. PARTIAL非嵌套结果映射3. FULL全自动映射 众所周知mybatis中标签< resultMap >是用来处理数据库库字段与java对象属性映射的。通常java对象属性&#xff08;驼峰格式&#xff09;与数据库表字段&#xff08;下划线形式&#xff09;是一 一…

基于SSM项目个人健康信息管理系统

采用技术 基于SSM项目个人健康信息管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 用户端 用户首页 健康知识 用户注册 医院推荐信息 系统概要…

【LeetCode热题100】【矩阵】螺旋矩阵

题目链接&#xff1a;54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 先走外面的圈再走里面的圈&#xff0c;可以用递归来解决&#xff0c;对于要走的一个圈&#xff0c;由四个角决定&#xff0c;其实是三个数&#xff0c;&#xff08;0&#xff0c;0&#xff09;&…

VUE相关知识锦集

一、生命周期的使用场景 created ----- 单组件请求 mounted----- 同步可以获取dom,如果先子组件请求后父组件请求 activated-----判断id是否相等&#xff0c;如果不相同发起请求 destory-----关闭页面记录视频播放时间&#xff0c;初始化的时候从上一次的历史开始播放 补充…