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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU1 u: z7 J! h' [2 U! T& }& ?" j
一、MPU的作用
6 t7 g6 |0 A5 i- f防止不受信用的应用程序访问受保护的内存区域
1 d! ~. o; I* l防止用户应用程序破坏操作系统使用的数据
6 {2 k, N, S; B) A2 R' r7 i7 q" j通过阻止任务访问其他任务的数据区" m3 r( I( x5 j! q0 H
允许将内存区域定义为只读,以便保护重要数据。
! [  I( ?0 h, S6 e/ }. i0 d$ G4 ]检测意外的内存访问
& F! b- j7 @4 f" \. e简单来说,就是内存保护、外设保护和代码访问保护。, r% N2 `+ g; s6 g

' V! K1 ]0 S! P二、MPU的功能实现  J' q2 ]" b$ U! _4 O; n
​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。) g  v# b( z; o' m2 u9 Z1 P

) o% G7 T2 v3 }$ K) I: r2 j7 b​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。
& d  x8 x/ E! h$ f
6 P8 Y  f: d, \( Q
20210326140155905.png
  @+ k6 E5 K: G" c( h7 {$ q
# @8 P1 }* B# |8 {' H! ~
三、MPU常用的寄存器(RASR寄存器和控制寄存器)
6 B0 `, V! @5 o+ s/ h) \0 j! R! r9 }/ M3 D
20210326140209187.png

% \- i  Z$ X9 v  E- m# K5 h( X7 F! l3 V
XN位:表示是否使能指令的提取& d8 J2 Z5 X/ n2 |
XN=0:使能指令提取,即这块内存可以执行程序代码
; [4 D  o* v0 c$ j/ x- WXN=1:禁止指令提取,机这块内存禁止执行程序代码" F% x1 ]# J1 R3 e+ k
AP位:设置指定区域的访问权限类型
& V/ Z$ O: K" ]9 q4 w8 ^( t: L( f: T6 M+ w$ ]% \+ g. f
20210326140223302.png
' ?' p" J# A- H, C5 g+ r: F8 ~

5 e$ Z5 j9 n2 l2 R$ KTEX、C、B、S位:用于配置Cache的策略
7 ^1 g, I  {( {* A- l
) n# S6 @- f7 ?( M5 v0 {C位:用于使能或者禁止Cache
0 y% C4 H/ P/ ?; zB位:用于配合C位实现Cache下是否使用缓冲
7 y+ p1 L; t% U; l7 zS位:用于解决多总线或者多核访问的共享问题" l- G. o! J8 Z, l2 I
; `6 }& W2 k5 ]( G6 M
20210326140245895.png
1 c: ~. P9 m; [' P) y7 Q

" u1 E8 N3 b0 ^, o) u( ~! P
20210326140254565.png

  @! v! C/ @7 J* [* U! X2 Q+ K# [  A
read/write-through/back/allocate的区别:
2 Q! A) a+ n  x( k4 k) h

0 S+ b5 Y0 O/ z4 L一、CPU读Cache7 b8 b$ ]# e. y( ]+ m3 v2 k

, C5 }8 n/ @  i5 e+ WRead through:直接从内存区读取数据
. r  ?5 {: A3 ]: n& `Read allocate:先把数据读取到Cache中,再从Cache中读取数据
( F4 i! u) ^! e8 ~6 |二、CPU写Cache
, f9 u& G6 r) ?; P
7 ~1 r: r: f4 a" z0 L( a若hit命中,有两种处理方式:
$ u& h& n' N4 g1 v0 p" O% a- u4 X4 P/ `4 E; r' [  J% J! c
Write-through:在数据更新时,把数据同时写入Cache和存储区4 R% ?% b  A8 _5 _/ p0 u( }, {
操作简单,但是写入速度慢" Q6 P* B( W) C2 C
Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
. n# Q8 X  X) p+ Z. _写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回4 h6 l" f7 t4 s$ @+ Y
若miss,有两种处理方式:& ?7 D( ?0 f2 B! K7 [6 D/ a

0 y2 c% L# q) _7 q! J  DWrite allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
6 c1 v. K2 ]/ ^9 O; O* d0 z  Q# D3 wNo-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。$ B0 c- X" Z; z9 X/ v. z$ ?
什么叫hit/miss:" @. @, h+ \( z& i5 T! b
一、读操作
3 K6 k# e+ w( `- M
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。  J+ R6 P5 N3 F* K
! a: R% u6 P' P; z' R
二、写操作
8 x7 D1 v# h" v, [0 l如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。1 P7 u9 ~8 U* `5 \

; [0 b  u: e( C: C3 nSRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
: M; x& Q5 W; \SIZE位:配置保护的内存的大小
+ l7 P3 J2 j2 ]' R4 t1 A
/ B! C* \- g' c3 v3 w0 {4 ^8 c$ Z5 [
四、MPU的HAL库配置函数, S: O9 Q$ D3 h, S* \
HAL_MPU_Disable:配置前要禁止MPU# I  j( p9 y# V( B3 [; ?2 ]2 ^
HAL_MPU_Enable:使能
6 v/ e( h" Z% d一般使用参数MPU_PRIVILEGED_DEFAULT1 H: i: B  C- R
HAL_MPU_ConfigRegion:配置MPU
$ p9 @0 G1 d/ \8 h
  1. static void MPU_Config( void ), O0 h/ @) _( P+ t+ s$ \
  2. {
    " m2 t- X( J* e) d+ n/ n% \
  3.     MPU_Region_InitTypeDef MPU_InitStruct;( M1 V9 X6 I0 }1 Z
  4. ! |, _9 d' f8 l1 a
  5.     /* 禁止 MPU *// |/ D% C, w7 a# s7 \
  6.     HAL_MPU_Disable();
    9 v" I# S3 f% f' ]% `1 y: S1 E. S
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */5 C7 Z# m' G- _. a# V

  8. & D8 v, C0 V. N. t5 n6 Q
  9.     //使能MPU$ M8 Z' I1 a0 b2 w) s) T% s
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   
    5 q, Y. |* f- c: b+ Q8 O
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐
    5 Z1 E! @3 v3 U4 t6 S
  12.     MPU_InitStruct.BaseAddress = 0x24000000;  p# o, n& s+ o! k8 D" G  l& c
  13.     //配置保护的内存大小, i/ R& F: h- B5 `
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;) O% D9 [1 o/ Y2 f
  15.     //配置区域访问权限类型# m+ E! {8 _8 S. v% [
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;  O' Q7 W4 A$ ?% o- l% R" B" d
  17.     //在开启Cache下是否使用缓冲3 k5 _, j& [+ t2 k/ Q
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;! X/ z* b! {' f# _* E
  19.     //是否开启Cache, X  W% z& C) a$ M! H- L
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;9 \( M6 @! X/ Q  S$ S
  21.     //是否开启共享; }: p, t2 l7 p" l7 j1 X
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    / x- \# z+ F4 r4 {  ]5 |5 s4 C1 r
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;8 O) }; e3 ~0 @
  24.     //配置缓存的策略
    5 X# {7 S& [+ ^+ {9 C# ?
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;9 _2 e& q( t$ k& |
  26.     //是否开启子区域
    ( D/ k! @6 a8 j0 {4 L% x
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    $ x: q1 X( h1 @& O) R: n
  28.     //指定指令访问状态
    7 ]; T# ?1 L$ U( y, S; r& l
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;1 `! v/ \5 x8 I, F/ K
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);; i0 U8 _9 B5 N' j% _

  31. & t) ~$ X& M) l8 ]
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    4 B% x# c- M$ P$ P  U
  33. }
    2 S$ }6 E0 g) U1 D
  34. $ G, ^$ e( z) x9 x. G
复制代码
8 W: \: p) K5 C% x7 v& o* P/ H2 N' x
( _% T% P% T% h1 j8 T1 T2 M
收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版