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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU
1 V) w6 [3 u2 w) X一、MPU的作用
) Q1 c5 P; r  |! V( Y' |防止不受信用的应用程序访问受保护的内存区域7 L3 B1 v' j/ T! \' T' ]
防止用户应用程序破坏操作系统使用的数据6 H+ Z2 z+ M; C# I2 k7 ~! C( I
通过阻止任务访问其他任务的数据区
% O' e- {) S. b7 K! X3 N, o! t允许将内存区域定义为只读,以便保护重要数据。
4 d; D: ]$ d8 i# k8 I7 P- i% [检测意外的内存访问- K' X; ?8 `2 K4 h
简单来说,就是内存保护、外设保护和代码访问保护。& P* R8 P" x+ ~
/ e9 ~, e. |+ z' N. B
二、MPU的功能实现
; n$ u- F& z5 w4 D8 b, ?8 R​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。0 p- s1 s" s1 q6 D# T2 o
, Q2 L- d6 n3 M5 e2 X
​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。
. a7 z5 ]) W2 X5 X8 B$ @) G+ G% k4 h, V
$ ^  Q; a; G- r! N
20210326140155905.png

. r( @$ n( V; M  _; R. M# G# Z& F  S  o0 A! T
三、MPU常用的寄存器(RASR寄存器和控制寄存器)% m# _+ r6 V8 H- Y5 [$ h
0 s' w' q" s' W0 j& R% @/ h& s  h
20210326140209187.png

, E. L! G* j4 E9 h+ I' {2 ~& E& p1 |- n- |. J$ u- p
XN位:表示是否使能指令的提取' N& O+ \6 T) ?- d0 T
XN=0:使能指令提取,即这块内存可以执行程序代码
8 y" j  w' Y5 k( h+ ]XN=1:禁止指令提取,机这块内存禁止执行程序代码$ X7 E9 ^  t2 ]1 p+ s% }' J2 P) |" O
AP位:设置指定区域的访问权限类型) G) ~& k% I6 V4 W

: V2 J8 }/ m3 `& c+ h- X/ i
20210326140223302.png

* {$ b) J  n3 W2 v% Y
2 _9 P( N+ P5 K) {& G0 D+ PTEX、C、B、S位:用于配置Cache的策略5 \* F1 ~7 @! U$ k0 v

1 @) u) b3 _$ L. N" {+ H! N2 OC位:用于使能或者禁止Cache7 v3 A3 o% l! K% ~* v! v0 {5 O
B位:用于配合C位实现Cache下是否使用缓冲
4 G% O8 a4 Z. ~4 F0 b; ^S位:用于解决多总线或者多核访问的共享问题: v3 ?& L( o" T1 j* X

. }, J; ?, }  n; o% n# u8 m
20210326140245895.png
8 v* b' F& p  f. y0 d9 g

4 D! e6 w# u2 I" d
20210326140254565.png

8 r1 T; l4 i( W- C  Y/ L  k
# ^4 }3 U; c3 L- Uread/write-through/back/allocate的区别:

7 m+ f8 Y+ }/ z7 {) }/ L
8 y" S& }# H! U" j0 U2 [( [: T7 S2 C一、CPU读Cache% b+ z, z$ z( x+ {$ h# U$ ~/ \) b

) J8 `2 r9 x, ^% GRead through:直接从内存区读取数据
# D! Q7 O5 w- C) b; z) sRead allocate:先把数据读取到Cache中,再从Cache中读取数据
8 p7 p' A( M& b( a二、CPU写Cache
3 u. j, x% p9 E' P8 O" A
8 Z& i# `# i- h若hit命中,有两种处理方式:# y4 e. Y. g+ L0 k9 r

