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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU
3 L+ H' X3 p* C+ A一、MPU的作用4 j7 D) m  q1 h9 S* u2 m
防止不受信用的应用程序访问受保护的内存区域1 ]5 z! x& r* c. w
防止用户应用程序破坏操作系统使用的数据
! n5 M1 J# {7 I( n/ I通过阻止任务访问其他任务的数据区5 Q1 p1 S) K4 T+ p4 C& p2 I; y
允许将内存区域定义为只读,以便保护重要数据。
4 P- U9 ^8 T% [+ i检测意外的内存访问7 c: {# }8 X  @2 ]
简单来说,就是内存保护、外设保护和代码访问保护。! ^( h7 w/ U- \4 Q( u1 H: ~$ |
2 Q  |6 d# i4 f6 H. L
二、MPU的功能实现1 N( \( @7 ^6 s4 V  T
​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。
3 D& Y: t% t. `6 N, {! h1 N, K4 y: M+ N6 i1 l. R. q& \: ?: s
​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。
8 b7 R6 t" q3 A7 d- h, [5 @" [  s! L: O" s- F8 v4 g% C
20210326140155905.png

6 s" m2 w* ^1 v' k$ h) B' h, w( M' ?+ y' `- ?1 E' W% f
三、MPU常用的寄存器(RASR寄存器和控制寄存器)% A6 J0 s+ p4 M

  [, M2 j! W$ W3 Z3 g9 H4 R
20210326140209187.png

# _+ e& z1 R, ^5 H0 K8 g0 C
0 d, O% b6 N6 LXN位:表示是否使能指令的提取
$ X4 ^1 P1 W5 W" I: @& h. t' SXN=0:使能指令提取,即这块内存可以执行程序代码! |: g1 ^5 {6 Z* ^) ]
XN=1:禁止指令提取,机这块内存禁止执行程序代码
, {' K" v( F3 S8 J0 N) o* {1 wAP位:设置指定区域的访问权限类型( I0 z2 i  Z: ^- I# m! ~) |# o3 q

0 D$ Z: R% n! \3 G
20210326140223302.png

( p0 I1 S  M! I  j7 U0 B' F9 e- l/ L( `! P. p& B; z' l
TEX、C、B、S位:用于配置Cache的策略  U# n) B7 S, Z3 B: M

8 K5 r* J( r) h( U/ vC位:用于使能或者禁止Cache+ W5 r7 c- o8 M. Y  ]3 Q: Q
B位:用于配合C位实现Cache下是否使用缓冲
  o) w, z1 i. d, n7 rS位:用于解决多总线或者多核访问的共享问题0 P8 s# J: R' `# c# i4 o; k

- z5 R5 d! O/ h! _
20210326140245895.png
) I* ^% Q. X/ t
  s& [( r  N) s7 f0 s% F! [. V
20210326140254565.png
6 D. ~! J) X% I* o

6 o$ }  n  S6 q% O2 Pread/write-through/back/allocate的区别:
! A* ^" `8 M# y) I. E& X

0 C& B, U- O7 `8 A一、CPU读Cache, e. r3 {4 f( ~0 }

# r5 H. R  Y! V: T& b; _7 e& VRead through:直接从内存区读取数据
3 ^  n, n3 q* |1 j( WRead allocate:先把数据读取到Cache中,再从Cache中读取数据1 @0 V; A5 o# y# |
二、CPU写Cache  a# `. v' ]; R. \3 O% B3 `

5 x; D5 J  a1 x若hit命中,有两种处理方式:* g3 `7 ]& Y+ Z7 U. h4 G7 d
4 b! y8 s2 L$ c* d6 _( f) x/ X& i
Write-through:在数据更新时,把数据同时写入Cache和存储区7 E4 C  s% N8 s# d) @
操作简单,但是写入速度慢
2 s: F- L5 F9 I" ?, ]Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。0 e7 o& D1 p% ?
写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回
' d$ S2 Z7 [% u; O若miss,有两种处理方式:
" [) d; s0 C0 @: z" D$ ^) Q9 V. D  a( p
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
8 u. x0 s4 J  [# ]6 L2 @0 gNo-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。
8 a, S, d* m+ D什么叫hit/miss:  z8 {7 g- U. f. x2 `7 w' y
一、读操作
4 j) G! z1 J% Z5 K2 E$ A% z
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
2 _$ _! t( Z5 r0 A# G9 H+ |
  [; U6 |: n2 ]% S4 \二、写操作, |1 f# {2 O7 J; N2 t* e
如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。/ X$ {/ O" p7 t3 t9 y1 K0 u3 m4 d# S* t# w
) U2 |+ h9 o# O+ T3 Z8 `
SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
* y! O2 D& _" t6 B6 {SIZE位:配置保护的内存的大小. N/ `; r2 {! F) _& @  O

# [5 S6 m% l6 C* G- A2 _; m# m
# E/ c+ M: ?& g$ f四、MPU的HAL库配置函数" i  a5 K* f( p& u: u0 h0 l6 w
HAL_MPU_Disable:配置前要禁止MPU+ t. c0 q, |1 d4 c! E& M, b4 _1 m7 b+ V
HAL_MPU_Enable:使能
* k8 y- b! o" q& N一般使用参数MPU_PRIVILEGED_DEFAULT: d5 B9 g0 p" Y9 q0 i. {1 V
HAL_MPU_ConfigRegion:配置MPU
" t8 E8 ]/ J6 U$ Q# A$ O
  1. static void MPU_Config( void )
    % k4 l$ l+ j  D% h- U" ~/ R
  2. {
    6 r: W  w, W* y; [- {" x' a
  3.     MPU_Region_InitTypeDef MPU_InitStruct;
    ' G4 j4 G" o9 ]! B9 H

  4. / u% o5 n" a; H# c
  5.     /* 禁止 MPU */
    : f' ]" A! U) K, `/ N) k( \: s
  6.     HAL_MPU_Disable();
    ) ], G: ?% V) l0 J3 s: @$ c
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */1 @" M5 \& O1 p& q8 |

  8. : t! v7 o6 a/ n" E! j  X% c- X
  9.     //使能MPU8 ~! u. k! g# r/ B
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   
    8 y' N8 h1 }! ~1 Y- A
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐8 ?1 V5 f( x: T3 l6 |$ ~
  12.     MPU_InitStruct.BaseAddress = 0x24000000;" m9 [/ f( a1 P( N6 Q' b$ }
  13.     //配置保护的内存大小+ O4 s# j1 y" V- t& [- m" k4 _
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;/ U3 I* @, N- u
  15.     //配置区域访问权限类型$ p! i: P& P; A3 N' u# |
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;. L5 {& Z2 H0 q
  17.     //在开启Cache下是否使用缓冲' j9 l- J2 I* z
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    4 M# D6 h& K- ]
  19.     //是否开启Cache
    : o) R5 t' I6 ]' E  x
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;8 Q* [+ a, x$ X' a
  21.     //是否开启共享8 g2 q% T) e$ g7 D% n' l, A9 i7 d( i
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;( R7 Q/ u1 u7 O* ^8 C- G6 S3 M
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;! x2 @1 h* C7 h" {+ I% ?
  24.     //配置缓存的策略
    6 ?& N* x5 e! c% z, }( w! b, G
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;2 m# m& v" \3 Z* W
  26.     //是否开启子区域
    * W3 Q! E4 }+ u$ c5 ?" L
  27.     MPU_InitStruct.SubRegionDisable = 0x00;
    , l: c9 r0 E% H, u) ]# F2 O6 ~
  28.     //指定指令访问状态
    5 R) E( R2 S3 Q5 x
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;0 A. P! [2 i" ?3 B: L
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);0 F* b' O0 B* _9 b5 ]3 V7 s" d

  31. : ~1 z0 K& k- P4 K; v- F
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    9 B! C6 `( X2 F; L1 ]. k$ R" q% |" _
  33. }
    4 j3 p# F5 V7 |9 x) ~0 m
  34.   c7 F: Y& t5 T* c: t
复制代码

+ B; y, e3 J* `, @/ ^. [
% P! n: P  i/ V8 A5 `1 [& M
收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似分享

官网相关资源

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