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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU6 v$ Q# J# M# b; Y9 s
一、MPU的作用
# l0 V6 U2 x% s  N% F5 @; l防止不受信用的应用程序访问受保护的内存区域$ X7 @5 ?; Y2 M. \+ u. |
防止用户应用程序破坏操作系统使用的数据
. R  X' v, H' L" b2 V0 w通过阻止任务访问其他任务的数据区
6 i! ?9 Q  @; q! @+ i允许将内存区域定义为只读,以便保护重要数据。- Z( @" T. [# ~) H& ^8 \( Q0 S' c
检测意外的内存访问
/ ]9 s' W* l- b5 r简单来说,就是内存保护、外设保护和代码访问保护。  g5 r4 R" h: U8 e" y; |: h
+ b5 g! h* }+ z8 e4 Y: d
二、MPU的功能实现( W+ O" v- Q6 F2 T+ Z1 f
​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。
5 z/ X+ o6 x8 ^5 I- C
" V; B/ ]& }; J$ S0 P​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。. `/ N( L8 G4 c- u; Z0 Z7 o+ q

$ E' U0 |) B0 I! g% m8 P0 L
20210326140155905.png

# |5 f: Y7 p& Z3 R+ D' C5 T% `% r! Z1 X6 n3 S; [; ]# F  Y$ l' ~
三、MPU常用的寄存器(RASR寄存器和控制寄存器): O- n. `+ v" l6 J$ z) ?/ b
7 N. N5 G; c, l
20210326140209187.png
6 S% Z4 L& S! A4 D

( r. F1 Z, s  F3 N/ ~XN位:表示是否使能指令的提取* n( J0 F& r  B6 [1 G5 L; g
XN=0:使能指令提取,即这块内存可以执行程序代码
3 m! a9 W" u: p8 {XN=1:禁止指令提取,机这块内存禁止执行程序代码+ V5 X+ @; `  I$ e  C
AP位:设置指定区域的访问权限类型
3 W; |' A  U$ H+ A7 p6 s7 e' E8 h1 ^* R3 y7 f. t7 B% O- q8 U6 {
20210326140223302.png
/ G! o! j' Y- U1 D# M9 |
; ^1 E6 Y6 U. b8 c
TEX、C、B、S位:用于配置Cache的策略
/ J4 L/ o2 S% k6 \+ f
; E: Q/ c9 v4 U/ \5 iC位:用于使能或者禁止Cache
* e( ]( I7 V; d$ o6 e8 x- DB位:用于配合C位实现Cache下是否使用缓冲
. M) `" W0 |7 m/ AS位:用于解决多总线或者多核访问的共享问题/ h6 V) u8 @* d$ {+ g! C

) j# V& p" j" t% f; Z5 E
20210326140245895.png
/ x! l" g, @/ P3 }  W' k- L( i

! u  i/ c+ q! n& r: \, f2 d
20210326140254565.png
4 a: \4 L7 q/ x( j% n' t+ n0 p

4 J. s6 V# {8 k( \% S4 x. ]read/write-through/back/allocate的区别:

3 N3 ]5 p4 S5 q! R; a# s* t5 F# v. L# }  [
一、CPU读Cache
, x; N' }# j2 O# j6 Z+ F: X" \8 m, n2 c  e' X4 g+ h
Read through:直接从内存区读取数据7 U& H( G0 W6 r
Read allocate:先把数据读取到Cache中,再从Cache中读取数据) [' \3 Q( S, h& }. S
二、CPU写Cache
# E& @7 D* {' D5 S) N6 O# d0 z0 R; j; H, M( a
若hit命中,有两种处理方式:1 t# j: D9 ^# b' l- m* U5 E

8 v4 V  \: r9 r" R9 `" VWrite-through:在数据更新时,把数据同时写入Cache和存储区
5 C( l2 ]) b5 n. H6 G2 c" [" H0 b4 t操作简单,但是写入速度慢3 Q' k( v/ z6 b
Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
2 i# _' P+ ^5 q5 r* a9 V3 u7 Q( I5 n3 s写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
2 I9 ~- `/ V2 M# G若miss,有两种处理方式:; \  g4 j- m  ^: l. j, G7 A& ?' N
( f7 `& m3 T$ _
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
1 J/ j$ h' D7 c( `4 p& v/ GNo-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。/ m& }0 W! q# `" E: m+ d
什么叫hit/miss:  W( ?1 V# ~: h
一、读操作

9 f$ k, w6 {. M* \8 q; E如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
: k% x9 X2 o' z9 r
- y3 b! `/ [0 D/ Y5 D2 }二、写操作
3 I9 z  C; y: Y) a) Q% m6 L如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。
. U! b& ^6 `8 R8 p5 Z7 H, E" C& w& ?8 W2 r$ N1 O) p
SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启' z/ ~' n# K7 Y1 m
SIZE位:配置保护的内存的大小0 b, m- u  ?9 U

" }+ `  [: |  v( b0 D8 N# e, c) o+ G2 s$ z0 M- U4 C- h# h
四、MPU的HAL库配置函数8 G' y$ c7 D5 x/ f' b4 Z
HAL_MPU_Disable:配置前要禁止MPU( H% I4 Q8 [3 a+ Y, ~3 M$ l
HAL_MPU_Enable:使能
( h. P$ d" i% Z/ k  ^一般使用参数MPU_PRIVILEGED_DEFAULT2 E5 \( E( w- g4 w
HAL_MPU_ConfigRegion:配置MPU
$ t5 _+ E9 T* u, @7 j
  1. static void MPU_Config( void )* p/ p2 b- h0 m- W
  2. {0 i4 K& l5 b5 o# f2 u
  3.     MPU_Region_InitTypeDef MPU_InitStruct;1 l2 L5 B5 D- f8 D/ d2 ]; F6 h* @

  4. % C  I! K) Q* h- @' g9 _# K; y5 W
  5.     /* 禁止 MPU */
    ; I% Z! c6 @# H+ n! X" {
  6.     HAL_MPU_Disable();9 Q8 \# ^: g" E) D8 T; [& ~- v/ y: S, r
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */: H! ?  y0 T5 y' H5 O- z8 d1 h& t% W
  8. - \. B0 \/ O( P' z& f1 K8 y1 S8 x
  9.     //使能MPU
    6 f* w8 G8 u& H) I
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   4 v. _1 [; [, B% [# K
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐
    4 H5 }' g- R# N) \7 S! ~" z  J3 }
  12.     MPU_InitStruct.BaseAddress = 0x24000000;
    8 j8 E, K5 H  x. W" p( r6 H' l
  13.     //配置保护的内存大小2 O2 V3 s6 Y, X$ p2 Y4 O( R
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;# F6 R5 G7 f- ?+ s
  15.     //配置区域访问权限类型
    ' ]; G2 N( S  o. o3 m
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;4 `+ x  m" T/ a' B
  17.     //在开启Cache下是否使用缓冲
    $ _8 [: J. K* H. v7 W0 z
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    9 u0 B' k- y% B2 ]
  19.     //是否开启Cache3 V0 t4 c( ]0 e" K
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;1 c* M' E+ l! |' p8 {3 b6 _
  21.     //是否开启共享
    , ]( @3 w# G6 s; Y8 k1 h
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;) }" l" v1 b' a4 \6 A* c
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;& G. o5 v, F+ d3 M5 J
  24.     //配置缓存的策略
    9 F! z6 u. E" [7 K0 v' r, v
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;7 T1 P( [; K* J
  26.     //是否开启子区域
    # E5 A, \; h+ H8 \& o; q+ L& Y
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    1 ~$ H0 O# K+ R" V  J% T
  28.     //指定指令访问状态
    8 H" a+ R% `8 P- ?8 y9 [5 v
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;+ Q4 P+ g# o' I( E3 c6 |8 h
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    / h6 c3 u# g7 n! c- l+ ]

  31. ' r$ p1 z  u' X9 F( p2 K
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);+ F/ q8 k; D" U; l' F) O+ a( b
  33. }
    9 G& D7 N* K, j2 A; P1 u
  34. - @* g" X9 i" {4 M3 P( y8 ^
复制代码
$ f  d: J9 z* m1 T3 ]0 x5 D8 i9 Z' n
* b, G! [6 o- u+ B6 f+ j
赞 收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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