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

【经验分享】STM32F7 MPU笔记

[复制链接]
STMCU小助手 发布时间:2021-12-12 21:00
MPU(内存保护单元)& Q* u- T3 T6 c. X& m0 Y$ Z. o
1. 前言1 t7 H3 t' c! k8 P0 Z5 B
在跟项目过程中,使用的F7和H7两个芯片,在用FSMC和FPGA通信时,由于其CACHE的原因,导致数据一直出错,后来通过加入MPU顺利解决此问题。因此,去学习了一下MPU,在此记录下学习的笔记,可能有理解错误的地方,欢迎指出。
; ^0 E" T- D/ N5 H+ J9 m/ D1 f参考:' E5 a$ C1 c: s- d9 m3 l
STM32F7中文参考手册.pdf8 s1 z8 q$ ?. q' L3 T8 ]
STM32F7编程手册.pdf
; \$ \8 f* ^. Y' R6 g6 ], z) DSTM32 MPU说明.pdf' j) }5 G" o" A! d  [
Cortex M3权威指南(中文).pdf
* F* j- M: F! q9 tSTM32F7开发指南-寄存器版本_V1.0.pdf
1 a5 z) R8 W. ^& k& g3 ^' J" V/ v) x( l- `/ P
2. 操作模式和特权级别; T  W# \$ O% q, w# P, J- y/ ^& J
详情------Cortex M3权威指南(中文).pdf-----chpt02
1 J4 w" Q1 D! m- J! Z4 X  U- c+ O5 z$ d
2.1操作模式
* d" O' H8 ]: S( {Handler模式:异常服务相关的代码
. F5 g. z/ k  x! o1 E: E( i线程模式:普通应用相关的代码
% B& Y/ ?) k. D' o+ o9 |3 w个人理解是如中断服务程序的代码与正常执行的代码。
( x5 K6 |' U, @$ r" ?  x  M4 q4 \2 ]) R$ _- Q' m7 K5 u3 E, W
2.2 特权级别- R" E9 R$ n3 ?; N
分:a.特权级 b.用户级
! D9 Z1 K0 Z- v9 Q! ~* E" U! a* N区别在于对存储器的访问权限不同,特权级相当于管理员权限,除了MPU限制的区域外其他都可以访问,而并不是所有区域都对用户级开放。
1 }4 I  O4 _- e( @2 r
7 s! a5 E: _# N# g: \. a7 T2.3 联系
2 F9 ]% N# J9 ~9 Q* |$ P# c$ |' s: N& `
20191228150751310.png
1 l5 Z6 S( E- u$ @/ x+ [6 g

6 d( J* H! e! t9 d, S" _正常执行的应用程序代码,对特权级和用户级开放;但是异常代码如中断服务程序,仅能对特权级开放。
9 ]) {* m7 V  E+ U: J( Y' l- X" u( [. ]2 S# t8 L+ D4 e, R9 f
20191228150918107.png

; l7 R% ~2 N- h# ?
8 ?' y( M: ~" }- E% u如图:当产生异常时要去执行异常代码,执行完成返回到断点。而无论在用户级还是特权级线程模式下,即使是用户级,在进入handler代码时也会暂时被提升到特权级模式,因为handler模式不能被用户级访问。! d7 f4 h! c/ N& a
特权级可任意访问,包括切换到用户级,仅需要修改CONTROL寄存器即可。7 `! }; ~, H1 j( z* [
但是用户级切换到特权级不同,需要先申诉(执行SVC指令,触发该异常,进入异常服务代码),由于异常服务代码中是特权级模式,因此可以任意修改CONTROL寄存器,这样才能将用户级----转换---->特权级。4 ?0 d7 Z8 ^' q( D2 ]  l

' a' K$ V% R! e3 o. F: y3. MPU& R# |; N2 [! D# P# s3 h* k
Memory Protect Uint-----内存保护单元5 V) v1 b( _; u: \+ G

' k6 w3 N: _2 r2 `) S0 X3.1 作用6 `1 `* }5 ~  [0 h( [; Q
参考了以上的PDF,大致说了以下的作用。# S" i) x+ U6 h( C& m

) ^- n5 }( c* P8 P- _: Y0 |- Y
20191228154605163.png
2 X& \2 i. d# j8 H. j
4 T9 K9 d( L! r( [1 L! P
其实更多给我的理解是:通过MPU对存储器的某些区域进行属性设置,设置其对特权级/用户级开放,可读可写/只读/只写、禁止访问、全访问、支持/禁止CACHE、缓冲等等的属性,通过MPU管理存储器,不至于某块内存被非法访问、数据破坏、CACHE等等。# w" C5 [2 H/ g& b

) ]9 y' C' G0 \1 a7 F. Y3.2 REGION(区); {& r. ~' j2 u; p. H, Y# t* v2 o
STM32F7支持8个区,也就是说,MPU控制器通过8个区来管理存储器。0 d1 D5 a0 M" d, h8 c7 e5 b
如果8个区不够,每个区都可以再细分为8个子区。大概理解图如下
4 u4 O& ]9 X! M7 |0 n7 _9 [* S, t/ ?4 q
2019122815582658.png

5 i; k( g! o! q$ X$ F0 u% @$ \0 J6 U
背景区
' n! P' u+ [/ m3 b" y" N+ O背景区,即没有被设置到MPU管理区的其他所有地址,背景区只能被特权级访问。否则出现MemManage异常,如果开了MemManage,会进入MemManage中断服务程序。# \" L: W* i4 j( @; Y' p4 S

+ W9 {1 g' Y' x) N, N1 G3.3 MPU寄存器

( i( j# g3 A0 ~0 [- n" eM3权威指南中的MPU寄存器) m" z3 m8 }8 l& }! b$ ]4 G

! `# m1 L7 v8 V& ?
20191230094650359.png

/ H3 m: Q9 S% t" P$ ?5 R
( l4 P; X% W2 D* w) V$ P3 T$ @7 }原子教程中的寄存器
; ^! i, y4 A; J8 s# V
) B: W' ~" s+ U( n8 l% w1 F& ]2 L8 K. t
20191230094823372.png
) w) y) x; d' \) n" b9 v/ q1 |/ r
) S& Q) C6 l3 T
M7 MPU手册
; N7 `5 p# L, @0 L4 I* @. _( G2 B. }, M3 {8 B+ V# y2 _
20191230100630574.png
6 M/ h0 F! U7 x3 v. N# {- ~

; L( y& H3 w: PMDK工程中MPU控制器的寄存器
( {- S& B; d9 V4 [# e  Y" B5 G% Y" `. g
20191230094954114.png

7 K4 z3 `5 M8 w; b5 m7 J" a6 `! G3 O5 r1 w2 j
其中  Q  _, l9 O; x+ r9 @! K# l- y% m
  1. #if (__MPU_PRESENT == 1U)/ c/ a" W- _" d# O
  2.   #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */
    ' ^( }( Y! x( ^
  3.   #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */! m( H, Q  z' K
  4. #endif* X7 K0 }* r5 |: h
  5. 9 T, e: k0 d9 {4 A& x
  6. 1 [- Z5 }/ [  a# s, j1 f' P1 _2 Y5 }$ g* e
  7. #define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */
复制代码
) A* X& V( \  F1 P3 c$ {/ K- G' `* @
可以看出MPU指向0xE000ED90,并结合MPU_Type类型,可以推算出,其每个寄存器的地址,都和M3权威手册中的寄存器对得上,因此放心操作。4 M2 `1 O/ S( F7 O6 x) V  x0 o

' k9 d- w  x* Z: eMPU 控制寄存器(CTRL)/ }$ J3 ]$ u8 G
7 \# y6 X- `5 {( i
20191230100816571.png
" W; h" `$ ?9 @. l5 G& @/ n( I' D/ L

3 ?# Y1 K4 N! }/ L仅三个位有效& {8 x2 g/ R# G  X  u
PRIVDEFENA:配置为1,特权级能访问背景区,用户级不行,而配置为0,仅能访问REGION区,其他都会出错,包括属于背景区的区域。% u( v) u. P6 B3 _0 C9 C6 H% U0 l
HFNMIENA:用于在NM1或者FAULT中断关闭MPU6 i( G5 I, ]- ~% k
ENABLE:使能
1 e1 P/ p1 ~0 Y  e! M- i$ [7 @- K0 {% z- t. ?* V& H3 U/ A
编号寄存器(RNR)
5 U8 {3 r! H: ?" m, M2 A, e( h) f
* K3 F* t' {4 X+ J2 x
20191230101328822.png
/ S+ ]4 I+ f6 F8 D" l8 V. f

. A4 u# A6 x: W8 y7 G8 P- ?2 V/ T8 b配置每个区时要先写该寄存器,MPU控制器就知道在配置哪个区。比如要配置REGION 1,需要向RNR寄存器写入一个1;配置好后需要配置REGION5,仍向RNR写入5。
+ f- N% Z) I- ^! Q
" e6 x. J8 ~" F$ \0 Z# G& v' oMPU 基地址寄存器(RBAR)7 g- S2 _0 m8 _, d
& a6 I3 l; |6 E$ T  Y6 B9 A/ }; M
20191230101535603.png
) L$ n  R( f3 j( v/ Y1 T
1 P$ Z9 ~! s' k, a- h' A% O
一般不适用VALID位和REGION位,这两位的意思是覆盖RNR里面的值,也就是这两个的值才是我们正在配置的REGION,RNR不生效。! e: H( S+ `# D# j. e$ ?2 K

9 W( O; t+ z% F( V; TADDR:配置MPU某个REGION管理的存储器的基地址,要求是----需要该地址需要是REGION大小的整数倍,比如REGION1设置为64K,那么ADDR的值需要如0X0001 0000、0X0002 0000等,0X0001000065536/102464K刚刚好
# Y6 a9 K  y, g' ]' ~' Z1 [* Z5 t' A9 `1 u/ o& \6 F" a  P/ B
MPU 区域属性和容量寄存器(RASR)
6 j6 q; a* G. O4 h$ W8 r1 O: j- \$ \
! V, q9 \* |, _/ y9 d
20191230103223269.png
* N8 [" e6 X) O9 J

& ^+ ~7 s0 L/ f5 h% E5 A! `' nXN:设置的REGION区管理范围是否允许取指* S5 z: j& Y* y) O
AP:基本是6种形式。6 v5 s" ~; a3 W3 ]* C
6 |3 T5 j9 U! T# ?6 `/ ]% v
20191230103426788.png

8 L0 `7 r1 L  O% y; E& q
! j' a: M5 j! |! q# o9 V分别是:全禁止(任何级别不可读写),只特权可读可写,用户级不可写,任何级别可读可写,只特权只读,只读。# O* S& A6 L- i8 R3 M" c5 I
TXE,C,B,S
+ S1 v+ \6 m) X& x- k" F0 ?& t
* I- I) w" D( \; g+ D' B! {
20191230103747475.png
+ _% H! s# v4 [0 ?0 [& g

( ]6 p$ h( z5 _+ {6 h3 j# O9 I  m
20191230103850819.png
8 H! r* K5 v% F3 a- e

# ?& {; _: s) ~/ v其中:
0 K3 b9 M! m6 Q2 T; f( x, ?) p强序-------------按照程序一条指令一条指令顺序执行。
) a0 z' d$ M- q' ^0 R" L# d' N共享------------一块内存可同时被多个设备访问,比如两个DMA同时访问某个区域。
9 D& [; G" u, S0 I6 B6 E6 e5 `缓冲------------类似有个缓冲器,但是要考虑是否有数据缓冲的阈值,未验证。
, d3 v% N/ P; w) E/ k7 u缓存-----------CACHE,有命中和MISS,可能造成数据不一致,但是效率较快。, f; I8 }+ J" e' G' E' \5 T0 P
写回-----------CPU更新到CACHE,仅当需要丢弃时CPU将数据更新到主存,期间数据不一致。& n5 ?% r- g3 n3 @, R( V
写通-----------CPU更新数据时,CACHE和主存都更新。
( x- o/ t7 f+ R$ R6 h) m4 E7 q% D: Y
注意3 j2 g8 [. H. P7 u
M3权威指南中,P195,需要SHCSR使能MEM中断。
9 x- N5 o& ~7 f2 \. G$ S; Y6 P9 p7 R2 u
20191230105312512.png

" J  B7 ?5 f8 e1 a5 a4 p7 _5 o
/ {+ d0 t/ ]+ z: ^& b$ z* v3.3 相关代码
/ ]4 L- d- Z; n+ ]
初始化,将SRAM 0X20002000设置为128字节,不可共享/缓冲/CACHE,且只能特权级读
$ l& t4 ?  @( A3 E% ]8 i& E+ W/ n! p3 E, }# \  W- Y
  1. /**************************
    : C1 Q1 l9 D/ z4 t+ |
  2.         名称:STM32F7_MPU_INIT0 D' d! Y2 r# L& p% X, {# r* E
  3.         功能:MPU初始化& h$ x* o, B# W
  4.         参数:无
    6 c6 u: T6 n: ]
  5.         返回值:无
    * |7 O- ?+ n1 q7 \
  6. ***************************
    # x; {3 r0 r" ^5 W+ D! J+ A
  7. */
    / a; _' [/ t' Z$ q5 E; X
  8. void STM32F7_MPU_INIT(void)( |$ Z- K& j+ ^' t- F; }. Z
  9. {
    & M2 K2 I+ @$ w7 k
  10.                 u8 i = 0;" s7 U! ~2 J) D2 {$ R0 z
  11.                 u32 rasr = 0;# v/ d6 x/ T/ [6 o
  12.                 & a  Z' p6 E. d' B* p/ b8 X* f
  13.                 STM32F7_MPU_DISABLE();                // 关闭MPU        
    # E% G4 w6 N6 t: u4 Y& L
  14.                 //MPU->CTRL &= ~(1<<2);                        // 背景区
    + S4 N- H* _: F
  15.                 MPU->CTRL |= (1<<2);                        // 背景区( i. ~( T% C( _  f/ n; X' B
  16.                 MPU->CTRL &= ~(1<<1);                        // 不强制除能MPU' H! o6 e; l# b4 ]/ B! b2 t
  17.                 MPU->RNR &= ~(0X7<<0);                // 配置哪个区,只有低3位有效
    6 Q. f' E6 q: l9 s/ f4 M
  18.                 MPU->RNR |= ((0)&(0X7));        // 使用1区& W% |; }6 r% S- p& R
  19.                 MPU->RASR=0;                                                        // RASR清0
    & L8 U* F8 V) a# b
  20.                 MPU->RBAR&=~(0X1F);                                // 不认可region位
    & T* Z' s! |. L% l; ~
  21.                 MPU->RBAR|=0X20002000;                // 地址0x20020000$ D3 |$ P1 \/ W. Q$ N- w
  22.                 rasr &= ~(1<<28);                        // XN : 1禁止取指  0允许取指5 V5 [5 q( J' l
  23.                 //rasr |= (1<<28);                        // XN : 1禁止取指  0允许取指
    . M" I7 C- b# B
  24.                 rasr &= ~(0X7<<24);        // AP:101只读  T; r4 _" s; `' A9 `
  25.                 rasr |= (5<<24);
    # ~% L( D  q& R# \9 ?7 i
  26.                 rasr &= ~(0X7<<19);        // TEX:001  C:0 B:0  S:0  片内外不可缓存型内存- ^2 t* f- [8 Y9 c8 @- x2 i
  27.                 //rasr |= (1<<19);
    : s4 a$ ~; |, b
  28.                 rasr &= ~(7<<16);
    8 D) E9 z2 [# r+ \
  29.                 //rasr |= (1<<16);
    / k, M% v) x  q+ \/ V: P$ g
  30.                 rasr &= ~(8<<8);                        // 不使用子区域  u, N6 F1 @; x2 ^
  31.                 rasr &= ~(0X1F<<1);        // 64K = 2^(15+1)
    ! V0 O7 J& A8 g
  32.                 rasr |= (6<<1);
    % W: w$ q3 J. Z9 X+ Z) ?
  33.                 rasr|= (1<<0);                        // 使能该区
    # p6 u0 V0 I" e9 A( s. T% }
  34.                 MPU->RASR = rasr;
    3 H  P7 C& F1 X3 o2 l
  35.                 // 使能MPU
    ! y) m  _6 t# b2 ?3 W
  36.                 SCB->SHCSR|=1<<16;                //使能MemManage
    3 k) L/ E- l: a9 ^
  37.                 MPU->CTRL |= (1<<0);: m2 H7 V3 s: T0 M8 H* p
  38. }
复制代码
) }$ q. M! o* K% m, H* |
测试,写入一个值,即进入MEM中断& q( X4 g" P$ Z4 p: [# x/ j% x5 I
* ^* j) y1 y6 `3 P
  1. u32 mpu_test __attribute__((at(0X20002000)));
    & x7 v* y+ d3 `- Y: G2 o: d4 `
  2. void MPU_Test(void)
    ; j7 m3 R9 F0 |
  3. {
    : j, Q/ Y& @2 |2 B! `" |8 q% V
  4.                 u8 key = 0;
    , t* p8 D5 [, L* a3 I4 X
  5.                 key = KEY_Scan(1);
    " Q  @+ {  `! z6 D% [  Q
  6.                 if (key!=0)
    $ E5 A5 u6 ^$ o: \
  7.                 {9 r' W, i- d) j
  8.                                 mpu_test = 20;
    - I. E& V& ?" e; z/ }; j
  9.                 }
    0 B/ ^, q$ C. ?8 L6 c" Y0 w: ~2 a
  10. }/ h3 Y" t- ~. j. ~0 I% ]2 E
复制代码
( Q% {. Q$ `: o% v9 ?9 i. s, @5 X  X

+ C$ X" J; J- M( C0 v
  p5 j) i1 s) N' u) D* t
收藏 评论0 发布时间:2021-12-12 21:00

举报

0个回答

所属标签

相似技术帖

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