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

【STM32F303开发】+ 使用片内的CCMRAM缩短代码执行时间 精华  

[复制链接]
creep 提问时间:2015-6-18 22:32 /
之前使用F4的时候就发现片内个CCMRAM区域可以用于内核直接读取,进而缩短减小等待时间。拿到F3后发现里面也有个CCMRAM,功能比F4的还强大,所以就准备测试下。
现在使用的F303RE内部有个16K的CCM直接和数据总线和指令总线相连,也就是说CPU能以最大的系统时钟和最小的等待时间从CCM中读取数据或者代码,这个CCM区域只能由CPU访问,DMA不能从CCM中读取数据。官方文档说明了使用CCM的一些优势:比如将频繁读取的数据放到CCM,将中断函数放到CCM,这都能加快程序的执行速度。
ccm.jpg
使用CCM的设置比较简单,首先编辑分散加载文件,将CCM区域加入到里面
ccm.jpg
下面手动编辑修改SCT文件,添加CCM部分到sct
ccm.jpg
下面将需要放到CCM内存的变量,数组,函数等的前面添加下面的关键字即可
  1. __attribute__((section("ccmram")))
复制代码
为了使用使用方便我们将上面的关键字定义为下面的宏
  1. #define CCMRAM  __attribute__((section("ccmram")))
复制代码
比如我将一个数组放到CCM中,将CCMRAM放在定义的数组即可,
  1. CCMRAM        const char buff[20] = "\r\nHi,i am creep!";
复制代码


将一个函数放到CCM

  1. CCMRAM void LED_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;

  4.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  5.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
  6.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  7.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  8.     GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  9.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  10. }
复制代码
重新编译后,你就可以从MAP文件中看到相应的数组和函数被放到0x1000000开始的CCM区域,或者debug也能看到相应的地址,我们将数组和函数的地址发送到串口,可看到的确是在0x10000000之后。
ccm.jpg
刚才说了,F4系列也有个CCM的区域,测试完F3,我又测试下F4,比较悲剧的是只要把函数定义在CCM中程序就会Fault,只定义数组却没有问题,查看map文件,函数地址的确是被分配到了CCM,郁闷了几分钟,重新找到F429的RM,看下了总线矩阵图才发现原因。。。
下面是F429的总线:
f4ccm.jpg
下面的是F303RE的总线:
f3ccm.jpg
F303RE测试代码:
F303RE_CCM.rar (398.16 KB, 下载次数: 378)

评分

参与人数 1 ST金币 +2 收起 理由
知足者常乐 + 2

查看全部评分

3 收藏 33 评论69 发布时间:2015-6-18 22:32

举报

69个回答
creep 回答时间:2016-1-5 21:15:19
t525 发表于 2016-1-5 18:53
楼主你好。今天在用F4的CCM 的时候看到了你的帖子,非常感谢一下子就成功。但是产生了一个疑问,你最后说的 ...

F3的片内CCMRAM分别与I-BUS和D-BUS总线相连,所以CCMRAM可用于存储数据和代码。
2.png
F4的片内CCMRAM只与D-BUS相连,所以只能用于存储数据,如果用于存储代码,就有可能导致Fault错误。
1.png
creep 回答时间:2015-6-19 09:58:19

有金币送点金币
没金币捧点人气
index219 回答时间:2015-7-1 10:56:05
creep 发表于 2015-7-1 10:28
首先你要确定你定义的数组size小于CCM的区域,不同的片子CCM的大小是不同的,根据这个大小来修改SCR里面 ...

第一:我是用的是F407,CCM大小64k。
第二:使用IAR编译环境,.icf文件下配置CCMRAM地址范围在0x10000000-0x1000ffff.
第三:在.map文件下查看到变量ucHeap【64*1024】 地址成功分配到0x10000000  0x10000

CCM的相关配置都是官方提供的F3参考文档,结果是程序实际跑起来,就会进入fault。
lkl0305 回答时间:2015-6-18 23:05:55
研究下下
风子 回答时间:2015-6-18 23:47:17
谢谢分享,这个值得研究下
mark0668 回答时间:2015-6-18 23:56:09
这个好东西,感谢分享!
Paderboy 回答时间:2015-6-19 00:03:06
好东西哦。。多谢分享
watershade 回答时间:2015-6-19 00:15:00
整个还真没注意到,学习了
jacobfeng 回答时间:2015-6-19 08:48:53
感谢分享,
ppprrr 回答时间:2015-6-19 08:56:04
颇受启发。谢谢楼主分享。马上用上去
苏浅叶 回答时间:2015-6-19 09:11:01
赞一个
为什么是EEFOCUS小白 回答时间:2015-6-19 10:23:34
谢谢分享
HenryChen 回答时间:2015-6-19 10:48:12
谢谢分享
JackieLaura 回答时间:2015-6-19 11:08:16
谢谢楼主分享。
小蚂蚁快溜跑 回答时间:2015-6-19 12:21:38
跟着学习了
wu1169668869 回答时间:2015-6-19 15:54:10
好东西~还有这种用法 4.gif
12345下一页

所属标签

相似问题

官网相关资源

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