, x5 `4 b# G* h) I% J- V4 ]2 L% l5 lWrite-through:在数据更新时,把数据同时写入Cache和存储区
/ @; P, Q3 g8 f  Q: T4 V操作简单,但是写入速度慢
% k- H& g% x5 K" i5 PWrite-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
) z$ Z% N- A$ _( \+ B# X4 R写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
3 ]0 Q4 Y' I& k2 @( s: t4 y* Z若miss,有两种处理方式:1 q' ]# {) f. c

; U" _% l( _( @' X' J2 G: xWrite allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
) y2 I0 o" u1 S; \No-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。! Q& ?1 y# W2 S6 }; {; R
什么叫hit/miss:6 d( @6 U8 C7 n, K  S
一、读操作
. s" ]7 E! W8 }" P9 a. |
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
/ }. t3 i- O/ C  K) z( U/ e
& W/ K1 U/ y) D  H* |# L9 l4 w二、写操作/ }+ [2 |) }5 G; @) f" e" p) H- s" f
如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。
0 Y; N$ q9 T' e  w
$ |" V6 I5 b, o$ ?SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
0 E9 m+ S7 \0 O8 TSIZE位:配置保护的内存的大小6 @0 [; g7 ^  \2 T
: G* F, A$ h2 n1 F
+ s* k. `& T) d
四、MPU的HAL库配置函数# k4 `: @' T; f0 I) P
HAL_MPU_Disable:配置前要禁止MPU) {( r* h, I; u1 F  d4 s
HAL_MPU_Enable:使能! @5 Z: E+ a! \# d
一般使用参数MPU_PRIVILEGED_DEFAULT  F4 x! A0 [( _! E- \5 c
HAL_MPU_ConfigRegion:配置MPU
( I5 b1 P- P: x4 L
  1. static void MPU_Config( void )
    6 A# r) _% m9 S7 u# u
  2. {' |  G% O3 R5 e! V
  3.     MPU_Region_InitTypeDef MPU_InitStruct;
    * B1 s2 z) h" c/ G: N5 s

  4. ! j0 w9 I( M3 v+ Q* O
  5.     /* 禁止 MPU */  \7 @- z3 }* N" J, A: }! {! G
  6.     HAL_MPU_Disable();
    " ?9 G5 P$ d2 X. I2 Q" C, p
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */
    ! A/ s" s8 ~- ]- D* e# p0 Q+ j
  8.   `8 K" s; o: z) \6 q* F! C& w
  9.     //使能MPU
    3 j' W& l( O  [
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   
    $ I" t/ e# r9 ]
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐
    ; J4 _4 Z& S- @0 Z
  12.     MPU_InitStruct.BaseAddress = 0x24000000;
    , \' [- z- s; Y4 ~: Y( L
  13.     //配置保护的内存大小
    ( F2 O* N* O% R1 q# [+ o
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;/ k2 X! H! l' e+ }1 J
  15.     //配置区域访问权限类型, c( X  A' [* Z5 i9 C7 G7 @
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    8 m5 a5 H; S. K( w  k) ~. {
  17.     //在开启Cache下是否使用缓冲
    # M- a- z0 g% G0 G; w
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;% v4 K( T1 b$ |
  19.     //是否开启Cache9 ]& j+ r1 n8 V) G: X/ Y
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;5 v- c! ^# ^2 I( l3 M
  21.     //是否开启共享# s' g+ j6 a* s  w& F# w. q3 @
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;, R: Y: w: i. R
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    8 {+ D$ r4 t0 H% O0 m
  24.     //配置缓存的策略1 p: j  O" Y1 Q1 \( S4 \7 O
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;
    , D. B3 \0 u1 t
  26.     //是否开启子区域
    9 k# p' B: E3 D( D# C: j4 c2 l
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    " j+ s5 B# L/ G+ k+ D1 @; o/ N
  28.     //指定指令访问状态
    / b1 w1 _1 `3 z6 J4 Y* [6 X! Z3 B
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    8 ]) T. `: K+ X( @9 Q
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);0 T4 _/ R0 }& U/ J9 d1 u
  31. $ D  t) _+ {" Y
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    * m7 O- ]  u9 E9 m" j* q
  33. }
    . f, [  k2 l4 \/ A

  34. & J, R/ l0 J. V$ M( _4 O1 h- o" t
复制代码
# {/ ~/ b$ }! g7 P; F- h
% Y  |$ t! m6 }! v) ~
收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版