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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:06
一、前言$ @7 q) s+ U9 F$ r  x/ e) _
有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。6 t& e8 i& Q; A
! d# P* g$ Y3 f  R! }8 X: M$ Z- j) w4 m
二、问题分析
) _) M7 r8 Z! U: Y. \! R% f5 a经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。" ?6 y( m& f) B" ^& A& }

1 k' b" O6 D' B; r: `9 A
微信图片_20240229160600.png & J* |' J7 }. A. T: }: i
( I; D( i$ j; q5 s
根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。- V6 I, a. A, ?0 V6 u
" f# m) [# \& J: o" |' D
微信图片_20240229160603.png * i- z# ?) L* q2 _) [  N; i9 x' Z: r
微信图片_20240229160607.png
8 o" a1 f/ Y: A8 @8 }: p. v. }8 i
1 N& `: @( X# z根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。
- z2 M% n2 B6 H# Z' ~, d9 O6 I# k% `8 Y$ J! [4 y
微信图片_20240229160610.png & D" O/ a$ t( Z" W0 b; I
2 ?" x' g& R- p" f" ~
也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。6 k$ }5 H7 d" v) n; A4 X

& O  @+ x7 x1 y$ j0 H: m' i" f既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。
; l9 P( f! M; V$ P3 C1 f8 h: W9 }9 s7 w
微信图片_20240229160614.png
0 W) E2 w/ C6 M" J: @
' m+ D# l% z% a, v( jOTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。+ E! X: {6 f; F, z- f
0 _# Z/ O0 r! m# R: n
微信图片_20240229160617.png 5 U' u! N  I5 i

7 }6 W: ]# L4 \& ?0 p* Z三、解决方法$ s# O& h9 Z, F9 e" ]
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。* {1 q( ?6 W) q# ~
" y% g# A- k! A' o1 P
微信图片_20240229160620.png
- m6 ]/ C/ W5 Q/ W  c+ |

0 k( M; c4 b+ E$ P+ F
  1. void MPU_Config(void)$ R! D; X* Z1 t+ t# D$ R2 }
  2. {7 ?& c2 X0 j  P2 `8 W" l4 A
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};: R9 Z' p* }8 C" N, ~8 D6 f
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};* @8 I6 A. E  r  r
  5. 5 q" v4 s2 p9 ?! c% r. V
  6. ; M+ E0 w# u% M# Y2 e2 x
  7. /* Disables the MPU */
    ; @& c4 H8 a/ V
  8. HAL_MPU_Disable();# x4 a, p* u( Z" g* I4 \
  9. % ^6 e4 K5 Z! F

  10. 9 v( W, Y+ K- ~8 f" ?* Q3 B9 C
  11. /** Initializes and configures the Region and the memory to be protected7 q1 l" `* t& n( ]7 r7 U% P
  12. */: {0 i+ x8 P: L% i: ]$ w
  13. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    & J' E. X0 g6 O. q$ |
  14. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    # r" i2 ]6 Y+ W$ A$ T" ]
  15. MPU_InitStruct.BaseAddress = 0x08FFF000;
    5 Q; ~, V3 _: l( z5 K1 i9 \
  16. MPU_InitStruct.LimitAddress = 0x08FFFFFF;
    ' W% F1 C: Z4 s4 J- T) e: b4 C$ g9 a
  17. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;( W, @& K1 Y+ Y
  18. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;+ |9 I1 ?! f1 x- k# U( p9 {
  19. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;# {: S. S5 {$ R6 M# j: @  g% K; V
  20. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;$ h" L* S! |) H4 }* ~
  21. 7 Z6 g( z2 l6 ]" X. Y$ B9 S
  22. , I8 S7 \8 p$ v7 {6 A& a( G$ P! X( Z
  23. HAL_MPU_ConfigRegion(&MPU_InitStruct);
    0 d2 m1 T. o2 |3 M4 @
  24. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;8 V# F7 U$ O4 u# \. G
  25. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE
    4 e/ J* H* d) i" z& R4 {9 B5 \7 S
  26. | MPU_TRANSIENT | MPU_NO_ALLOCATE);5 z9 N9 n; ]8 J/ j' Y& _5 r7 ^2 ?8 }$ x1 F

  27. ; U0 b& h3 s3 Y, q

  28.   q7 X2 H6 B2 i! u
  29. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
    7 u8 u/ m+ V( c# M# p% i. n
  30. /* Enables the MPU */6 H# n. H8 M# `8 n' p* U
  31. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    ; h  n* S) {; r' i! B8 u4 m9 L
  32. }
复制代码
& Z- Y# `) \/ s0 j
经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。8 _& \% c5 @0 \* R+ y! C. S
% D# U0 M- P2 P1 Z+ T' [" o7 I
  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;
    + Q0 @% D! u" R3 x* o7 X9 B$ Y
  2. * G* r! ?# b* y* u

  3. - B1 D* J0 B; v& E1 Q; E: `  U1 N
  4. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;. i7 E/ ~  ]" C# H5 F5 ~/ d# ?
  5. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;
      v  F& F1 g6 ]; Z8 ~% ]" `$ b
  6. TS_CAL1_Val = *TS_CAL1;
    1 H+ n7 M# @1 \4 O' o
  7. TS_CAL2_Val = *TS_CAL2;
复制代码
9 n- F4 @( D7 Y; {; J1 ?" q
四、总结
9 q2 Q% a: B5 f8 h0 A; R温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。
+ p; P" `, ^  n. B+ n5 X0 |' y

( V" d! ]5 o1 y, H/ ^转载自: STM32
/ |! X5 G9 _, \( _1 l8 P1 t. Q如有侵权请联系删除- G# `, P0 P. l: E
3 g6 E7 W, x7 ~
( S+ y! m' N9 n# y! _
赞 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 手机版