你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32H5读取温度传感器经验分享

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

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

微信图片_20240229160600.png

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

微信图片_20240229160603.png
微信图片_20240229160607.png

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

微信图片_20240229160610.png

也就是说,不仅是 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。

微信图片_20240229160614.png

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

微信图片_20240229160617.png

三、解决方法
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。

微信图片_20240229160620.png

  1. void MPU_Config(void)
  2. {
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};


  5. /* Disables the MPU */
  6. HAL_MPU_Disable();


  7. /** Initializes and configures the Region and the memory to be protected
  8. */
  9. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  10. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  11. MPU_InitStruct.BaseAddress = 0x08FFF000;
  12. MPU_InitStruct.LimitAddress = 0x08FFFFFF;
  13. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;
  14. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
  15. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  16. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;


  17. HAL_MPU_ConfigRegion(&MPU_InitStruct);
  18. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;
  19. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE
  20. | MPU_TRANSIENT | MPU_NO_ALLOCATE);


  21. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
  22. /* Enables the MPU */
  23. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  24. }
复制代码

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

  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;


  2. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;
  3. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;
  4. TS_CAL1_Val = *TS_CAL1;
  5. TS_CAL2_Val = *TS_CAL2;
复制代码

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


转载自: STM32
如有侵权请联系删除


1 收藏 评论1 发布时间:2024-2-29 16:06

举报

1个回答
xu@xupt 回答时间:2024-3-1 16:59:57

一键三连,学习起来

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版