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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU
2 z0 S' `; u- {$ }  G一、MPU的作用8 `1 M* T# g  l9 ]! S. A: |
防止不受信用的应用程序访问受保护的内存区域" Y" R/ N/ k1 e& r
防止用户应用程序破坏操作系统使用的数据
+ H: V3 U+ o2 a3 b+ |% d# r通过阻止任务访问其他任务的数据区4 \5 B' s: ?& R: P9 l) }: H$ r
允许将内存区域定义为只读,以便保护重要数据。
! P- B: V+ ~# L) ^& V7 h; X检测意外的内存访问
$ S7 n7 y! [% O4 ~简单来说,就是内存保护、外设保护和代码访问保护。
0 ?# q1 C. F  T6 I
  @( B+ M' m& u/ m) `, S8 _" l- o二、MPU的功能实现  h4 ]$ e7 H/ a' d) I
​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。+ q/ E5 W2 r' K2 f' n5 r0 {

# }, `! V  k/ K* ^1 v3 d​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。% Z( N; @9 I. b& K! ]3 S7 f
) k1 ~! P4 e0 P. f
20210326140155905.png

) ]0 c: E# @9 w2 ?- U% h$ ?) p2 {- I* ~  W: ], ]
三、MPU常用的寄存器(RASR寄存器和控制寄存器)% `8 E( Y4 ]) l/ r+ ~, s! V

. i0 ~; Z: ~; X$ x8 g, U' o. I0 k* B
20210326140209187.png
/ f; t/ `+ I1 ?  A  i( @4 V9 Q8 G0 O
6 _) E$ t" f0 J0 N$ R/ q, E7 k
XN位:表示是否使能指令的提取
/ B! \! O9 T/ e# w' gXN=0:使能指令提取,即这块内存可以执行程序代码/ P  X( J0 F$ i) S( _
XN=1:禁止指令提取,机这块内存禁止执行程序代码
* d. z& u1 m+ F( XAP位:设置指定区域的访问权限类型
" `9 l( h9 v7 n( d  A( |( n. d; `* w3 t8 b+ t
20210326140223302.png

$ H4 q4 ?7 I& F- r- j' N  g8 e6 Q5 x9 U8 L' E% }6 X
TEX、C、B、S位:用于配置Cache的策略; @" ^, x  O" x$ d  m! M
  B9 c8 V6 p! h. C& n8 S3 H0 j
C位:用于使能或者禁止Cache/ ?( g# i/ ?$ h
B位:用于配合C位实现Cache下是否使用缓冲; J8 q6 Q: ^: J, A( l
S位:用于解决多总线或者多核访问的共享问题4 E0 y$ a) ]+ V; m3 |% n1 V/ `
2 T  ?- l& E3 ?' ?+ U, B4 s
20210326140245895.png
' o! `* ^! ~- ~3 @2 I
! F6 m( ]! j. S: n* M7 n
20210326140254565.png
* K% p" \0 q( W5 M& T

- _. k5 w' x) b0 A" {6 r9 k3 p9 uread/write-through/back/allocate的区别:
( Z* \  m% {  F, ]- _+ o- g% p7 P

0 ]" I; M0 M3 O: P4 d一、CPU读Cache
  A' o3 e$ ?5 }4 |1 M5 q; U4 j! w( S: g5 x3 G# ^. ~) O
