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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:06
一、前言/ R6 ^+ b% n7 K+ _4 B1 ]: z9 R& `. D
有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。! Q/ x' ?( g- @. U) K8 `2 Y

0 U8 f: C4 S: z9 `8 ^二、问题分析8 X$ V/ w& K: g; a3 E+ o
经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。- {1 c. E& u; @, f

) Z9 @/ M+ y% x) }1 m) y
微信图片_20240229160600.png 4 k) u3 `0 Y/ S. j+ O

+ a/ F3 n7 N, M2 U5 Q根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。
; R$ A. r0 C4 v
3 O, i7 k2 L0 K" {) a& {1 `* L0 h
微信图片_20240229160603.png
$ ?4 l; D6 m% f( F) H 微信图片_20240229160607.png
' d1 L' t: W% E
/ I  I2 d; M8 O  n5 Y) ?; y5 ?根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。2 N. S* Q6 Q/ ?. n

' o0 f0 x  `& N* Q
微信图片_20240229160610.png   [; f  {/ R1 _/ l9 h0 z

& n: y6 N* R: k, N也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。. s* A" v; E1 m' `) D) z

5 u# ]& h9 ^2 R% I  P8 l既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。, ]: d8 t- c. E  n8 |/ S

# M: O3 [/ V9 m5 t& C5 ~
微信图片_20240229160614.png
: \' Z3 k! p6 h0 A, G8 G' D  d0 p* R& S5 }
OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。: L; z" \+ G, d" z' |
, ~. ]- p* F4 F2 S1 D+ \9 U% I
微信图片_20240229160617.png
* ~7 G2 i7 Q# s' J% O7 C  s. ]5 w% ~( b7 P8 |3 f% X
三、解决方法( u/ J3 c$ r/ S& q/ W; ~3 Q2 H! `
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。  R# y/ Y% N  d7 M1 S# T) A

  s! X& A/ N, F  y" }  ?" {
微信图片_20240229160620.png
' X6 X& G; {2 i, i

) S% O8 x4 R9 q( P3 W( ]. h
  1. void MPU_Config(void)1 k* q  a/ `7 e6 E: X
  2. {
    ) w! v! J2 D& T& f
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};# m1 k5 W4 C1 ~; \5 ~8 B1 x
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};
    0 M# C4 H  D( C& N% e8 o
  5. $ ^; K7 C' P; S/ C% u& U6 [

  6. ( O: J6 H( z& o# X8 a' h
  7. /* Disables the MPU */) }* f: c7 c+ Q9 F
  8. HAL_MPU_Disable();5 s8 X4 T7 y$ w9 a
  9. ! M/ V* r, j. f6 ^

  10. 7 `! R$ n- b6 W# c! X) \8 v
  11. /** Initializes and configures the Region and the memory to be protected
    ' x6 G2 Z2 A- p
  12. */. \& P1 W3 }6 e' I- w- p. v  i
  13. MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    $ q, J. I" F5 P1 T1 j$ N
  14. MPU_InitStruct.Number = MPU_REGION_NUMBER0;: b+ I6 d, r/ s/ |7 F
  15. MPU_InitStruct.BaseAddress = 0x08FFF000;
    5 G: M" B5 u9 z4 u& }$ d
  16. MPU_InitStruct.LimitAddress = 0x08FFFFFF;/ s7 p, f% j1 {7 ]& s9 g
  17. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;
    . b$ B9 N5 E- |/ q) ~
  18. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
    % n6 U9 ^' `3 J2 _: X4 m$ ]0 A- [
  19. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
    & o& Q% O( e! u& V* E- l& \+ y# F3 A( p
  20. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;6 t" z+ ~% g4 y+ q0 @

  21. ' ^! b0 S# r0 T. C/ E/ E3 E4 a

  22. 1 I- n! i0 x2 [
  23. HAL_MPU_ConfigRegion(&MPU_InitStruct);
    0 I) z6 w& v8 w/ p1 H$ A7 ]
  24. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;
    ! U) x; ]& u/ ~1 l% O
  25. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE
    1 C5 E; O# |4 F
  26. | MPU_TRANSIENT | MPU_NO_ALLOCATE);, [0 O# X. p$ q6 p9 J5 w

  27.   a3 d( Z' p) ?, V  P( U
  28. & K1 U  a% Z' ]5 y
  29. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
    * q$ D  ?, w. ]8 l+ c; _
  30. /* Enables the MPU */
    ' B  b4 G; a: t, {
  31. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);, l( Q1 B% f( ~& P, f5 o
  32. }
复制代码
" s. ?! |  f' E1 ^" v/ s) f" K8 v- v
经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。" c8 T8 w% J, X1 Q

; J) u4 J( {2 f+ J, L  @8 e1 y! x
  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;
    - B- ^0 Z" m5 J: f& S8 a( W
  2. % P1 z3 f; T/ c* [9 J

  3. 2 e- V3 q) u1 H9 z+ s1 r2 q/ i: r
  4. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;
    ( b( s, v2 _3 C, V" E2 U
  5. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;
    * E) l# i7 A) C' S" J
  6. TS_CAL1_Val = *TS_CAL1;
    " _0 A6 }/ c3 T8 V: M. G% b  L
  7. TS_CAL2_Val = *TS_CAL2;
复制代码
% R' T- N2 X. u9 e: ~" N4 F
四、总结
- j6 a5 ?. q$ F温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。$ ~/ y1 o& E2 y; Q

: W( e. z. ?! a  I
5 r; P$ O* \; S  k) m, l- y/ U转载自: STM32. u8 O( y6 }* s$ j" l: h) c$ k
如有侵权请联系删除+ r$ X/ u/ g; w3 O% u8 M9 m1 N. H0 n

6 ]8 K# S. l: J1 p9 v: e& N6 J/ l' ]$ ]2 W' ^8 ~7 R5 f
赞 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 手机版