关于STM32F4上CCM内存知识扩展

该篇用于记录一些使用方法之外的知识点。关于具体使用方法请看       STM32F4上CCM内存的使用小结(https://blog.****.net/qq_27747359/article/details/109085292

 一、CCM内存的优点与缺点

The main system consists of 32-bit multilayer AHB bus matrix that interconnects:

  • Eight masters:
    – Cortex® -M4 with FPU core I-bus, D-bus and S-bus
    – DMA1 memory bus
    – DMA2 memory bus
    – DMA2 peripheral bus
    – Ethernet DMA bus
    – USB OTG HS DMA bus
  • Seven slaves:
    – Internal Flash memory ICode bus
    – Internal Flash memory DCode bus
    – Main internal SRAM1 (112 KB)
    – Auxiliary internal SRAM2 (16 KB)
    – AHB1 peripherals including AHB to APB bridges and APB peripherals
    – AHB2 peripherals
    – FSMC

  The bus matrix provides access from a master to a slave, enabling concurrent access and efficient operation even when several high-speed peripherals work simultaneously. The 64-Kbyte CCM (core coupled memory) data RAM is not part of the bus matrix and can be accessed only through the CPU. This architecture is shown in

关于STM32F4上CCM内存知识扩展


  其架构和之前的STM32F1x区别还是挺大的。由上可知,CCM共64KB,是直接挂在D-bus上的,除了CPU(即Cortex-M核)之外,谁都无法访问。此外,由于CCM不属于BusMatrix的一部分,所有也就不能被其他组件访问,例如DMA控制器。
  对于CCM,CPU能以最大的系统时钟和最小的等待时间从CCM中读取数据或者代码。官方文档说明了使用CCM的一些优势:比如将频繁读取的数据放到CCM,将中断函数放到CCM,这都能加快程序的执行速度。

关于STM32F4上CCM内存知识扩展

 

二、F3系列与F4系列CCM使用的差异 (挂载总线差异)

4系列也有个CCM的区域,测试完F3,我又测试下F4,比较悲剧的是只要把函数定义在CCM中程序就会Fault,只定义数组却没有问题,查看map文件,函数地址的确是被分配到了CCM,郁闷了几分钟,重新找到F429的RM,看下了总线矩阵图才发现原因。。。
下面是F429的总线:(不可定义函数,只能定义变量

关于STM32F4上CCM内存知识扩展


下面的是F303RE的总线:(函数、变量都可定义
 

关于STM32F4上CCM内存知识扩展

F3和F4的CCM RAM都只能被内核访问,DMA主设备没有连接到CCM RAM,所以不能访问它。从上图我们还能看到,对于F303的CCM RAM它连接到了数据总线和指令总线上,所以32F303的CCM RAM既可以放数据也可以执行代码。但32F427的CCM RAM只连接到了数据总线,所以F427的CCM RAM不能执行代码。这一点需要注意。