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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU
4 `* [# V/ h. C( g4 n) Q8 e一、MPU的作用0 k. u) ~9 z2 s& _$ T' D! Z( R- T
防止不受信用的应用程序访问受保护的内存区域
$ ]' }0 T) z% r6 k防止用户应用程序破坏操作系统使用的数据
/ ]& F5 t. Q$ D通过阻止任务访问其他任务的数据区
  T5 |& b, ?% r2 J* a4 Y/ Q% M允许将内存区域定义为只读,以便保护重要数据。1 v0 ]% Y) \" p) Z& C! u
检测意外的内存访问
( B# l+ m7 W& o$ H: L简单来说,就是内存保护、外设保护和代码访问保护。+ T; H$ d; z& y
' W3 |9 z) R* o4 n+ O# Q( o9 w
二、MPU的功能实现
1 a* Y4 F, J: D​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。. \5 t& ?( I% h8 T

' J( @4 \; ?+ f1 l- s​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。
* e2 }7 K) ^2 t9 ^1 I5 Q: A$ M
) o- y) U9 D: g, u) y
20210326140155905.png
1 l  G. ^" R' Z( ~4 |% }+ P- p

, q3 `6 c) V4 n# {6 J% U8 l  Z三、MPU常用的寄存器(RASR寄存器和控制寄存器)" r# R# d9 h4 [
- Z" u& c# I4 d2 I! `( }
20210326140209187.png

* d1 S" b1 l4 q3 E3 ^3 A( T2 ~% p, F8 S( ~- v
XN位:表示是否使能指令的提取
' ^! J) u0 m+ c4 K7 N- YXN=0:使能指令提取,即这块内存可以执行程序代码' a* q4 V- d# M; S2 A- T
XN=1:禁止指令提取,机这块内存禁止执行程序代码
" Z' G2 u& A/ T) sAP位:设置指定区域的访问权限类型' r- f# D8 N9 l, Z' V6 m- j; [

4 E% S) Z" c% X8 \
20210326140223302.png

