打印
[APM32F4]

APM32F407如何使用CCM内存?

[复制链接]
1005|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JunKook 于 2022-11-30 09:36 编辑

相较于APM32F1xx,我们APM32F4xx系列MCU的内部有个特殊的SRAM,它叫做CCM内存,在我司《APM32F4xxx用户手册》的第2.3章节有相关介绍,如下图所示,这个内存是挂在D-bus上直接和内核连接,大小为64K,只有内核可以访问这个内存,DMA等外设不能对其访问。
那么这块CCM内存用户如何才能把它用起来呢?下面我就通过基于KEIL5的开发平台,给大家介绍一下如何使用CCM。
使用CCM一般有两种方式,第一种是通过配置MDK,实现自动分配。这种方式我们只需点击MDK的魔法棒,来到配置界面,并在Target菜单栏下,将IRAM2勾上,即使用这一块内存,这也就是CCM内存。

设置完后,重新编译工程,打开.map文件,就可以查看到会有这块SRAM的资源分配,如下图所示。由于IRAM1优先使用,而且一般SRAM1和SRAM2够用,如果定义的变量太少,系统就不会占用CCM内存。

这种自动分配的方式有什么问题呢?由于CCM除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。不过,我们也可以通过专用语句来分配这段内存,专用语句如下:
__attribute__((at(address)))
那么在程序中比如我们要定义一个数组,并将这个数组分配到CCM内存中,我们可以这么去做:
uint8_t buff[10] __attribute__((at(0x10000000))) = {0};
再次编译工程后,打开在.map文件,就可以查看到刚刚定义的一段数据的确放在了CCM内存中,如下图所示。

那么使用__attribute__((at(address)))语句的操作来分配内存到CCM中需要我们每次都要计算变量分配内存的地址,确保地址不冲突,这显然是比价麻烦的。那有没有更简单的方法呢?当然是有的,我们通过配置分散加载文件的方式,就可以实现用户自定义分配内存到CCM中,具体操作如下所述。
首先,点击MDK的魔法棒,如下图所示,在Linker菜单栏下面,不勾选USE Memory Layout from Targe Dialog,这时MDK会自动载入一个分散加载文件(.sct),点Edit进入编辑这个文件,就可以手动选择要放到CCM中的数据了。

打开.sct文件后,原本编译器生成的只有RW_IRAM1,这是SRAM1和SRAM2的内存分配定义,这时我们就需要将CCM内存添加进去,假设定义为RW_IRAM2,如下图所示,如果想把程序中的某些变量放到CCM中,需要定义一个SECTION,将这些变量放到这个SECTION中,再由.sct文件分配到CCM中。

在程序中,为了使用方便我们将上面的关键字定义为下面的宏:
#define CCMRAM __attribute__((section("ccmram")))
比如我们将一个数组放到CCM中,将CCMRAM放在定义的数组即可,如下所示:
CCMRAM  uint8_t buff[65535] = {0};
同样我们也可以将一个函数放到CCM中,如下所示:
CCMRAM void APM_MINI_LEDInit(Led_TypeDef Led)
{
    GPIO_Config_T  configStruct;

    /** Enable the GPIO_LED Clock */
    RCM_EnableAHB1PeriphClock(GPIO_CLK[Led]);

    /** Configure the GPIO_LED pin */
    GPIO_ConfigStructInit(&configStruct);
    configStruct.pin = GPIO_PIN[Led];
    configStruct.mode = GPIO_MODE_OUT;
    configStruct.speed = GPIO_SPEED_50MHz;

    GPIO_Config(GPIO_PORT[Led], &configStruct);
    GPIO_PORT[Led]->BSCL = GPIO_PIN[Led];
}
除此之外,如果我们要将某个.c文件下的所有变量都放入CCM中(这些变量都是不能被外设访问的相关变量),我们只需要将对应的.o文件填入定义的RW_IRAM2,即可将该.c文件下的变量定义到CCM中。例如,我们将usart.c文件下定义的所有变量都放入CCM中。

我们再编译代码,打开在.map文件,就可以查看到usart.c文件下的变量都放在CCM中了。

以上就是关于APM32F407如何使用CCM内存的介绍,如有疑问,欢迎大家留言讨论,谢谢!

使用特权

评论回复
沙发
chenjun89| | 2022-12-3 18:45 | 只看该作者
有什么特殊作用?

使用特权

评论回复
板凳
weifeng90| | 2022-12-8 08:26 | 只看该作者
CCM内存和常规RAM有什么区别?

使用特权

评论回复
地板
aple0807| | 2022-12-10 08:57 | 只看该作者
weifeng90 发表于 2022-12-8 08:26
CCM内存和常规RAM有什么区别?

第一,CCM和内核同频,速度块。coremark测试综合速度是通用RAM的3倍以上。
第二、CCM只能CPU访问,外设不可访问。

使用特权

评论回复
5
Undshing| | 2023-1-3 15:35 | 只看该作者
CCM速度快

使用特权

评论回复
6
mattlincoln| | 2023-2-4 17:10 | 只看该作者
不能用于DMA传输,这部分内存占用的时数据总线

使用特权

评论回复
7
hearstnorman323| | 2023-2-4 18:42 | 只看该作者
F4新加的一个特殊内部SRAM。  

使用特权

评论回复
8
houjiakai| | 2023-2-4 19:11 | 只看该作者
内存灵活配置的   。               

使用特权

评论回复
9
sdCAD| | 2023-2-4 23:02 | 只看该作者
STM32F4当中有个CCM内存,APM32F407也有吗?

使用特权

评论回复
10
pl202| | 2023-2-6 12:38 | 只看该作者
CCM内存和SRAM内存使用起来有什么区别吗?

使用特权

评论回复
11
mollylawrence| | 2023-2-6 13:58 | 只看该作者
CCM内存是什么意思呢?              

使用特权

评论回复
12
bestwell| | 2023-2-7 20:26 | 只看该作者
CCM区不能使用DMA吧               

使用特权

评论回复
13
mollylawrence| | 2023-2-8 15:38 | 只看该作者
CCM内存只能由CPU访问的               

使用特权

评论回复
14
belindagraham| | 2023-2-8 16:38 | 只看该作者
F4 系列提供了 CCM 内存,零等待时间,提供不与 CPU Core 冲突的指令和数据操作

使用特权

评论回复
15
chenci2013| | 2023-2-8 19:57 | 只看该作者
打开mdk项目options,target选项卡,右下角可以配置使用的内存空间

使用特权

评论回复
16
liu11372650| | 2023-2-9 20:40 | 只看该作者
ccm内存,只能由cpu的d-bus总线访问,那i-code总线是不是不能访问,这样的话,ccm就不能在里面放函数了

使用特权

评论回复
17
nnqtdf| | 2023-3-5 08:51 | 只看该作者
使用FreeRTOS的时候,可以把这段内存配置为操作系统堆栈使用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

15

主题

55

帖子

1

粉丝