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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:06
一、前言
$ m) J5 F- z& y* Q" I7 h0 `  r有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。
$ S7 l/ S3 m2 J+ M5 t
$ b' m& l+ w7 k0 \二、问题分析1 R3 w, @1 {% p9 v* P2 V
经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。9 M$ z) t2 D7 e& i6 H
6 m, [" l( f7 i6 N  j4 \" _
微信图片_20240229160600.png ' ]% q8 x" M& A6 [7 _
3 ^# N3 ^2 J7 z6 H) r. E
根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。
/ Z  ~, K5 j2 M1 Q2 J/ K& q/ Q1 H/ t6 r
微信图片_20240229160603.png ; b: Z: e) C! g$ t5 G; f  e% d1 g
微信图片_20240229160607.png : E7 L/ S8 S+ f! i/ h. Q' }6 B  s

4 V# W: P" F0 O# z- o" G& f7 W% G根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。
+ O7 O  p' t* {' k, y4 u* Q* U3 u: q" L8 E) ]) e; L4 N
微信图片_20240229160610.png
3 m7 Q1 d5 f/ `; O" L4 B8 b

& \, L# ]& V5 H8 @2 F+ M7 Y8 k也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。
* Z  m3 @6 Q" \5 R! M! Y  X: n! F
既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。
' M8 g7 k" t* N* ]: K. y% j1 e  h: I: G% I
微信图片_20240229160614.png
' R" v$ g, i7 d: w! A) h' f3 l2 Y+ J
OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。; l- Y3 j8 P- n" b# r- v, a
' Y# [1 p3 s: z, v" |
微信图片_20240229160617.png
- H  s- ]( u) E3 B- G. A6 m% c% T2 n4 K3 o6 W, L
三、解决方法9 y- }( u' q# C3 s- Y+ e
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。% I) p6 q" T# B2 {3 c

5 ?, [$ ?# R) p' d" C: a
微信图片_20240229160620.png
8 c3 ?0 [) K3 z
( h5 }+ E1 U# p+ ^! U
  1. void MPU_Config(void)
    ! J; v% k& `) D+ b: I
  2. {6 X9 i: I& a! |
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};
    ' p7 H1 H; ]& d  r: j* F
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};
      [( l) K. [$ @* S
  5. , P4 B7 k* h: p

  6. ( {2 d, A% C( `3 ?* M
  7. /* Disables the MPU */
    4 E1 ~2 G3 e9 w! j( H8 ?/ x0 r
  8. HAL_MPU_Disable();$ X/ W* v* H( T1 G
  9. ; {. B( a$ h! K5 V0 `5 l

  10. 3 M% k- ]9 {* P9 \
  11. /** Initializes and configures the Region and the memory to be protected
      S; R4 A  A2 g* d/ x0 s( O
  12. */
    3 z3 D3 b0 b" V3 B
  13. MPU_InitStruct.Enable = MPU_REGION_ENABLE;( o& E! U% ]% y7 ~
  14. MPU_InitStruct.Number = MPU_REGION_NUMBER0;; ^$ a" `5 @) q. I) Y6 S$ o& L
  15. MPU_InitStruct.BaseAddress = 0x08FFF000;
    6 H: n$ b: b& k: A
  16. MPU_InitStruct.LimitAddress = 0x08FFFFFF;: v, T( W, q) Y4 S* T, \
  17. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;9 j. \- U4 J) u6 k4 Q/ k/ ]
  18. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
    # O3 w6 X. z2 O/ g6 j4 @" `  q/ T
  19. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;; J* E7 Q. ?; S% G
  20. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;" J% B$ m# b2 {2 T
  21. 3 k1 Z3 x" B2 C% K5 i' s8 V
  22. # i" o# w) [$ G5 Q2 r
  23. HAL_MPU_ConfigRegion(&MPU_InitStruct);
    9 U" [# G6 a+ s. w0 p4 Z9 {
  24. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;
    - L2 A3 t  Y0 R  W: o* V( Z2 w8 u
  25. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE  V" v  y# P4 k2 o
  26. | MPU_TRANSIENT | MPU_NO_ALLOCATE);
    . B4 L: Q. T$ h0 O% {- w

  27. * e+ B2 h. _6 u: [2 w5 P
  28. 3 G! g% i' B9 Z7 p3 D/ a3 c  x( U
  29. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);1 R2 S0 J5 W9 z0 Q" F! a* Z8 q
  30. /* Enables the MPU */
    % w, {! s- M% N. h* _( e
  31. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);& |; R1 F4 ]" @
  32. }
复制代码

# u/ s7 W2 s7 C, r经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。/ ]+ a+ m0 ?4 w; a! P
! |  J" }& M  u5 {8 O# l( x
  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;& r: Y+ i! @% U7 ?0 g! _
  2. 7 H3 c% ~& l- H) ]. Y) c+ F7 Q
  3. - i6 j. O4 h- T
  4. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;* j- p. S% x- ~
  5. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;. ~# W$ N- q; @! Q: T
  6. TS_CAL1_Val = *TS_CAL1;
    # G6 y: R& a+ J- c5 J  C: J. m0 _
  7. TS_CAL2_Val = *TS_CAL2;
复制代码

) x, |7 ?) N5 r/ p! r四、总结
- ]7 ^* ^" _/ U温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。: T+ K: U, q0 q% v
, I  r6 L% y( M/ ]8 l* w
, u8 X3 `4 o; x( d
转载自: STM32
3 `5 Y9 `& Q, n. \如有侵权请联系删除. L7 ?) U5 A" T& V7 \

+ Y. x4 T5 f& Q# Z# x5 Q+ J* d1 H; M1 ]2 m" q: E, p; m9 ^
1 收藏 评论1 发布时间:2024-2-29 16:06

举报

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

一键三连,学习起来

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版