5 p8 s1 h; d. X) ]& n) [# z$ o- p! V) R( n. r, r: C% H' J6 |
TEX、C、B、S位:用于配置Cache的策略
& y6 h" \# }+ b& \$ I, e( {" r9 M' t! c: r; ]
C位:用于使能或者禁止Cache6 \4 A9 C4 k3 t$ G
B位:用于配合C位实现Cache下是否使用缓冲
2 o( ?0 `- M0 k. n+ gS位:用于解决多总线或者多核访问的共享问题
7 h1 B0 `/ C) i0 H6 e1 k# ~
8 N3 z, p5 J+ U
20210326140245895.png
- B3 h& F+ P7 J# ]' [3 `

7 k; `* `2 v( |2 X
20210326140254565.png

* r/ b# r7 x$ ^6 g, L
! @. P/ R; e2 {+ _read/write-through/back/allocate的区别:

* G0 s8 U  h+ k3 c6 q" b: x
& A) q$ S+ q0 W  q0 k- F  E一、CPU读Cache2 w7 ]$ c* s. V6 p

5 f4 \4 ^1 Y4 a6 R* kRead through:直接从内存区读取数据6 O8 p. }4 W1 ]& i
Read allocate:先把数据读取到Cache中,再从Cache中读取数据
1 A3 V! @% \0 o二、CPU写Cache
, _/ @$ w0 a/ v/ S' x9 D6 j* t5 G, h: {1 v5 l
若hit命中,有两种处理方式:
/ c) W& _6 x% G, R8 {" f# B7 T. H+ {  r- ?4 T8 I4 T: ^( i) n
Write-through:在数据更新时,把数据同时写入Cache和存储区' |1 e: }% J$ u( b5 r( I1 m
操作简单,但是写入速度慢
7 ]- t3 v# P/ @4 y: wWrite-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。# W3 R5 r( u4 J
写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回  Z. J5 o  [9 T) d- Y$ r6 N( M
若miss,有两种处理方式:* B( ]: q  b' u  z! X
6 z% p' h8 a: B: |( }- b  Q
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
8 x% H0 k- J2 w% ?0 rNo-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。
8 n7 {1 `* U/ q% m; p, b1 z什么叫hit/miss:0 ?( V( B( X7 U. f
一、读操作
4 H7 f! \! r/ ~: k9 r7 V
如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
3 i# U9 Y6 Z" J+ I  e* K1 ?2 s4 `$ h- G
二、写操作7 ~1 U% R+ k& ?! X( V
如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。4 }1 |7 L' q2 d0 {, A6 x, e
4 P! A, H7 C2 g. g0 v/ I" {- c
SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
3 q4 F- ?: ^. U# W0 [8 G: hSIZE位:配置保护的内存的大小) N5 N7 Q' t0 c; ~6 O/ Z0 w

7 _/ c& K: p3 T# Y. A2 _6 O0 }/ A' @, Y+ H
四、MPU的HAL库配置函数1 F, k! K% v- V9 w/ ^0 a! P3 Z
HAL_MPU_Disable:配置前要禁止MPU
  K8 M& N$ o7 l* x* h6 s# WHAL_MPU_Enable:使能
! [. B$ s/ W  J. t- F2 p一般使用参数MPU_PRIVILEGED_DEFAULT7 ?- I1 \1 s+ A3 ^$ n
HAL_MPU_ConfigRegion:配置MPU
6 ], w6 O# H) w8 v' T( a
  1. static void MPU_Config( void )7 u. n1 @% h6 q2 _
  2. {
    - S/ D  s' u1 U/ G& R4 Z0 @
  3.     MPU_Region_InitTypeDef MPU_InitStruct;
    9 L9 l( f7 N3 {& q4 g! Q; v- z

  4. 1 L4 T! P; w/ u! @/ t
  5.     /* 禁止 MPU */$ u4 c0 `2 X9 m! N4 w: e1 O- k2 C3 u
  6.     HAL_MPU_Disable();  y5 X3 c! p- ]9 D" K6 F* O  r' F
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */
    8 c+ h0 e. B. r

  8. $ e! S: F' h# ?6 i
  9.     //使能MPU
    ! l8 W+ O8 X9 l- U$ u
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   
    - O$ w& p2 m# C  v6 h: s
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐: R8 _. I4 l0 }( s0 X. a
  12.     MPU_InitStruct.BaseAddress = 0x24000000;8 Z( i5 O" ~. q0 N# f- d$ ^
  13.     //配置保护的内存大小
    7 a" N( ~; G6 U2 M; h; g$ u
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
    . r& N& S0 f6 b# I! W- h
  15.     //配置区域访问权限类型1 {, U8 Z8 X2 }( h
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    6 A. G2 F5 g$ M8 f7 |
  17.     //在开启Cache下是否使用缓冲( A# d* e" F; ]  P! O+ v: A
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    9 g  r$ n. p* E% ~! {+ D
  19.     //是否开启Cache* m  E" F+ e& R! K1 F+ O9 {
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;2 u* Z2 ^3 w8 L; ]$ {: k' K
  21.     //是否开启共享
    9 h/ C$ v# A/ Q  C( J0 h
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;+ q: \# D& ^/ m  ~5 l
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;3 s! H% E9 H; J, S  I: ?$ `3 d
  24.     //配置缓存的策略7 H- U* L/ J* ]0 Q
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;
    ) J7 c3 ^6 j! n9 m6 W
  26.     //是否开启子区域: F! l5 W' m: Q
  27.     MPU_InitStruct.SubRegionDisable = 0x00;1 @# m: q! b" X' T
  28.     //指定指令访问状态; \1 ^6 T- I# `0 x4 }% S
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;7 M. M: w$ o& [2 y; U( }. C
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    , z: {* P: o' I+ v

  31. ; X4 O- y- [% E+ Y
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    . u' E) s6 G2 g# p  `1 Q
  33. }0 z# M. n5 h, H

  34. ; u0 B8 {: q" W* K4 o: r2 j9 u5 O
复制代码

( f( R! B2 J3 g' g+ G+ C, K* g3 p7 n" s+ b4 s3 b$ {
收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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