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

MPU 子区话题

[复制链接]
STMCU小助手 发布时间:2023-2-15 21:40
1 、问题起因 有人询问 STM32F7 和 STM32H7 系列库例程中有关 MPU 配置中的下面这句加绿色下划线的代码的意思是什么?有何用?
) m, z5 D5 y- ^7 C5 C* Q: C* B) _$ Q, A5 l
  R" P+ l/ f/ g1 K0 |! r
@BFX7121@RORGC]~@F$O81E.png
. Z/ U3 j( ?+ y. `& ?* k# y
; q3 ?/ G) ?. B) {5 F$ K

" o- q' d8 h  w" Q6 q从上面截图中的红色框内代码我们不难看出,这里进行 MPU 设置就是将从 0 开始的 4G 空间,即整个STM32 可寻址空间定义为 Strongly Ordered 存储属性。且此时 MPU Region 编号为 0。可代码注释上又说只是将未定义的区域配置为 Strongly Ordered,这未定义区域到底啥意思,该如何理解?难道跟绿色下划线标示的那行代码有关系。
6 q0 c7 n4 B/ p# t. j- T- E7 f
& y, L" ~" E" ]6 m7 N6 Z5 t+ V
  o8 r( f, Y( ~3 H
那么,这句代码 MPU_InitStruct.SubRegionDisable = 0x87; 又是什么意思呢?) p+ M0 @% V- n+ w2 @" s) @+ U

2 {! U7 L$ h0 s% d; |8 u9 @

( t- M4 l; n& d0 Y+ e- s要理解这行代码的意思,我们就有必要了解 MPU 的子区概念【Subregion】。
( \8 O! G0 [* s- r& u$ }8 z7 c# A
3 c. {) Y9 e" Y) C4 g1 A2 、问题解析  q. e# C3 i9 E% u$ j0 r+ A
所谓子区【Subregion】,当我们对任一存储空间不小于 256B 的区域【Region】进行 MPU 配置时,往往可以把该区【region】等分为 8 个子区【Subregion】,并可以把当前 MPU 配置选择性地针对各个子区进行排除性设置。在内核里有个关于 MPU 配置的寄存器 MPU_RASR,其中有个 8 位字段 SRD 就是用来设置各个子区的 MPU 排除性设置或者说例外性配置。如果某位为 0,表示该子区适用当前 MPU 配置;如果某位为 1,表示该位所对应子区不适用当前 MPU 配置,即不受当前 MPU 配置约束。下图是 MPU_RASR 寄存器的描述截图: % v" @* C* t8 [+ z- h, j0 K! ?

+ U& L" O! A! h& v

6 m* a# E: x* P X~W0PUKK$(M)YA9`YBBXFGK.png
3 v% r! i- K; v. s
5 N7 _- ^# _- v1 {% }% R

5 s" E! t. O' z. w不妨举例说一下。假设我们选择了某 64MB 区域进行 MPU 设置,属性配置如下:+ j' B2 M7 |8 [8 F2 x) U
" W7 x" Z4 H; C& c$ ]

  b0 S1 M8 A7 k9 G 3U7BNJHA[IHUFH12E]C4POP.png
6 Z2 {9 t( M; A6 O9 g8 o7 ^
4 H- o, c* g; Z4 _
7 F  U8 c" z5 J) {5 R
基于上面配置,该 64MB 空间配置为不共享、可缓存、可执行程序的 MPU 存储属性【细节可以核对下图4,其中 C 表示 Cacheable,B 表示 Bufferable,S 表示 Shareable】
% C; m7 q2 z) q. l0 ~  y5 U3 W" L7 o

& S9 q' ?- m$ v9 n6 ` 783IFZ5BB1SO_B3W65J_]ZL.png " U- E8 m0 d8 w# q; e# X: x

/ O$ Y2 ?7 e% Q5 s" W
7 U0 z6 n. }: K
这里有针对个别子区做了 MPU 属性排除操作,就是下面靠这句代码实现的:MPU_InitStruct.SubRegionDisable = 0x28;//即二进制 00101000  u( N( ?) N+ F+ j

' N; P6 ~. R/ x* R9 J

+ V' {1 K" E3 q. w  ^前面说过了,我们可以将大于 256B 的存储区等分为 8 个子区并做 MPU 属性排除配置。这里的 0x28 对应的8 位 2 进制数表示各个子区针对当前 MPU 配置是否被排除在外的情况,若某位为 0 时表示相应子区适用当前 MPU 配置属性,为 1 则不适用当前 MPU 的配置。
: v6 _) J2 }* e  W/ w7 t! t2 C7 C5 m: `1 A6 d1 r$ X8 F1 c
2 \  M7 I# ]: s% P
结合前面寄存器描述和上面配置代码,被排除在外的即不适用当前 MPU 配置的子区就是下图 5 中的两个地址空间【标红色 1 的地方】:% ?- A, D) \& [

. U& O' [  I" y! t& |3 `

: e* ^" U* Y$ s# V LEBG5JPY86IY4EY}96K$_UU.png
( s. L& s9 e* R. T5 T9 y* W+ ~
: Q! F$ M' ^/ T/ b. Y* Y9 O: g  V

& Y- o+ X1 c$ O若把上面图形左转 90°即可看明白刚才那个 SRD 字段的配置值 0x28 的由来以及地址空间对应关系,SRD 的高位对应高地址子区。基于上面配置,有 2 个 8KB 空间是不适用当前的 MPU 配置,即被排除在外了。
5 Z8 J8 ^' |# ^( q" _& X) l' C$ s# K8 }

6 R7 A& V8 z) D5 y0 |& W* p/ B完整版请查看:附件 MPU子区话题_v1.0.pdf (866.6 KB, 下载次数: 0)
赞 收藏 评论0 发布时间:2023-2-15 21:40

举报

0个回答

所属标签

相似技术帖

官网相关资源

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