请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU4 m0 C! I0 M% \: N
一、MPU的作用8 Y  U) W  q/ G
防止不受信用的应用程序访问受保护的内存区域
1 [! H; p. B6 l8 y9 E防止用户应用程序破坏操作系统使用的数据, C: z- K. J$ n+ k) z
通过阻止任务访问其他任务的数据区2 w: |+ D& n/ a  @% {( Q
允许将内存区域定义为只读,以便保护重要数据。
' b) p, s. B$ z) h. j检测意外的内存访问
6 Q9 V3 S1 r: e7 C简单来说,就是内存保护、外设保护和代码访问保护。
7 S/ I0 U# u. t2 `6 S  z* i; R/ A. c5 T, Z: m
二、MPU的功能实现
- W0 d8 i/ v( `) d9 G​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。
- |% i  u, ]; [$ i# [
7 [% n9 x; A" Y* b3 `​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。8 d2 Z* G# {1 y7 `  k% I  X
; _! K8 `/ V+ g2 x6 ?  i9 u& q9 w
20210326140155905.png

9 E& O3 X7 ^( `* h5 [& E; A9 d# t
三、MPU常用的寄存器(RASR寄存器和控制寄存器)& a( t6 t; O8 r2 [4 \0 h, G
: P% q1 b. X: V5 O% j
20210326140209187.png
, }3 ]8 s2 x/ R, Q" G
7 {4 D' ]) j: B+ T# j2 H
XN位:表示是否使能指令的提取' Z: @: B3 M) G1 f  W( i. e
XN=0:使能指令提取,即这块内存可以执行程序代码
9 `  M) M1 o7 W0 fXN=1:禁止指令提取,机这块内存禁止执行程序代码9 r4 ~; N/ n0 s! G" R, L8 w( L" t
AP位:设置指定区域的访问权限类型
! u; y3 @$ _% I. u( W5 f8 h" _6 V/ D
20210326140223302.png

9 r+ ^% y1 w- s5 G- y
4 M* a9 O" j" G& u' {TEX、C、B、S位:用于配置Cache的策略
5 I" }; i( [7 `* s" f+ q
' i! C. S9 q8 ~6 ?# rC位:用于使能或者禁止Cache
* t( W% k! T8 j; _3 AB位:用于配合C位实现Cache下是否使用缓冲
  j. @! v3 E* U0 ZS位:用于解决多总线或者多核访问的共享问题
; _. h. Z/ K3 k. o. z% ~( V# O/ t5 A" B$ |
20210326140245895.png
' ]; E2 a0 ~! H+ S9 w
+ ]9 Y- E3 w# [3 ]- u" h
20210326140254565.png
- m+ ~+ z9 ]+ H" \$ h7 V6 O
# M; f' {; p- b0 j  c
read/write-through/back/allocate的区别:

& r# R1 [) Z3 I( K+ T+ b
) G: A/ @+ Z- _0 R0 a一、CPU读Cache
+ k8 T+ e+ }4 |# [2 Y/ M  G0 C1 U. G+ B) E& m
Read through:直接从内存区读取数据8 F& u5 {: h7 d* e. _4 A1 N/ x
Read allocate:先把数据读取到Cache中,再从Cache中读取数据
, I1 t2 W% i0 f) F% Y, w% N二、CPU写Cache/ |* I5 X9 o0 z1 K3 }7 B5 E5 u
7 {  t) e: `0 [
若hit命中,有两种处理方式:6 `# z& M3 f) j) z! V; ?* ^
( o+ m( K. j5 z& w! O
Write-through:在数据更新时,把数据同时写入Cache和存储区
; m3 D$ P  h) h7 [+ R: j操作简单,但是写入速度慢
8 p1 D$ X8 T/ Y2 y$ e# dWrite-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。* y) |$ Q4 b1 G% r$ f. g
写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
2 Z# C; b' L# `& y; I若miss,有两种处理方式:8 D3 |5 d1 {( g$ \& A; c
4 J; w+ V' F) k8 u
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。, z8 i: _. S9 ]+ G
No-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。3 I1 C, i- A  H8 z. M" _
什么叫hit/miss:3 n( x& T. q6 ~
一、读操作
4 D& X. H. X9 w* ]' N
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
2 m' n- [8 F) Y
. f3 Q) w0 u" g* g) y二、写操作
9 G. ~/ G  K: E6 l如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。
7 |" W2 X3 n. \* v
! N: ~# V, `$ r4 w! M& Z: `SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
6 c" u) q* G, A1 n! P( [3 D7 E3 bSIZE位:配置保护的内存的大小6 l& w8 M9 s& ]7 t9 X2 l
, k  D! Z1 v, V/ }# w$ k/ M* j' h

2 }5 W3 W, h/ Q$ q% d5 g0 b0 a四、MPU的HAL库配置函数6 `* L2 P# f$ \3 R+ d
HAL_MPU_Disable:配置前要禁止MPU
, O2 e6 y1 ]& D; mHAL_MPU_Enable:使能
3 D; Y$ b9 N- _7 ]' n, h- O一般使用参数MPU_PRIVILEGED_DEFAULT
" M. z; O$ c5 K. N6 L1 c' Q2 Q1 THAL_MPU_ConfigRegion:配置MPU
! e1 m0 A7 w9 R* `8 f) p7 N  {1 `
  1. static void MPU_Config( void )
    ! g! I  Z2 m& K7 Q. m
  2. {
    3 m7 ]( ~; P/ z+ W/ K
  3.     MPU_Region_InitTypeDef MPU_InitStruct;
    ; E6 w5 h0 ?5 C( F: F
  4. 5 X2 w% I2 G* @: N- k" r" ^5 L- s
  5.     /* 禁止 MPU */
    , K9 I0 [& q3 q1 j6 i& t
  6.     HAL_MPU_Disable();8 Y: Q! S+ w; U3 k
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */- C4 s& o" ]' Q( W* ?
  8. & G9 A' a- R% [5 d% i6 g+ v
  9.     //使能MPU6 F4 y( b8 f# E2 h
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   
    # F# \- k0 Q1 e- n
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐
    " x6 U8 n& d& V) c$ F+ N) u
  12.     MPU_InitStruct.BaseAddress = 0x24000000;) _% S! I( C$ C9 v9 |
  13.     //配置保护的内存大小  O$ x9 V- o5 Y4 k* G
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
    : ~/ O, x5 x' o& W* G/ X
  15.     //配置区域访问权限类型( r; A7 H  X( R+ u8 Y
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    " ~0 W- B; H" k4 {8 G
  17.     //在开启Cache下是否使用缓冲- O& R5 q( _+ K; E" V; M
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    - `& Q7 f  g- `) m: i4 ]( m+ }! P6 H% l4 E
  19.     //是否开启Cache
    7 ?, m4 X  n0 U6 U. h3 L9 D) Q
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    - p/ t3 M' S- X3 o! V
  21.     //是否开启共享8 s0 j- }' b3 o) H
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;* c5 g) m2 k  n" c
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;/ t( C) Q" [% E5 H
  24.     //配置缓存的策略: p# K6 _0 o8 V9 v
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;
      \3 [( Z* j* R
  26.     //是否开启子区域
    7 W1 d- H8 e9 m) [) U+ D3 _+ w
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    : B& a$ N- M3 ?3 V/ j
  28.     //指定指令访问状态; X4 F) |4 j7 Q& U0 F* ~4 b: k
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    / _: k2 U- t3 x8 [7 P
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);' [3 L6 N$ \5 h$ H$ [2 r9 S

  31. : g4 y# L, S' s9 ]! x
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);+ L% d0 I1 K3 j' S9 C
  33. }) q9 F+ C2 P( E3 d$ X

  34. 0 w! u/ V- }7 u, {  A% O) i
复制代码
! P+ R8 ?. k. Y: J2 o

& G' N4 r' [! P9 O
收藏 评论0 发布时间:2021-12-26 15:36

举报

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