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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU! r9 |  H- x) D9 |$ D# g
一、MPU的作用
% e' f% Y- z: I, p! O防止不受信用的应用程序访问受保护的内存区域
$ J% S3 F: F: h4 e防止用户应用程序破坏操作系统使用的数据$ l* K1 e" r$ G3 z2 z: W1 g: Z, t
通过阻止任务访问其他任务的数据区
# K8 J: k' a$ Y4 ?/ {允许将内存区域定义为只读,以便保护重要数据。
3 F; q7 @2 I2 V2 F) x检测意外的内存访问4 K, G; I. q' a
简单来说,就是内存保护、外设保护和代码访问保护。
  T- u9 j) z4 Q* t3 |
; |9 A6 V3 T# H5 J二、MPU的功能实现
3 \7 m( ^# h+ k0 @; Q" ~​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。5 Q5 o) @+ z1 I( t8 k
$ G( P0 z+ m1 Q* X; l" x/ s* J2 w2 R
​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。
9 H' y: p8 N' V$ |( T* F
# y8 F# }) l7 q. m7 ^+ E' R5 p) q
20210326140155905.png
- h) ]. L: E& J( A
- _  X0 K( ^2 n: s. Q. z4 D
三、MPU常用的寄存器(RASR寄存器和控制寄存器)9 V/ [3 ^6 x& W9 A7 B
) K5 _6 I! c; U* }9 ~/ |
20210326140209187.png
1 y, o9 G8 X; t: y( ]; d# G
0 d. {6 Z. r+ _8 S4 D$ T
XN位:表示是否使能指令的提取
- e0 @# f  L$ [0 NXN=0:使能指令提取,即这块内存可以执行程序代码
2 A0 q; I5 P* bXN=1:禁止指令提取,机这块内存禁止执行程序代码
, B" T5 x) _  B# P$ l% AAP位:设置指定区域的访问权限类型
7 o2 c) U+ M% k, T% R; X8 X- K* `& q6 L
20210326140223302.png

# c7 h; O8 h$ R9 }: R6 f
3 q2 \, ]: D8 I3 @: g/ V* d# |9 s' Z1 nTEX、C、B、S位:用于配置Cache的策略
' E( F  x: P2 J+ a- s3 W. {' o. A4 q7 g) J4 f4 b5 y' w
C位:用于使能或者禁止Cache9 ?- d1 v( ^" a% f+ |
B位:用于配合C位实现Cache下是否使用缓冲/ M! `6 {  O$ Q: C. H" H% F
S位:用于解决多总线或者多核访问的共享问题( I, N3 l* l6 e
* a5 T+ H7 f" J1 e% q  q
20210326140245895.png

8 Z  f- _. W6 n$ _0 P
  D) Y1 \4 m/ W! {" [: w! A
20210326140254565.png
' \, t) V  \/ O+ v% x" X
) }, M( \$ i9 U0 ?- g# L
read/write-through/back/allocate的区别:

% h2 T+ K! U1 H+ C7 R! Y2 f: N" M: n" X/ b
一、CPU读Cache( b7 V6 @& l+ ^- d  U1 X% }3 q
8 U* i: F. }" u7 ?
Read through:直接从内存区读取数据. n5 j4 P; u9 T. U( [5 {/ `  v
Read allocate:先把数据读取到Cache中,再从Cache中读取数据
. f( ]9 c4 K9 v! y& [% G二、CPU写Cache
) d9 O/ G- e( H& s5 \; v* H, s: X: `% l' Q
若hit命中,有两种处理方式:
9 M  B  E- k9 y7 ^. w
4 P2 ]% |% U  y" |) vWrite-through:在数据更新时,把数据同时写入Cache和存储区% a  K1 v9 W+ O& {
操作简单,但是写入速度慢
( x4 c0 p0 S5 Y* B6 TWrite-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。0 ^% I& m; ^3 t9 L& A
写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
  i, \# ]1 N1 @3 C: I9 g若miss,有两种处理方式:( C; u7 |/ S, w  A' a  Q
* |, G# {: L0 h# |, [
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
& f) W2 ^: C' _/ ONo-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。% E9 {  I* E  R$ l
什么叫hit/miss:
* [4 V0 f& w. O. m8 b' N一、读操作

( w5 Q. ]- |! j4 g! `" a如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。4 u- O3 l$ m0 M. q

2 ^2 m8 v$ e1 b! f3 K: m( {) D二、写操作
  q. Q3 d1 d( N: g4 ~. V' M) d如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。* F/ Q  d! y4 S3 |; f$ _

; ]; s/ \* Z; j. Y! @SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
1 ^  o: T5 I/ u& E' |6 p' Q5 PSIZE位:配置保护的内存的大小0 T: h2 x: ~7 h  d1 I( `
* G$ E) @! V  E* e* A* h9 S

( a7 J& O# |" n- e- [$ E0 ^8 v四、MPU的HAL库配置函数8 x3 c7 f1 @/ b, o4 r/ I% W, b& X
HAL_MPU_Disable:配置前要禁止MPU# g7 S% r" \1 _' D9 S* I' X. p
HAL_MPU_Enable:使能
5 N9 P. R# F: H3 v& U) W/ E一般使用参数MPU_PRIVILEGED_DEFAULT$ W: }! {' [- \, l$ ^, S# b6 r
HAL_MPU_ConfigRegion:配置MPU
; H7 E. p& @" H* w0 q
  1. static void MPU_Config( void )
    ( _+ W# i2 Q3 u9 S
  2. {8 A5 l$ T% U6 V; ?8 o/ r8 D) j
  3.     MPU_Region_InitTypeDef MPU_InitStruct;+ I1 [3 c3 u. D8 |$ W6 A' T
  4. ( @  i' k6 v9 }' H. v# m- Z2 |
  5.     /* 禁止 MPU */4 u/ ~, C. s% ^5 N( n
  6.     HAL_MPU_Disable();# W& L: ^& d3 q* \* e, h6 G# P
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */
    4 _; {$ M! B" T) ]

  8. 3 P7 C; G( ~6 L9 m: C
  9.     //使能MPU% B+ s7 ]( d4 C2 K$ e9 |
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   0 y5 s) h7 D4 ]7 l
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐6 w, L8 p! d8 e5 b7 c4 M- j: Y8 n
  12.     MPU_InitStruct.BaseAddress = 0x24000000;
    " B/ n% Z4 c' p# ?! q
  13.     //配置保护的内存大小7 p" B2 r2 @, R9 y
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
    ' Q4 {3 Z: p( L1 K* w
  15.     //配置区域访问权限类型% G6 G, ^+ o% a8 K
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    - p1 Q4 E$ ~# Z$ k4 o5 ~2 w, O
  17.     //在开启Cache下是否使用缓冲
    ; Y" n/ Y1 ^7 G
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;$ A3 D" Q9 |( A% a
  19.     //是否开启Cache
    3 Z4 q4 t! l3 ?* ]
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    % S) k) `5 z9 W" ^
  21.     //是否开启共享1 O( ^9 t9 b! A/ @- T( ^- W
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    * m& u# _2 Y/ w' a+ o! }' e1 l% s
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;- T5 b6 q( V7 g# v7 L: r% x. @
  24.     //配置缓存的策略
    + W( r) b7 R7 m5 ]$ X# I5 Z
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;+ E: u4 _# h: n8 E: Q) {1 B
  26.     //是否开启子区域
    & S; ^% Y; |' G" f
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    3 L1 R+ ?1 l- V  q
  28.     //指定指令访问状态
    ! {2 d4 t% s. t/ q
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    3 e7 r( s. v  l% @0 n) W* j
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    9 \% }1 D" z8 f, m

  31. 4 a+ e4 P+ n) `/ @9 C2 y
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    # O* c* z( @- `+ V
  33. }9 z3 P- i( a: C! z8 M8 V2 a

  34. 8 W8 q4 g6 j7 L" c
复制代码

( m* F+ ~9 ?3 M2 U6 B& }% K
0 U% I+ y' Z% T, p& A+ A. Z
收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似分享

官网相关资源

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