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

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

[复制链接]
STMCU小助手 发布时间:2021-12-26 15:36
STM32H7-MPU
5 Z5 t& A- o, ~1 r& G. V一、MPU的作用
7 b5 B- i( r8 x0 c0 t0 v防止不受信用的应用程序访问受保护的内存区域: j' c$ n3 l, z& O% k% L, L
防止用户应用程序破坏操作系统使用的数据
; Q- i, I- \( M  N$ s通过阻止任务访问其他任务的数据区' `5 S: {# _. ?/ v# K. L
允许将内存区域定义为只读,以便保护重要数据。% C, n2 }! M% ]* ~% ?. d3 \
检测意外的内存访问0 j0 F1 m  i. x. j- a3 |
简单来说,就是内存保护、外设保护和代码访问保护。  ~% w5 _5 n0 G7 \) Z6 C
/ \, {9 Y# _9 R1 z8 W
二、MPU的功能实现3 C" z" L0 x  D& T: A$ I
​ MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。9 `- \+ k8 D- ?
% E0 V  O. ]" @
​ MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。) V! C- W; F! Y# Q: C# x& E
0 r  m! j2 Z& C, u: \7 J
20210326140155905.png
, c$ c0 I( P* l8 c# D0 p' D
. C% q$ Q0 a2 k) C4 c/ n
三、MPU常用的寄存器(RASR寄存器和控制寄存器)' k$ z# Q, Q6 o! u4 Z  P% o+ g

. `4 n# W: s; k# S; i% h* @5 `8 q
20210326140209187.png

8 v, M5 P) K1 `. ?( l0 B  \9 d3 ?3 Y2 @1 s: m+ I! S
XN位:表示是否使能指令的提取! e$ O; _( L7 e: d: T3 c: U
XN=0:使能指令提取,即这块内存可以执行程序代码
6 K  M( _7 K  r/ l  u4 PXN=1:禁止指令提取,机这块内存禁止执行程序代码" F/ D- G% r. A+ h
AP位:设置指定区域的访问权限类型7 l6 }# X5 {6 N* K8 T0 Y  g4 f

! z& I0 E2 F2 [- \
20210326140223302.png
- p3 {* }! B9 S9 e- b

2 a$ ^! T$ i5 z/ t* z% hTEX、C、B、S位:用于配置Cache的策略
6 ~; k0 o9 @9 U$ O! x3 T, C' v' L
C位:用于使能或者禁止Cache6 l2 b8 ?3 |, j* K
B位:用于配合C位实现Cache下是否使用缓冲
( i, M. F+ {5 Y+ l  y/ H: L: IS位:用于解决多总线或者多核访问的共享问题0 f1 }6 o( N# b6 t. @

- S$ e5 E5 Q: Y1 [0 O5 |
20210326140245895.png
" q3 O5 ^$ F& `/ c2 ?: x* l
) T5 V# N6 n+ {, F
20210326140254565.png
/ N8 U; `  F' |
4 G$ @% C8 j- C: P# q2 h
read/write-through/back/allocate的区别:
* y' t# k6 ?! e: R" K6 z

$ y/ I( F9 V. i5 Q* @一、CPU读Cache
6 @9 |% ^) `! t& r$ L8 E+ r8 \
% |( t9 w# \( t- RRead through:直接从内存区读取数据5 _" w. @$ O, z+ K7 ^& ~
Read allocate:先把数据读取到Cache中,再从Cache中读取数据
& G1 L" I% i2 [# R/ `2 e3 v7 p" D二、CPU写Cache
3 t' |; M% `: L/ z8 w8 `; F+ t4 d- U
若hit命中,有两种处理方式:
3 z% p* m2 h" S2 d7 R& q
4 a) V: {2 ?% N& G2 gWrite-through:在数据更新时,把数据同时写入Cache和存储区
! Q% |7 ~7 A5 z- O- S9 w; _6 F) P+ j操作简单,但是写入速度慢3 M8 {9 W% o7 M. d4 h. H
Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
  x6 P; L$ @6 g; }+ b写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回2 H- q  z" x& V- [7 m