Read through:直接从内存区读取数据# |" T* F% V/ e
Read allocate:先把数据读取到Cache中,再从Cache中读取数据
, S: U& O) m+ v3 C" J0 I二、CPU写Cache
. J8 Z% W1 m( _. @2 f6 L1 ]6 Y; k0 D, a
若hit命中,有两种处理方式:
; R" {( ~9 E# j& N6 ^  j# ^! M" H" [
Write-through:在数据更新时,把数据同时写入Cache和存储区2 C( u" B' |! p2 @% g
操作简单,但是写入速度慢0 e( D0 _' G! j+ r. V9 ^
Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。" ^; Y% z! |0 C' K
写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
) m1 g/ l$ M9 N+ t; J若miss,有两种处理方式:
4 F+ G8 D! W0 ?. O( K* a9 a* C, a/ K* k% i5 M$ {
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。; t( E+ b& v" H4 O! Q+ \9 b
No-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。
; f$ H+ [. a) K# m! L  \什么叫hit/miss:
: f2 c) V- [8 j一、读操作
5 P# R1 c. P, C; z* r( i% R. L
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
: j- \6 G2 k. r3 z) b
( E. k/ P' f" [1 p6 i1 I, ?二、写操作" g1 `4 u0 z# b3 r8 y
如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。& H& K: {: v/ E/ v) d
+ f; P8 c* g; N7 \
SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启+ H2 Q3 n/ k) s% V+ {% v/ ~* \7 S/ H4 N
SIZE位:配置保护的内存的大小, A3 a( t/ k' ]! [7 x4 @) e

. h8 b6 h2 j5 l+ N6 l( `: }' ]" ?4 c  I
四、MPU的HAL库配置函数
1 r  i8 R# O$ Z/ w* c: DHAL_MPU_Disable:配置前要禁止MPU
7 i% l% p( V* @% S/ \HAL_MPU_Enable:使能% C4 ~2 S) C, S) x
一般使用参数MPU_PRIVILEGED_DEFAULT7 O( {6 h- F6 G) L: E) I
HAL_MPU_ConfigRegion:配置MPU
! I4 Y) c- }: W0 x  M! K/ [
  1. static void MPU_Config( void )) z) G( k$ j5 \; C5 b; u, ]0 O1 R
  2. {
    & O* F9 U5 Y+ D. f6 v+ J
  3.     MPU_Region_InitTypeDef MPU_InitStruct;( @/ h0 `. Q2 X% p+ C3 z$ s6 H, L
  4. 4 f9 t* @" w& ]/ Q. _9 V3 m. p. D
  5.     /* 禁止 MPU */
    5 D) I) |! S7 C+ G' t
  6.     HAL_MPU_Disable();
    4 K: M5 t2 G9 T  @0 q1 j) i. H
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */
    & Z3 n# k; J' \- X
  8. 9 M% G+ c7 ^% t  P  t
  9.     //使能MPU1 V: e) j' x& i$ ?( A; D4 ]
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   
    . P, B) \5 J2 z" `; c* G
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐, \8 D& ]4 B# @! m% Z2 t  q; _
  12.     MPU_InitStruct.BaseAddress = 0x24000000;1 y$ M* ?  P/ y4 h8 g! F
  13.     //配置保护的内存大小3 t6 B, \5 D! D% z5 h! j+ C+ y
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;* [5 S  ~* n" {5 b
  15.     //配置区域访问权限类型
    2 c* q# L, Z7 q2 {2 ?( n9 ]  j
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;! ~9 E: I0 Y+ f; B' l2 P* e
  17.     //在开启Cache下是否使用缓冲3 x5 j% ]  z$ X7 A5 i% M+ T- c; w6 O
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;1 {. j4 J8 u8 X) H
  19.     //是否开启Cache
    # a8 e* @! @  h8 x' r! m+ ?8 H
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    4 x' a( g# T5 E4 o& U7 ?
  21.     //是否开启共享
    ; C1 S# [% z& q4 K& S" S
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    3 n# \9 S  ^5 n) k
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;( z. ~8 d  M; k# q' H! B
  24.     //配置缓存的策略4 b- U- d; s" q& P$ W3 U
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;
    + N1 N( L6 X) R7 [- r, R4 v5 r
  26.     //是否开启子区域
      u) T  J/ j* X$ X, s; }& O# s
  27.     MPU_InitStruct.SubRegionDisable = 0x00;9 K; K  i7 e+ S( O
  28.     //指定指令访问状态
    * X$ i2 o+ Z7 q! w& y$ w; W4 z; R
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;9 v8 W, u, e7 I9 j" m; b
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    % K* }: e* G. h) m9 M
  31. ' e& S* `) t. J& M
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    0 i- |  A& O. ]
  33. }6 a7 J3 R  F* u  H# C4 X
  34. 0 f; k" |' t, p  r
复制代码
: }, l+ I$ w5 h4 Z1 p0 t! a4 o

* s) m& M% M! z9 o# A0 g: z
收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版