之前使用F4的时候就发现片内个CCMRAM区域可以用于内核直接读取,进而缩短减小等待时间。拿到F3后发现里面也有个CCMRAM,功能比F4的还强大,所以就准备测试下。 现在使用的F303RE内部有个16K的CCM直接和数据总线和指令总线相连,也就是说CPU能以最大的系统时钟和最小的等待时间从CCM中读取数据或者代码,这个CCM区域只能由CPU访问,DMA不能从CCM中读取数据。官方文档说明了使用CCM的一些优势:比如将频繁读取的数据放到CCM,将中断函数放到CCM,这都能加快程序的执行速度。 使用CCM的设置比较简单,首先编辑分散加载文件,将CCM区域加入到里面 下面手动编辑修改SCT文件,添加CCM部分到sct 下面将需要放到CCM内存的变量,数组,函数等的前面添加下面的关键字即可
将一个函数放到CCM
刚才说了,F4系列也有个CCM的区域,测试完F3,我又测试下F4,比较悲剧的是只要把函数定义在CCM中程序就会Fault,只定义数组却没有问题,查看map文件,函数地址的确是被分配到了CCM,郁闷了几分钟,重新找到F429的RM,看下了总线矩阵图才发现原因。。。 下面是F429的总线: 下面的是F303RE的总线: F303RE测试代码: |
【STM32F303开发】开发学习笔记、教程集合贴
【合集】STM32F303开发教程
【STM32F303开发】(五)TIM定时器PWM的输出与捕获
【STM32F303开发】+ 内部Flash模拟EEPROM
【STM32F303开发】+如何解析GPS数据
【STM32F303开发】+使用fromelf反汇编keil生成的AXF文件
使用STM32F303VBT6的SPI驱动TM1629A
【STM32F303开发】+ 使用SWO输出调试信息到Debug Viewer窗口
【STM32F303开发】基础:工程模板+LED+USART+常用文档+按键中断
【STM32F303开发】(二)DAC+定时器+DMA实例
F3的片内CCMRAM分别与I-BUS和D-BUS总线相连,所以CCMRAM可用于存储数据和代码。
F4的片内CCMRAM只与D-BUS相连,所以只能用于存储数据,如果用于存储代码,就有可能导致Fault错误。
有金币送点金币
没金币捧点人气
第一:我是用的是F407,CCM大小64k。
第二:使用IAR编译环境,.icf文件下配置CCMRAM地址范围在0x10000000-0x1000ffff.
第三:在.map文件下查看到变量ucHeap【64*1024】 地址成功分配到0x10000000 0x10000
CCM的相关配置都是官方提供的F3参考文档,结果是程序实际跑起来,就会进入fault。