若miss,有两种处理方式:! K( s9 y' w' g
: @6 x3 v: q& e3 N) ^
Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。
$ R& L0 a' N( l. HNo-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。
/ H: B$ o& j: [; _什么叫hit/miss:
5 Z8 P) \& N% y4 @: `: o一、读操作

; w  w; Q" M, V4 h( X* {6 N如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。! P. Z- b/ N7 A, z: @) o5 Z
& k  Z5 L: ]' c! d
二、写操作
6 D7 s3 c! n# l4 X1 j2 `  R如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。, M! p! B4 R6 ?! m9 b. |
: H1 o# G* \0 k& Q
SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
- I9 y4 V$ e3 B! B6 Q& C6 r3 pSIZE位:配置保护的内存的大小
% {$ P, ~: Q; w' n
% M3 B8 P, m7 \, l  m5 F" u, K0 S! z
四、MPU的HAL库配置函数
7 q) G* @, {- p9 m' {HAL_MPU_Disable:配置前要禁止MPU
2 T  q  T' ?# P) A* ?& `* }, l- \+ _HAL_MPU_Enable:使能
0 r) K4 H2 o7 z一般使用参数MPU_PRIVILEGED_DEFAULT. S! A, D9 V! b
HAL_MPU_ConfigRegion:配置MPU
- |2 H6 W) S: ?6 b6 y5 w9 ^  G
  1. static void MPU_Config( void )
    0 m1 `$ U, s( V
  2. {$ @+ r0 p& B4 H, j/ d
  3.     MPU_Region_InitTypeDef MPU_InitStruct;
    6 _# E6 R: _% t1 L7 v
  4. # G" w) W; V' n+ \4 w3 X
  5.     /* 禁止 MPU *// w, v& Q: J) T0 M/ O3 S  ~4 ]
  6.     HAL_MPU_Disable();
    # h& x- k+ C0 m+ @
  7.     /* 配置 AXI SRAM 的 MPU 属性为 Write back, Read allocate Write allocate */! J) D: m+ I9 }; m2 s. H

  8. ( D. F4 {+ X" |. L$ t9 n
  9.     //使能MPU8 F. E. e, n. e" v; o* X
  10.     MPU_InitStruct.Enable = MPU_REGION_ENABLE;   8 u* ^$ A$ w" r. n
  11.     //指定MPU保护的内存起始地址,注意要和下面的大小进行对齐
    ( w8 r( h+ x8 d
  12.     MPU_InitStruct.BaseAddress = 0x24000000;- |) i$ E  S7 l! ?  Q% Z
  13.     //配置保护的内存大小
    # `6 I0 S" {" h6 b6 W
  14.     MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;! {$ ?" j! _5 C9 g. r$ e
  15.     //配置区域访问权限类型
    # \  T7 u; {6 s) c9 Q
  16.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    1 J2 K6 N& ^1 y/ g* k
  17.     //在开启Cache下是否使用缓冲: ^# z6 @2 Q  L6 }
  18.     MPU_InitSt ruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    , V2 p/ ?( p& ?
  19.     //是否开启Cache
    0 A4 L. [) s+ H
  20.     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    / y4 ]: r% s8 T  {% R
  21.     //是否开启共享# o& [, N1 E  ^! _6 I% i4 q
  22.     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;) D7 w5 V4 x& n
  23.     MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    6 r3 D( g( W4 M4 v0 G$ M7 l# [
  24.     //配置缓存的策略" v; t, J& r2 S1 |
  25.     MPU_InitStruct.TypeExtField = M PU_TEX_LEVEL1;( X" [! h' }& ?; P2 S
  26.     //是否开启子区域6 r3 i/ `4 y0 p  k/ f6 o9 P
  27.     MPU_InitStruct.SubRegionDisable = 0x00;4 i! ~* ?/ D" f3 A1 v4 U
  28.     //指定指令访问状态- \; R7 M" r/ p
  29.     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;5 }# i8 j2 V/ J+ V1 E
  30.     HAL_MPU_ConfigRegion(&MPU_InitStruct);( u! l8 U. W" F, @7 @3 F
  31. * c& b9 P3 u6 Z% A+ ~" A
  32.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);8 |1 I# u4 A2 i' X' y, F
  33. }/ V4 y+ n7 g4 B6 k  t8 H% I7 a

  34. ! |. P# q  o5 R' P# U
复制代码
# w% q* e% K- D% b# I
3 F# Y% k3 b( K* q
赞 收藏 评论0 发布时间:2021-12-26 15:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版