STM32H7-MPU 一、MPU的作用8 `1 M* T# g l9 ]! S. A: | 防止不受信用的应用程序访问受保护的内存区域" Y" R/ N/ k1 e& r 防止用户应用程序破坏操作系统使用的数据 通过阻止任务访问其他任务的数据区4 \5 B' s: ?& R: P9 l) }: H$ r 允许将内存区域定义为只读,以便保护重要数据。 检测意外的内存访问 简单来说,就是内存保护、外设保护和代码访问保护。 二、MPU的功能实现 h4 ]$ e7 H/ a' d) I MPU可以配置保护16个内存区域,每个区域都是独立配置的。每个区域的最小要求是32字节,同时每个区域还可以配置为8个子区域,通过寄存器对应的bit来使能。+ q/ E5 W2 r' K2 f' n5 r0 { MPU可配置的16个内存区的序号范围是0-15,还有一个默认区(背景区)序号为-1,这些内存区可以重叠以及嵌套——序号为15的优先级最高、背景区的优先级最低。例如下图,共有七个内存区:一个背景区+序号为0-5的内存区。内存区4和内存区0、1有重叠部分,则重叠部分按照内存区4的配置规则执行;内存区5被完全包含在内存区3里面,则这部分内存区的配置按照内存区5的配置规则进行。% Z( N; @9 I. b& K! ]3 S7 f ) k1 ~! P4 e0 P. f % h$ ?) p2 {- I* ~ W: ], ] 三、MPU常用的寄存器(RASR寄存器和控制寄存器)% `8 E( Y4 ]) l/ r+ ~, s! V 6 _) E$ t" f0 J0 N$ R/ q, E7 k XN位:表示是否使能指令的提取 XN=0:使能指令提取,即这块内存可以执行程序代码/ P X( J0 F$ i) S( _ XN=1:禁止指令提取,机这块内存禁止执行程序代码 AP位:设置指定区域的访问权限类型 ( n. d; `* w3 t8 b+ t 8 e6 Q5 x9 U8 L' E% }6 X TEX、C、B、S位:用于配置Cache的策略; @" ^, x O" x$ d m! M B9 c8 V6 p! h. C& n8 S3 H0 j C位:用于使能或者禁止Cache/ ?( g# i/ ?$ h B位:用于配合C位实现Cache下是否使用缓冲; J8 q6 Q: ^: J, A( l S位:用于解决多总线或者多核访问的共享问题4 E0 y$ a) ]+ V; m3 |% n1 V/ ` 2 T ?- l& E3 ?' ?+ U, B4 s ! F6 m( ]! j. S: n* M7 n read/write-through/back/allocate的区别:( Z* \ m% { F, ]- _+ o- g% p7 P 一、CPU读Cache ; U4 j! w( S: g5 x3 G# ^. ~) O Read through:直接从内存区读取数据# |" T* F% V/ e Read allocate:先把数据读取到Cache中,再从Cache中读取数据 二、CPU写Cache 2 f6 L1 ]6 Y; k0 D, a 若hit命中,有两种处理方式: 6 ^ j# ^! M" H" [ Write-through:在数据更新时,把数据同时写入Cache和存储区2 C( u" B' |! p2 @% g 操作简单,但是写入速度慢0 e( D0 _' G! j+ r. V9 ^ Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。" ^; Y% z! |0 C' K 写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回 若miss,有两种处理方式: 9 a* C, a/ K* k% i5 M$ { Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存中。; t( E+ b& v" H4 O! Q+ \9 b No-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。 什么叫hit/miss: 一、读操作5 P# R1 c. P, C; z* r( i% R. L 如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。 二、写操作" g1 `4 u0 z# b3 r8 y 如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。& H& K: {: v/ E/ v) d + f; P8 c* g; N7 \ SRD位:用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启+ H2 Q3 n/ k) s% V+ {% v/ ~* \7 S/ H4 N SIZE位:配置保护的内存的大小, A3 a( t/ k' ]! [7 x4 @) e + N6 l( `: }' ]" ?4 c I 四、MPU的HAL库配置函数 HAL_MPU_Disable:配置前要禁止MPU HAL_MPU_Enable:使能% C4 ~2 S) C, S) x 一般使用参数MPU_PRIVILEGED_DEFAULT7 O( {6 h- F6 G) L: E) I HAL_MPU_ConfigRegion:配置MPU
|
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题