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

【经验分享】STM32H7-MPU的理解和配置

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU
, C1 M: S+ s7 h1 z一、MPU的作用: U9 O5 G& m7 |) V' ~
防止不受信用的应用程序访问受保护的内存区域+ h- g: a' a9 k2 E) D% ^! ?: E) c' [
防止用户应用程序破坏操作系统使用的数据
/ r5 l: G; k# C$ P$ w$ F! l通过阻止任务访问其他任务的数据区( Y. ^% |+ I. y% ?1 J4 f
允许将内存区域定义为只读,以便保护重要数据。
% H$ W" j0 u( d$ L' w' B检测意外的内存访问
. E- V9 Z- V5 b' e6 s% I" w简单来说,就是内存保护、外设保护和代码访问保护。3 n7 t4 q3 @1 U) w, g% Z7 {
" W9 h* @! A3 s! v
二、MPU的功能实现' [: o) [, q5 p* n  [; W2 S
​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。+ m) D1 y: p6 x3 m. y9 Q

# m' y( u0 l; i& p​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。) V3 M1 g  f' C& m4 j
; d' Z0 R4 h2 y* ?& h. e: j
20210326140155905.png
  r. s; x2 R  y7 ?9 R, g% P6 o
. w( P+ g6 R" `3 b; T. z; J$ E
三、MPU常用的寄存器(RASR寄存器和控制寄存器)
( ?7 S  C2 N1 N) w  _0 D0 h, m3 D3 y$ L, ^8 R
20210326140209187.png

  v3 c9 d. u1 Z6 c  C# N- y) W! P& w7 X& Z) |1 n" H! ~
XN位:表示是否使能指令的提取! G0 W5 r/ e( `, r' G2 t: C
XN=0:使能指令提取,即这块内存可以执行程序代码
' }; v/ m. H/ MXN=1:禁止指令提取,机这块内存禁止执行程序代码, _8 y$ _3 ^! L" K8 W0 Z& ~  X
AP位:设置指定区域的访问权限类型3 b1 s# i; \6 Z' Z+ q3 }# S* a

" r5 K. [$ C+ e
20210326140223302.png

! O2 d/ w9 ~. x7 @" Z$ q5 c2 V
) u3 h% s+ R$ {4 g& t! w% H0 t& r  fTEX、C、B、S位:用于配置Cache的策略3 |0 ~" c& o6 j, j2 T
+ m# [# i& P3 R" Q2 i( V1 P
C位:用于使能或者禁止Cache
; }6 i% n- Q. b& K5 @2 }$ bB位:用于配合C位实现Cache下是否使用缓冲6 ]6 O3 t% _0 d
S位:用于解决多总线或者多核访问的共享问题
# ~* V9 V9 t. U, a  }8 B. C( r  i4 U
20210326140245895.png

9 n0 }6 x% S& `1 S- x7 v* @5 }- J+ T- _7 S4 t
20210326140254565.png
% N! F( h+ }% c- i" p, s

9 g( _/ Q# r3 `read/write-through/back/allocate的区别:

1 w, s4 H- p( c/ g' U7 ?4 G5 Z. D- g( B" R/ z4 P. v% U7 C) I7 m
一、CPU读Cache
. e4 g- L& R! m9 j* Q* @
7 w# u+ [* J7 t- s) A# w0 JRead through:直接从内存区读取数据
1 W% _, X( Y  b2 @& F% c, NRead allocate:先把数据读取到Cache中,再从Cache中读取数据
, c/ v- _6 M: X1 C, F3 E6 }二、CPU写Cache" c9 a0 Q. ]0 f8 j' h

. @& o! u5 _3 Y4 E  t$ M. [若hit命中,有两种处理方式:! E* W5 S7 {* b' w; U) K

9 h/ R! D* |* \# F/ BWrite-through:在数据更新时,把数据同时写入Cache和存储区
; X8 [% W/ E4 K5 X7 O& P操作简单,但是写入速度慢
1 F& i6 r& s, y: W6 q* s9 uWrite-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
3 W1 Z: j) E6 A& j4 F写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
" s% d4 y  }+ c7 ~0 o# ?3 ?& Z! \若miss,有两种处理方式:$ B' ]4 ]% W, X& h$ M! a
" }0 V# O6 {8 m/ I! d
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
* r/ H) f- G0 Z, C4 Y$ RNo-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。& j; G/ f5 n( N' t4 B. _+ e3 i
什么叫hit/miss:
% w* J2 X& |4 S  m1 b2 w; Q一、读操作

7 {* m, K5 i" w5 J' z5 J( b  @如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
7 m3 ^  w, O" ]- c8 u# L; P0 y$ m$ P/ ?3 T0 [/ A
二、写操作
* Y; r, V7 p+ S# i+ l2 i1 @如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。
) g  S! S- `4 X+ P& g  b! G3 [: g* X
SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启# ]4 E  k3 ]. i+ _, e, @& ^. U
SIZE位:配置保护的内存的大小
: ~  A; \; Z  [- m, M9 w: D
% E0 g2 g; Q4 f9 A/ z: \9 O% f- s9 ?. B) N$ J7 ]7 e
四、MPU的HAL库配置函数
( _, h! f% X7 k4 K& GHAL_MPU_Disable:配置前要禁止MPU" v9 H3 g. @5 t8 [
HAL_MPU_Enable:使能
) f- @+ J4 s9 l, y5 b* `* E* Y( G5 l一般使用参数MPU_PRIVILEGED_DEFAULT8 J) A5 C3 H4 h+ ~; K
HAL_MPU_ConfigRegion:配置MPU
/ w5 X2 K3 l+ a3 b6 X/ }5 n
  1. static void MPU_Config( void )/ \' P" s( X: M: D5 t4 V, Q
  2. {
    * I( B2 o) P) y2 L
  3.     MPU_Region_InitTypeDef MPU_InitStruct;
    ; z- h: O- a4 t2 e6 |7 G) B) g

  4. 9 `. j5 ]! A& D' d# A0 h1 F
  5.     /* 禁止 MPU */5 p, d1 q/ j! W5 K0 F( m; p. v
  6.     HAL_MPU_Disable();: [$ u3 |0 P5 \4 f
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */
    7 U: t6 w" J. Z( {' D0 u: Y! s* O5 B
  8. 7 D" x" h1 X. ^: D7 X( ^7 P: ]
  9.     //使能MPU8 c7 x2 `" W; B0 v8 k
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   
    9 h4 j% E3 F. g: ?9 ]- E
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐  q" k3 o+ ^: N6 \/ Q5 t1 ?" l7 p
  12.     MPU_InitStruct.BaseAddress = 0x24000000;
    " W& N0 Z. e( K1 N( }1 }
  13.     //配置保护的内存大小
    ( o! `3 N" p$ z' b) G" n6 v# _
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
    # r- K2 @5 ?: Y3 f
  15.     //配置区域访问权限类型
    . S5 A0 Z& J, t
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    : |" B2 g2 }2 Z* ~
  17.     //在开启Cache下是否使用缓冲
    - X4 Z& H% ?- ^% y$ H
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    ; O; |9 Z  u6 l# W
  19.     //是否开启Cache3 S# D3 s7 D, V2 R4 F5 q% J
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    : g6 f5 r/ B$ h) Y/ k- Q2 [
  21.     //是否开启共享
    1 g9 [9 F, \% m! W. N# t
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
      y+ L* d! s* E
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;) o, M; X0 S! x& @* r0 l' G7 Q9 w6 S
  24.     //配置缓存的策略
    - Y* r1 c/ [" g9 u7 M' g
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;
    ' R; d  R- [  j7 ?( p3 T) L( L$ w
  26.     //是否开启子区域* e# \* p/ ~3 H# o8 h: X- t: W
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    " t2 @! c7 Y5 S- U. [& F) n( {# u
  28.     //指定指令访问状态
    9 ~% H% H5 i7 B4 D
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    / d; T& P8 C0 g3 B' S0 m3 Y  i
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);( _; T: G) O8 h5 u6 `

  31. 1 }# V. w% H1 K" X' M# k
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);9 R* h- ^, y' K' W3 R& A
  33. }+ O. u2 v" z) ~. W8 m

  34. 2 H1 V; ~7 u2 t. {7 u
复制代码

* r5 `# f; J& F# e4 ~
$ ]: V7 r7 @; D0 b0 E
收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版