STM32H5 读取温度传感器校准值时进 HardFault 的原因分析

1.前言

有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。

2.问题分析

经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FFF814-0x08FF F815 和 0x08FF F818-0x08FF F819。

在这里插入图片描述

根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。

在这里插入图片描述
在这里插入图片描述

根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存

在这里插入图片描述

也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。

既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。

在这里插入图片描述

OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FFFFFF],两个地址其实是连续的。

在这里插入图片描述

3.解决方法

经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none-cacheable,通过 CubeMX 进行配置。
在这里插入图片描述

void MPU_Config(void)
{
	 MPU_Region_InitTypeDef MPU_InitStruct = {0};
	 MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};
	 /* Disables the MPU */
	 HAL_MPU_Disable();
	 /** Initializes and configures the Region and the memory to be protected
	 */
	 MPU_InitStruct.Enable = MPU_REGION_ENABLE;
	 MPU_InitStruct.Number = MPU_REGION_NUMBER0;
	 MPU_InitStruct.BaseAddress = 0x08FFF000;
	 MPU_InitStruct.LimitAddress = 0x08FFFFFF;
	 MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;
	 MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
	 MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
	 MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
	 HAL_MPU_ConfigRegion(&MPU_InitStruct);
	 MPU_AttributesInit.Number = MPU_REGION_NUMBER0;
	 MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE	 | MPU_TRANSIENT | MPU_NO_ALLOCATE);
	 HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
	 /* Enables the MPU */
	 HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。

uint16_t TS_CAL1_Val,TS_CAL2_Val; 
uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;
 uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;
 TS_CAL1_Val = *TS_CAL1;
 TS_CAL2_Val = *TS_CAL2;

4.总结

温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。

在这里插入图片描述

文档中所用到的工具及版本

STM32CubeMX 6.9.1


本文档参考ST官方的《【应用笔记】LAT1340+STM32H5读取温度传感器校准值时进HardFault的原因分析.pdf》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89069366

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图像处理与视觉感知---期末复习重点(6)

文章目录 一、图像分割二、间断检测2.1 概述2.2 点检测2.3 线检测2.4 边缘检测 三、边缘连接3.1 概述3.2 Hough变换3.3 例子3.4 Hough变换的具体步骤3.5 Hough变换的法线表示形式3.6 Hough变换的扩展 四、阈值处理4.1 概述4.2 计算基本全局阈值算法4.3 自适应阈值 五、基于区域…

ElementUI 表格横向滚动条时滚动到指定位置

ElementUI 表格横向滚动条时滚动到指定位置 getColumnOffset(columnProp) {this.$nextTick(() > {const table this.$refs.tableRef.$refs.multipleTable;const columns table.columns;const column columns.find((col) > col.property columnProp);if (column) {// …

Flume学习笔记

视频地址:https://www.bilibili.com/video/BV1wf4y1G7EQ/ 定义 Flume是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。 Flume高最要的作用就是实时读取服务器本地磁盘的数据,将数据写入HDFS。 官网:https://flume.apache.org/releases/content/1.9.0/…

Python PDF页面设置 -- 旋转页面、调整页面顺序

在将纸质文档扫描成PDF电子文档时,有时可能会出现页面方向翻转或者页面顺序混乱的情况。为了确保更好地浏览和查看PDF文件,本文将分享一个使用Python来旋转PDF页面或者调整PDF页面顺序的解决方案。 目录 使用Python旋转PDF页面 使用Python调整PDF页面…

【Redis 知识储备】单机架构 -- 分布系统的演进(1)

单机架构 1. 概念2. 单机架构的优点3. 单机架构的问题4. 单机架构问题的解决思路 1. 概念 单机架构, 只有一台服务器, 这个服务器负责所有的工作 初期,我们需要利⽤我们精⼲的技术团队,快速将业务系统投⼊市场进⾏检验,并且可以迅速响应变化…

【攻防世界】warmup (代码审计)

进入题目环境,只有一个表情: ctrl u 查看源代码: 源代码提示我们访问 /source.php。访问结果如下: 我们进行代码审计,发现解题的关键点 include &_REQUEST[file]。但是题目使用了白名单进行了过滤。我们发现白名单…

Redis底层数据库之SDS

高速的存储介质:内存优秀的底层数据结构高效的IO模型高效的线程模型 1. 动态字符串SDS Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是redis中最常用的一种数据结构。 C语言种字符串存在的一些问题: 获取字符…

web-AOP

AOP基础 AOP进阶 通知顺序和类型 切入点表达式 连接点

腾讯云(CVM)托管进行权限维持

前言 刚好看到一个师傅分享了一个阿里云ECS实战攻防,然后想到了同样利用腾讯云CVM的托管亦可实现在实战攻防中的权限维持。 简介 腾讯云自动化助手(TencentCloud Automation Tools,TAT)是一个原生运维部署工具,它可…

链表的极致——带头双向循环链表

​ 文章目录 双向带头循环链表简介:双向:带头:特点:链表带头节点的好处: 循环:特点:循环的好处: 双向带头循环链表的接口函数实现准备工作: 初始化链表(头结…

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中,video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器,并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

HarmonyOS 应用开发之创建自定义组件

在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离&#xff0c…

练习 17 Web [极客大挑战 2019]PHP

常见的网站源码备份文件名和后缀,反序列化攻击 unserialize():wakeup绕过,private类以及属性序列化后的%00修改 开靶机 提到”备份“ 那看看有没有backup.php啥的 如果网站存在备份文件,常见的备份文件后缀名有:“.gi…

系统IO函数接口

目录 前言 一. man手册 1.1 man手册如何查询 1.2 man手册基础 二.系统IO函数接口 三.open打开文件夹 3.1 例1 open打开文件 3.2 open打开文件代码 3.3 例2 创建文件 四.write写文件 4.1 write写文件 五. read读文件 5.1 read读文件与偏移 5.2 偏移细节 5.3 read读文件代码 六.复…

vscode 重命名很慢或失败 vscode renames are slow

网上问题, 插件问题(我遇见的排除,不是)被其他程序占用问题,(我这边是这个) 解决方案: 打开【资源管理器】,使用火绒 或其他软件,查看文件夹 or 文件 被哪个…

集合的学习

为什么要有集合:集合会自动扩容 集合不能存基本数据类型(基本数据类型是存放真实的值,而引用数据类型是存放一个地址,这个地址存放在栈区,地址所指向的内容存放在堆区) 数组和集合的对比: 集…

Python 简单使用 RabbitMQ

一、安装 pip install pika 二、推送消息到队列中 执行pythone方法 import pika import time# 用户名和密码 user_info pika.PlainCredentials(admin,admin)# 连接服务器上的rabbitMQ服务 connection pika.BlockingConnection(pika.ConnectionParameters(127.0.0.1, 5672,…

python核心篇之网络通信

一. 发送请求 1. 发送get请求 2. 发送post请求 3. json数据与python数据的对应关系

隐私计算实训营第七讲-隐语SCQL的架构详细拆解

隐私计算实训营第七讲-隐语SCQL的架构详细拆解 文章目录 隐私计算实训营第七讲-隐语SCQL的架构详细拆解1.SCQL Overview1.1 多方数据分析场景1.2 多方数据分析技术路线1.2.1 TEE SQL方案1.2.2 MPC SQL方案 1.3 Secure Collaborative Query Language(SCQL)1.3.1 SCQL 系统组件1.…

css3之2D转换transform

2D转换transform 一.移动(translate)(中间用,隔开)二.旋转(rotate)(有单位deg)1.概念2.注意点3.转换中心点(transform-origin)(中间用空格)4.一些例子(css三角和旋转) 三…