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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:06
一、前言  ^8 F; ]0 M, G6 A  F( W  |
有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。0 b* R6 y$ b+ |% @  R6 z
" _3 D7 G( H4 q2 L5 j- Q
二、问题分析
6 m* _  \6 z. o; b, ?8 k经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。
8 U1 t# p& a- I' J5 R1 L. L" y9 L
0 L& ]6 x( P1 m! H" E) t* q1 w
微信图片_20240229160600.png + U2 S" N. r- B- n4 r9 L% p
; p$ k7 y9 k* S# k+ E- F! l
根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。; P# h" g! L4 H8 d; t; h5 z; W8 B6 G
) p" d( f' g* A4 M8 a
微信图片_20240229160603.png
2 J* _+ U, h, Y. q# J4 q1 F" e0 k% S 微信图片_20240229160607.png
  M7 |. y4 _7 P# R# k+ T/ K, T, g. ~5 R' v
根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。8 h/ i" y. a) h4 o8 K( x
1 L; q" X: e2 `- O7 t9 h
微信图片_20240229160610.png 0 y$ O& c# m5 \: f3 O  x' ?4 }
8 a& e* y; n8 y. d. C8 r
也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。
  }4 c. A1 a/ s: j+ K# i
/ T/ L! P% V+ o7 p) N既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。( T2 [; g  R: x/ o6 O* [

3 q" b  d4 I* [% `
微信图片_20240229160614.png
* A4 m5 W  J) J' m+ {' N, L* Y( a! ~( u  ?" ^5 r4 `7 \
OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。$ D- [# d) f7 Q) F; w
  I9 W% ^9 K3 s0 u) P
微信图片_20240229160617.png . S8 X* W+ H" m1 @7 @, a* f5 l
" u9 B. k+ F; t0 Z2 Y6 Q* K, [
三、解决方法* t' {) E9 d8 o* D- z' g8 v
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。
4 S9 t% l! ^( Q8 |" g9 c0 u7 k: `" p" b( u3 y" _/ T5 C. z6 U
微信图片_20240229160620.png
/ o1 \2 ]' t- w

" |1 F' D/ ^% s2 p0 f) m7 R. c
  1. void MPU_Config(void)
    : G* c" g8 D* f+ s
  2. {
    6 A2 q% T; o- ^, _" D" h8 W
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};
    9 \% d" _* `, B$ ?, V+ _* I& B3 Z4 _
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};/ ^: T! |' ~9 h0 z

  5. 6 {. l6 B% ?0 M( P3 _

  6. 1 i" _; H3 A( `0 k5 I
  7. /* Disables the MPU */$ S& U4 p# ~; t  e5 @$ P% T% G
  8. HAL_MPU_Disable();: G' p+ g2 h( S8 ?5 ^8 V/ I0 C
  9. ! P/ p6 k( Y: ]* h8 n. A: B
  10. * `- T$ M, M( @3 s- g2 y
  11. /** Initializes and configures the Region and the memory to be protected9 u: V+ D! }( ^
  12. */
    : T! Q# {" [. n, l4 F" {. t4 D
  13. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    # }6 ]( l  D0 N) |; \# c
  14. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    ; l' o; E( q1 M* f6 Z8 x
  15. MPU_InitStruct.BaseAddress = 0x08FFF000;2 `0 ]6 l4 X: U6 p8 i
  16. MPU_InitStruct.LimitAddress = 0x08FFFFFF;- I/ ?8 c9 u) [% {+ Z" f* y3 [4 Y" s* l
  17. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;! g8 e* r4 Z% I! a2 g* U5 D, W
  18. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
    % ^5 i( p- l9 ^! A
  19. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;9 Z6 B3 q! g% |* U2 ^/ O0 W
  20. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;! O7 P  A3 R' F, K6 g: w* h6 P$ i
  21. ! y- E; D& }% R- l2 p
  22. 6 R' w5 Y* V% {5 T- [
  23. HAL_MPU_ConfigRegion(&MPU_InitStruct);: Z, p* F0 Z- ~/ t' e; W
  24. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;, j$ J( t' F; V, {* R; Q' I9 O
  25. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE0 q4 J% \! s  w* I, T) N
  26. | MPU_TRANSIENT | MPU_NO_ALLOCATE);, x% }& ]( A. O. p! d8 j% Z

  27. ) W7 j' m' Z+ F# n
  28. # z; \+ }! n. N4 ?6 o
  29. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);8 O- I& O; p$ w4 E
  30. /* Enables the MPU */* O" `* i/ V) ~( L( d2 J
  31. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);7 x* j/ ]  q) v, y
  32. }
复制代码
: l6 }8 |/ ~" X% l
经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。# M& m4 [" N6 d" n& u% F

1 b. N; f* G: b: X
  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;
    ' f. W/ j. F$ Z0 N; v

  2. ' Z/ B7 R/ b# M! x: F& W, Z

  3. 0 n; u' \8 _4 g$ u+ u
  4. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;
    & ]/ j: Q+ j% m/ o8 A% B2 D
  5. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;2 U8 K  \% N, r# w
  6. TS_CAL1_Val = *TS_CAL1;
    & ^9 j, A) a' S' a$ M. J
  7. TS_CAL2_Val = *TS_CAL2;
复制代码

; A+ d* f1 Q# u4 v8 {四、总结- S& V. r. F6 H2 E( O
温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。
7 @. t- N9 m% Z  v. [8 |7 X! \+ a8 ^$ P
1 t% i8 U0 o3 F9 T7 x4 J7 E  U; |& Z; s
转载自: STM323 m- g& V4 l7 U% X
如有侵权请联系删除3 x" S. R6 p+ ~. w- P4 {- I5 m3 g. n: E

2 d2 @( [2 j% k2 |/ `. D
: n8 z! l) }  M: i
1 收藏 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 手机版