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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU
! C; ]; U: g4 X4 a% N* j一、MPU的作用
2 E6 f6 G' P; I5 _. X* m2 j5 [' \* w防止不受信用的应用程序访问受保护的内存区域- w0 N  X, n4 c" a9 o+ D
防止用户应用程序破坏操作系统使用的数据9 J" m4 M: P% Q( d, [: V1 d8 q4 m
通过阻止任务访问其他任务的数据区
5 y8 |2 a7 S8 J& z) O9 s2 H$ W: ]& k允许将内存区域定义为只读,以便保护重要数据。
' W$ b" _$ P- k) y4 m- ?检测意外的内存访问
! z1 o4 o8 a4 h! P. z简单来说,就是内存保护、外设保护和代码访问保护。7 T. s. e9 Z7 g: G

% F/ B" ]4 P- I. ]% e8 O二、MPU的功能实现6 K) _0 O8 k/ ^0 `! @+ e$ a4 o/ k
​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。/ E6 [+ G0 C. \/ u

2 ?  V& B; W; h; }( ~​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。5 n! V% u/ D! ~/ s* S& h- V# B0 u
" q; `% s2 ^' v/ I9 b' F! W' U5 _
20210326140155905.png

* ~* E5 Q2 f. p: V
7 f2 ^% ~1 I2 l3 y三、MPU常用的寄存器(RASR寄存器和控制寄存器)
7 f# ^. h7 [$ M( ^2 g4 [9 Z! D) Z6 r' q) i% y, A
20210326140209187.png

' }6 _4 d# K/ R3 J
8 h7 R: ~; K9 N, \8 V  T! xXN位:表示是否使能指令的提取& f( _# F  Q# j5 E2 z
XN=0:使能指令提取,即这块内存可以执行程序代码
  i0 @# R1 Z$ ^$ kXN=1:禁止指令提取,机这块内存禁止执行程序代码3 |  |$ ~; y4 S2 w, n+ a
AP位:设置指定区域的访问权限类型" \3 X. v) Q* U7 P  H" i. D: V

7 ?# [+ w" m$ y# d$ x
20210326140223302.png
: Z% e' ]  \. s8 I" ]

0 e7 f4 y! G& qTEX、C、B、S位:用于配置Cache的策略
9 h, ~% K9 ?; ?4 h5 K5 f" E3 |/ x+ c  J2 w" I6 n
C位:用于使能或者禁止Cache
2 f1 O2 I* {1 U# m. D4 BB位:用于配合C位实现Cache下是否使用缓冲. E& {" ?& W# B
S位:用于解决多总线或者多核访问的共享问题
: H3 k& U' V* c; a. k1 B% q2 x7 {* }8 p6 W+ P" A5 O
20210326140245895.png
7 z+ j1 L3 Y8 i* ?1 U/ Z( x
" c' V. H/ [7 A: j& `
20210326140254565.png
$ E$ W& M4 @& {: I

" ~" o" {& O) N0 R8 U% ^read/write-through/back/allocate的区别:
8 K3 F* u" X* D3 z1 c8 F
2 ~% W: g3 t8 g; p
一、CPU读Cache+ ?8 f1 ^) k; w0 f; J9 d

  P6 t# |8 Y7 ~2 h! `7 u; ~Read through:直接从内存区读取数据' P1 f9 `& O6 g) C( Y
Read allocate:先把数据读取到Cache中,再从Cache中读取数据
; K2 o- r8 V& {二、CPU写Cache2 R( g! E; N1 r& M, P% S4 Q

& H: k8 ]3 f. X* E5 |2 ?& c9 P若hit命中,有两种处理方式:
) a6 C6 ]$ i, [6 T- H! }5 W! }. P5 g6 U
0 a& \0 j4 @9 U: d4 nWrite-through:在数据更新时,把数据同时写入Cache和存储区
; p( e. x/ W# A操作简单,但是写入速度慢
; n  e/ A+ q1 jWrite-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
" O2 _" a# E; T( F% Y* g写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
0 \3 x/ v. E( [若miss,有两种处理方式:* t1 t2 v7 ?+ v# ?% q8 ~! x
7 q, i5 s8 O& G
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。) |; O2 Z2 B, {) i
No-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。" ]$ b) g- {) ?$ M. |9 C8 v7 p" K( E
什么叫hit/miss:
* t2 E1 k0 q. \$ q4 v# d一、读操作

# d1 ]# W. o4 b如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。/ Y% g) Z2 {4 D7 B

! Y. ]6 P+ h9 Z9 S* \二、写操作; v( E: h$ |3 {  `
如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。& O0 w( p/ R, |
( Q9 e9 P& c7 v4 G% V( I
SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启2 ]& x, |, f' k9 W" [
SIZE位:配置保护的内存的大小( ~4 S/ t' g  V1 R( S8 E5 I5 l+ z) ?& O

& s0 [# s( F3 {% v8 [. A8 V' N5 d4 r. o( y: i5 V
四、MPU的HAL库配置函数
8 ^8 r- z+ m' @% q% |+ w3 f) T' o, Z) `5 [HAL_MPU_Disable:配置前要禁止MPU
& Q' I# Y, c1 u. m) Q$ I- IHAL_MPU_Enable:使能
! s) `) R2 X% ]1 T一般使用参数MPU_PRIVILEGED_DEFAULT
) w! ]0 a: ^' Y  l& W! PHAL_MPU_ConfigRegion:配置MPU7 d8 T+ m* ~( f% _+ N
  1. static void MPU_Config( void )
    " F2 z1 |# B8 a. z
  2. {
    ; u" T7 H7 X4 p. l, Z+ i' B
  3.     MPU_Region_InitTypeDef MPU_InitStruct;
    $ d1 g: M% ~+ R+ Z& f

  4. ' x3 i8 T1 H  f" O* _
  5.     /* 禁止 MPU */; r& D$ _7 ~& |3 y9 U
  6.     HAL_MPU_Disable();8 w6 w; S( T1 k/ o1 P2 N7 k, L
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */7 u) p  V8 a4 @1 w

  8. ) z; s6 |1 g4 W. F" L
  9.     //使能MPU
    2 p1 m4 x  ^$ M
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   / Q' H/ `; E) M
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐! W6 I  B% ^% \1 B& d- m2 U
  12.     MPU_InitStruct.BaseAddress = 0x24000000;# B5 f: b# k5 S8 \( |4 w
  13.     //配置保护的内存大小  A9 k9 f. ~  v
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
      x7 h" ]  k( f- i/ p
  15.     //配置区域访问权限类型3 J3 ~$ z( K/ L
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    ( N+ f) l- }( F1 |0 H
  17.     //在开启Cache下是否使用缓冲
    8 Y% q9 O8 ]* T: r' _- @
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    0 {" a3 O7 K% h! o
  19.     //是否开启Cache& Q/ @7 B1 A; L4 s+ K; l* [
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    8 ^( _, A! i; @% f# ]  S( e( z
  21.     //是否开启共享5 E& Y7 r8 @0 t& A
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;& ]& k9 P; \/ f9 ^" o
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    ; s" q1 e; T) |0 T
  24.     //配置缓存的策略
    - J7 D8 W7 `! l. Z( {. y2 e
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;5 i4 X; B8 R' a+ W
  26.     //是否开启子区域
    0 V- \2 o8 W; R1 I
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    5 y; y) o; e* {, Y
  28.     //指定指令访问状态
    ! {0 {- X" w& C, R& L" M
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;$ i7 d6 B: a' g/ Z2 H0 V
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    + Z1 |  h  Z" W' T/ m
  31. 4 W" y: h: i2 r! E
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);$ p4 g+ X( h: b% t
  33. }+ j* @% T* V; Y7 O- k# i# s9 d
  34. 0 `6 e2 @# g" f5 i/ m! K
复制代码
" [8 Q! F1 O* K8 a
+ i, I* ?5 a, ]; D
赞 收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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