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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:06
一、前言
9 t  P7 K2 @! l* m. y1 m有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。3 p4 R. i# k% i  K6 D7 S9 L% m
3 a0 s: C- W. H6 p9 p: n
二、问题分析
2 L4 {, V! r5 {, W& H5 x# Q经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。3 E- f) |3 Z. K. {- j( H- ]
% L' k7 a# k# p; S! j0 G& _4 T: q
微信图片_20240229160600.png / n& p! Z- K1 T8 ^. ?" e

$ c+ x, Q6 I3 T! y# O* U根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。- c! ?" N& J  H) `3 ^2 m7 m( _; Z
/ E* _5 M& V/ E- k
微信图片_20240229160603.png $ h3 U+ l/ q% ?, E/ x
微信图片_20240229160607.png
; C; I+ p6 v1 l8 K
$ N: Z9 R9 E: t" h* R根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。
/ g; U5 G7 m: t) f( [: i' \! {
1 N- `; p& n1 J$ J8 K3 {# h, \  C+ ^
微信图片_20240229160610.png - N. a& U" P2 i) F

' ^8 W% T( z5 @; i也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。
, J' f5 m% V9 t8 e  w4 z- w$ j5 Q
5 b+ }. X+ j7 H7 W既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。
' j! c! t: n2 u6 |3 S! e. G  B9 Q3 f' E7 K; o- m# i/ X
微信图片_20240229160614.png
" i2 r1 k/ d4 w" J- v4 m$ w) Z" Q
OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。
- K) I0 O% r0 j# @2 K, [( H0 ~$ H) i# i9 l5 c
微信图片_20240229160617.png
# U8 T) J" a* n0 Z5 Z! d4 `4 n6 p1 B' S! O
三、解决方法: I5 ^0 o7 }2 l3 g8 g# O" a
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。2 U( u0 e* l* m% X! _
* w8 C0 N2 Z+ L* I" k
微信图片_20240229160620.png
- i, S9 ?. I1 N8 E" _- q

; L2 @& Z2 v  z$ K
  1. void MPU_Config(void)' K4 u; m. a( }1 w) r
  2. {
    ; }4 Z. A% y0 Q( F& E7 e
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};
    3 t/ s; {0 p6 J) q1 b& O3 y
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};6 B, ~: h3 W- D- n  ?7 B

  5. * i( X5 q! y5 }$ q8 W, Y  H. j+ D
  6. 5 p4 Y' z9 k9 [* f& ~* ~$ E& a; K( x
  7. /* Disables the MPU */! E8 J1 g7 o3 {$ E' f* ?
  8. HAL_MPU_Disable();
    ; X: N+ |: V9 a0 I& ]3 E$ F- D
  9. % F! p* N9 \. j; O# g9 j

  10. 9 J% |% s/ ]: Y2 g. Q; @+ e; V4 D
  11. /** Initializes and configures the Region and the memory to be protected' k/ E2 ^' q% E+ O, Q% W
  12. */9 J" a; s$ x$ C7 v: N# G* l" j
  13. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    6 s, l1 e5 G* `/ y
  14. MPU_InitStruct.Number = MPU_REGION_NUMBER0;; j8 |. T7 C8 ~/ w" e
  15. MPU_InitStruct.BaseAddress = 0x08FFF000;. }) w# t7 L" U3 n
  16. MPU_InitStruct.LimitAddress = 0x08FFFFFF;. b! X5 f% |5 {( V% N; j" P  d; ]
  17. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;
    2 R& ~1 p3 A9 q$ o: D8 Y
  18. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;8 m# y: Q: v3 C. F  ]: s' w
  19. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;  y, X/ n& [, k4 T) k/ Z2 ~
  20. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;! N! U5 M; c- h- _* U9 e

  21. + F& u7 T" l$ C9 r' w# _- U+ W
  22. : m( l/ k7 z+ d1 Y, ?4 F
  23. HAL_MPU_ConfigRegion(&MPU_InitStruct);
    : S* y5 K) V! N
  24. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;/ F& {* h3 R# Z5 X+ ~  K5 Z( w
  25. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE' J" {; |2 j8 Q& F+ \8 e( \
  26. | MPU_TRANSIENT | MPU_NO_ALLOCATE);
    * s' z) u" A( H4 C
  27. 0 d- m& p3 R7 q+ P. T: s; q

  28. 4 S' K2 b: d' N# y. l: _
  29. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);  q3 o& `7 ^0 g3 V) F
  30. /* Enables the MPU */6 @3 |9 N3 b; X# }
  31. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);: l' a0 J5 z) A+ S: e$ U( k/ W
  32. }
复制代码

( u& J/ Y& s4 @: t8 q% j经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。
& h' B1 M* _/ D+ ?. F/ W# a$ R
  k7 f) d) A& _
  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;
    4 ~. Q' S+ n% a* e$ h

  2. 1 G2 Q0 w: u' E9 n7 E6 f/ S. C7 }
  3. * b( e' y- a' F7 X: D
  4. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;9 W9 R7 A, O. D7 o, b6 b8 p
  5. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;0 S5 D' Z) o. y5 G0 U# S
  6. TS_CAL1_Val = *TS_CAL1;
    ! Q: j. @) ?8 w5 `. l
  7. TS_CAL2_Val = *TS_CAL2;
复制代码

  j$ v# R  a4 H0 W四、总结
0 G1 }, y$ c& I温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。
# o4 C0 }2 O% w$ n+ Q, }/ d' v8 e
, x# F! w! e6 }% T
转载自: STM32
2 a) c  E, V  h6 E* i: f6 a" I如有侵权请联系删除
" k: B* V" m% M8 K' o' B3 u, k. O; k* U! t+ b( ~7 b
' c( Z& c- J- v5 B: r5 g
1 收藏 评论1 发布时间:2024-2-29 16:06

举报

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

一键三连,学习起来

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版