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

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

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

相关文章

ZCMU操作系统课程实验 - 实验1-Linux的使用

登录 1. 打开这个东西 2. 在 文件 - > 打开 中打卡机房里VMOS文件里的这个东东 3. 然后依次操作下去好了,有红色的选项,我都是选的"Do nothing"。完成后就会出现这样一个黑框框。 4. 让你登录。输入:root。密码&…

正则表达式浅析

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很…

【技巧】如何解除Excel“打开密码”?

给Excel表格设置“打开密码”,可以保护表格不被他人随意打开,那如果后续不需要保护了,不想每次打开Excel都需要输密码,要怎么去除“打开密码”呢? 今天分享3个方法,最后一个方法记得收藏起来,以…

有哪些绝美的古诗词呀?

编辑搜图 请点击输入图片描述(最多18字) 绝美的古诗词是中国古代文化的重要组成部分,它们以优美的语言和深邃的意境,展现了古代人们的生活、情感和思想。以下是一些绝美的古诗词,它们不仅具有文学价值,更…

微功耗轨至轨运算放大器芯片D8541和D8542对比分析

D8541和D8542是芯谷科技推出的两款微功耗轨至轨运算放大器芯片,其中D8541为单运放,D8542为双运放,它特别适用于NTC温度采集电路、ADC基准电压电路、有源滤波器、电压跟随器、信号放大器等电路应用,在新能源充电桩、智能充电枪、储…

c# 插值搜索-迭代与递归(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素,跳转搜索需要 O(? n) 时间,二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进,…

GaussDB云数据库极简版安装与使用-新手指南

一、前言 作为一款领先的企业级数据库管理系统,GaussDB 提供了强大的性能、高度可靠性和丰富的功能,是企业构建可靠、高性能的数据库解决方案的理想选择。 本文主要针对高校和个人测试环境,介绍极简版安装和使用过程,更加适合高…

深入云原生:解析 Docker 容器、Serverless 计算和微服务架构的实战应用

文章目录 一、前言二、行业顶尖技术实践精华集概览三、腾讯云容器和函数计算技术实践案例3.1 精选集中的 Stable Diffusion 腾讯云云原生容器部署实践3.2 精选集中的数数科技大数据查询引擎云原生实践3.2.1 大数据查询引擎技术痛点3.2.2 基于腾讯云云原生解决方案(一…

Netty学习——源码篇10 Netty内存分配ByteBuf基础

1 初始ByteBuf ByteBuf是Netty整个结构中最为底层的模块,主要负责把数据从底层I/O读取到ByteBuf,然后传递给应用程序,应用程序处理完成后再把数据封装成ByteBuf写回I/O。所以,ByteBuf是直接与底层打交道的一层抽象。 2 ByteBuf的…

非关系型数据库之Redis配置与优化

一、关系数据库与非关系型数据库 1.1关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用…

【漏洞复现】某科技X2Modbus网关多个漏洞

漏洞描述 最近某科技X2Modbus网关出了一个GetUser的信息泄露的漏洞,但是经过审计发现该系统80%以上的接口均是未授权的,没有添加相应的鉴权机制,以下列举多个未授权接口以及获取相关敏感信息的接口。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律…

Linux中间件(nginx搭建、LNMP服务搭建)

目录 一、安装nginx 第一步、下载nginx的压缩包到Linux中 ​第二步、安装依赖 第三步:安装 nginx 第四步:启动nginx 第五步:测试nginx 二、 nginx的配置文件 nginx.conf文件内容解读 案例:发布多个网站 二、lamp/lnmp …