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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:06
一、前言6 e$ ~% t4 l9 M( Q3 t+ M8 u
有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。
- d1 Q+ {. D$ f  h) `/ W' [9 p. d, J  F0 Y; g: m" x$ d( s: n* W
二、问题分析2 }1 }' D) o* a/ _
经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。
5 J6 n# d' `- Q, p7 r: R# d6 n* x6 m9 `5 ~
微信图片_20240229160600.png
% ^0 {6 ~; N1 B, O8 `" |- N* p
- a/ i! z% J. d! b根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。: T' ~  t% R: L. F% N
( v7 m; e+ R9 C3 y* p/ [: h" b& M
微信图片_20240229160603.png & v3 r& F) `2 t( Y4 O8 I
微信图片_20240229160607.png
1 p$ R4 p0 ^* q) {
& Q) J* t# g0 |& }根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。
) Q8 Z0 @7 c6 G1 |" Y7 n. ]  O6 h4 Q7 r  u# U$ K  E
微信图片_20240229160610.png
$ Z" K4 y9 ]' E3 ~) b9 ?. d4 g3 ]+ V

" _& V8 S; G4 }9 d. Z) Z$ h8 a也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。$ s5 E  k5 }' F2 U  X! M
6 w0 e+ g) z# |+ t4 j* C
既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。
& X# d$ l. N& G, y  F# S& A5 P3 j. `  |, [) z4 ~
微信图片_20240229160614.png , l; ?+ ?" c* @1 m0 u6 t3 u- _  @+ Q+ B

1 e& M8 l6 F- [OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。2 n" q* [4 w; ^# e# [2 U8 Z

5 a) I0 \8 X7 \/ r: Z* F 微信图片_20240229160617.png ' V: m: o+ m) U# i  X/ S. f
  ~' b- i9 B5 e) n* G) O
三、解决方法6 Z9 [; S: S- A- B% b3 r
经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。) D  r( }) ?2 {; w6 g4 e

5 H; X% G8 {% \# O
微信图片_20240229160620.png
% \- B3 L+ I9 ^7 b+ L4 x$ k  X/ ~

% z6 W1 u' i  q! k
  1. void MPU_Config(void): I( v! q$ n. C0 }1 A
  2. {
    4 X: g+ p+ P2 j9 j" A) j
  3. MPU_Region_InitTypeDef MPU_InitStruct = {0};- U9 ?; f% e/ I1 {4 p
  4. MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};2 N! Q+ z6 i' C; h
  5. " O* \& l/ ]. ^( ~& z' [
  6. % S) Q& z5 }) R' M0 ]
  7. /* Disables the MPU */
    " D( g4 K: {' k0 f- o
  8. HAL_MPU_Disable();
    , l* }% @' C4 p7 q  s
  9. ( w8 i' V' _( Y1 o6 c+ ]
  10. % f7 o9 g9 r. t  A$ b3 i
  11. /** Initializes and configures the Region and the memory to be protected
    % c* q2 v& P6 {
  12. */
    + ^3 ?# t$ H2 X% [( h  B) h: k
  13. MPU_InitStruct.Enable = MPU_REGION_ENABLE;: @; ?' k% D# E
  14. MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    * O$ a! z' m2 e' L) C" ], D2 T
  15. MPU_InitStruct.BaseAddress = 0x08FFF000;. N/ A) {; H  t; e% R
  16. MPU_InitStruct.LimitAddress = 0x08FFFFFF;0 @4 V: f4 [9 z
  17. MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;* i2 P/ R. V: w4 P  p
  18. MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;3 @$ V! s) {3 F# X$ ?# K
  19. MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
    * O  ?- K. B- X; h7 ]8 r
  20. MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;" E, Z, z: ?: I
  21. . }& m# U" e* s. ]3 W% J, d
  22. ) r4 T% P: e$ e: a+ ?0 e0 @6 e( q
  23. HAL_MPU_ConfigRegion(&MPU_InitStruct);
    2 k9 X! c* z( p
  24. MPU_AttributesInit.Number = MPU_REGION_NUMBER0;
      |4 R4 r/ X& D/ K. d9 `
  25. MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE' n/ b- V' Q* Z& c
  26. | MPU_TRANSIENT | MPU_NO_ALLOCATE);
    4 }" \2 n/ b/ s

  27. * l2 w' z& f1 T$ S- w
  28. 7 Y4 K4 w) B  q7 H# O% [
  29. HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
    % H# F: t# w' \8 F+ A9 k
  30. /* Enables the MPU */; j0 N) N; Z3 ~9 w1 c! B) W/ C# ~
  31. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);* n) g" h8 X0 @3 b, T
  32. }
复制代码

) \5 f) L7 k% N' U经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。
# u4 ?+ I5 Q$ @7 Q7 Q) T8 j# N; Q- R' A/ d# u9 P
  1. uint16_t TS_CAL1_Val,TS_CAL2_Val;
    8 Z3 `9 i- @. j+ Q2 O/ w7 B

  2. ! P/ L% d6 O. n  g4 m8 t

  3. : ?" g; f* f) }
  4. uint16_t *TS_CAL1 = (uint16_t *)0x08fff814;) |# r' T8 @. v; b# Y4 X* e
  5. uint16_t *TS_CAL2 = (uint16_t *)0x08fff818;0 u% i2 H( v0 f' H
  6. TS_CAL1_Val = *TS_CAL1;
    5 v" c) u# _* H9 [
  7. TS_CAL2_Val = *TS_CAL2;
复制代码

$ K% D4 r1 k$ d四、总结
- d6 Y7 W  b4 h8 c0 A. R2 D温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。
& X$ y/ _$ J: _
2 U- a$ d8 b. _: V* _( s# a( w4 L* J% T/ I
转载自: STM32
) S4 G3 P, C& ~# Q如有侵权请联系删除5 H% G# E7 q: C' h: |

) H6 y/ E9 z/ L4 ~( l# U" r& l2 O2 @  H( b
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 手机版