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

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

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

6 ]7 `% O, D7 m! P0 I( ?: Y! a二、问题分析
( @/ q" b: V( }, F5 a" m9 v经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。
  U+ t7 a$ W$ O' a8 t  W
8 B. f2 S& ~7 h2 y/ I
微信图片_20240229160600.png 5 \- F( Z, p$ f

$ }' _# c7 h( Y9 V7 f根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。; j0 B* c9 X  v* g
' F6 w1 j: K# F7 _& C
微信图片_20240229160603.png 4 f+ o* f! S4 S
微信图片_20240229160607.png
$ p. p* H: H; B2 _2 v% C+ b) U2 z. x- r7 N6 u
根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。
* n1 }8 N6 P& G1 d' S! Z  j4 }4 y0 ^: o5 i8 b7 ]; e7 t
微信图片_20240229160610.png
! X. w! e. @: ], X& |+ n

( D1 g: F# ^* }1 l+ V也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。
" L" `. p) l# E, q5 X
: P; F6 j( K" ^! |  X' P% u0 E既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。# H( e4 P! F. k4 f" u
( J+ e& Y( f6 f3 S
微信图片_20240229160614.png 0 U' h' `2 h9 G
) q' E' x# I1 w- [( h  s" d& W
OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。
& d% F3 M& z) F+ M1 x; h  R0 b! ^' v# K9 G) X
微信图片_20240229160617.png & `4 o. T: U( e; y" n. y* Q( \( J" }
4 y9 X7 [! U+ k$ q
三、解决方法; B1 J: F- L. N9 Q
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。
% V4 N- j7 N2 A9 N. K2 s1 D* h  M) P9 n! }* Z
微信图片_20240229160620.png
1 r. g. ?! I6 M! b& U' @) R) S3 e$ d( c
$ S# o1 @# P( g
  1. void MPU_Config(void)' d( r# K5 u7 D2 T
  2. {
    % ?; ]& i. ]* h" ]8 D
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};8 p) i# d; [( ^
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};
    ; q2 E6 y- k# H9 v& a( s3 f/ a
  5. , o9 ^0 J; W8 M- }* [  a, _4 C

  6. 3 C7 f( g: y2 X* l+ {; S
  7. /* Disables the MPU */
    , U$ e, B4 H! L/ K
  8. HAL_MPU_Disable();0 ~; I' g/ e: |1 n9 B5 |9 b3 O: h, E
  9. 4 L' y, T3 Y% x

  10. , `2 Z* @. n, a" y
  11. /** Initializes and configures the Region and the memory to be protected
    5 D! G8 `2 ], r) z0 a4 \0 C" X
  12. */9 K. l) C- _, l
  13. MPU_InitStruct.Enable = MPU_REGION_ENABLE;8 ]3 E" B# Y( I" s
  14. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    : }( s! y6 z  Z3 p; l! V! j; M
  15. MPU_InitStruct.BaseAddress = 0x08FFF000;4 t; t9 e& \) X4 t5 n2 l" u0 u) C9 _
  16. MPU_InitStruct.LimitAddress = 0x08FFFFFF;
    : b6 `& I% D$ W) @1 u2 M
  17. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;% B* X5 t: Z/ b$ S, }& \
  18. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
    8 ]( y, G. w0 @
  19. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
    $ E' [  {# g! P
  20. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;" t, Y- X" E6 D

  21. : X$ `8 U7 B" X8 m
  22. : y! m. [2 m3 |2 }& b
  23. HAL_MPU_ConfigRegion(&MPU_InitStruct);
    " R! Z. d, r/ l3 \" \7 N+ Y1 w
  24. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;
    / ]' s) I1 K0 ]2 H; z
  25. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE. t5 s. F" ~5 o8 a! a
  26. | MPU_TRANSIENT | MPU_NO_ALLOCATE);, v. V9 m8 U/ c# y
  27. ( e! q2 @+ H# F: H. h  F

  28. ! g' F9 X/ m2 F* J: }
  29. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);& F- |! \( h7 C7 M4 ?2 }' S8 }
  30. /* Enables the MPU */7 x  I  m# _' s& {7 s7 `
  31. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);# W+ b1 g- |" A; X; d+ O
  32. }
复制代码

2 R. i4 f( [  G3 t& ~- c经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。
+ \. J7 K3 M5 ^6 ?0 V
7 Q; y- i% Y, W
  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;1 |! J& i( T  A/ o6 `, x
  2. + L* X( M" I! j9 o' t9 F' L

  3. ' N# P0 G/ A* h2 `5 e
  4. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;
    : W: i' [) N6 i, B
  5. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;; c- A# `% T0 p  F% ^- i7 L# n
  6. TS_CAL1_Val = *TS_CAL1;
    - h0 b( D+ S; U8 `. g3 z3 c1 {
  7. TS_CAL2_Val = *TS_CAL2;
复制代码

9 v- P6 Y5 h! W+ N四、总结5 }' Q* `2 E, u: P6 V9 \' d
温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。
% g% n' }: I& l) w  |. O
# q# }) N; n5 f$ ]8 V$ |2 h6 ]8 h
转载自: STM32
. a7 `& r, R& \, o. b, q* e5 w如有侵权请联系删除8 H& j2 ?4 I1 U0 P
  }# h2 N+ r6 W) K5 \2 F

$ W3 C' L6 u1 s2 A% i. x
赞 1 收藏 1 评论1 发布时间:2024-2-29 16:06

举报

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

一键三连,学习起来

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版