目录

STM32H7,MPU和Cache使用场景

在默认的配置下,静态内存优先使用128KB的DTCM。原因是CPU读写DTCM内存的速度是480M,所以一般优先使用128KB的DTCM。CPU直接读写其他静态内存的速度仅仅只有200M,白白浪费CPU的480M主频了。为了解决这个问题,Cortex-M7架构有了cache。通过提前将数据缓冲到12KB的cache,然后CPU再从cache里读取数据,这样就能解决当CPU读写AXI SRAM与SRAM等内存时所造成的性能损失。

image-20240628133633560

通过配置MPU,能够配置并正常使用CPU的cache。最常用的情景是ADC+DMA采集模拟量数据。因为DMA并不能将外设采集的模拟量数据存放到DTCM里,一般只能放进AXI SRAM、SRAM1、SRAM2、SRAM3里。此时,就需要使用MPU+cache提高CPU读写AXI RAM,SRAM等内存的速度。

image-20240628134335756

最简单的方法是使用STM32 CubeMX配置,可以将MPU的设置分为三部分。第一部分是配置MPU的内存地址,第二部分是配置Cache的读写规则,第三部分设置保护规则(配置MPU是为了使用Cache,所以不用保护)。

image-20240628134449263

CubeMX的MPU和Cache配置界面如下:

image-20241225105818884

界面中配置项与寄存器对应关系如下:

配置项 寄存器 说明
CPU ICache 内核CCR寄存器bit17,名称IC, 使能1级指令缓存
CPU DCache 内核CCR寄存器bit16,名称DC, 使能1级数据缓存
MPU Control Mode 内核MPU_CTRL寄存器 使能MPU,使能默认存储映射作为背景域,hardfault、NMI和FAULTMASK中断时MPU不使能
MPU Region 内核MPU_RNR寄存器 使能某个保护域
MPU Region Base Address 内核MPU_RBAR寄存器 保护域的基地址
MPU Region Base Size 内核MPU_RASR寄存器SIZE 保护域的大小
MPU SubRegion Disable 内核MPU_RASR寄存器SRD 子域不使能
MPU TEX feild level 内核MPU_RASR寄存器TEX 访问等级
MPU Access Permission 内核MPU_RASR寄存器AP 访问许可
MPU Instruction Access 内核MPU_RASR寄存器XN 指令访问使能
MPU Shareability Permission 内核MPU_RASR寄存器S 共享许可
MPU Cacheable Permission 内核MPU_RASR寄存器C cache许可
MPU Bufferable Permission 内核MPU_RASR寄存器B 暂存许可

CPU的内存访问类型有Normal、Device、Strongly-ordered。

Cache策略有Non-cacheable、Write through、Write back and no write allocate、Write back and write allocate。

其中只有内存访问类型Normal支持以上4种Cache策略。内存访问类型和Cache策略的使用是通过配置MPU和Cache来实现的。

内存访问类型 Cache策略 配置方法 说明
Normal Non-cacheable 指令访问使能,共享不使能,TEX为level1,cache不使能,buff不使能 无缓冲
Normal Write through 指令访问使能,共享不使能,TEX为level0,cache使能,buff不使能 no write allocate, read allocate,透写,写不开辟cache,读开辟cache
Normal Write back and no write allocate 指令访问使能,共享不使能,TEX为level0,cache使能,buff使能 no write allocate, read allocate,回写,写不开辟cache,读开辟cache
Normal Write back and write allocate 指令访问使能,共享不使能,TEX为level1,cache使能,buff使能 write allocate, read allocate 回写,写和读都开辟cache
Device 无 指令访问使能,共享不使能,TEX为level0,cache不使能,buff使能 有序访问(如ETH MAC的tx/rx描述符缓存区)
Strongly-ordered 无 指令访问使能,共享无关,TEX为level0,cache不使能,buff不使能 强有序访问