打印
[APM32F4]

APM32F4系列 CCM RAM使用示例

[复制链接]
1341|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2024-12-2 17:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Alden 于 2024-12-2 17:25 编辑

#申请原创# #技术资源#
使用APM32F407的时候发现SRAM虽然是192KB,但查看用户手册就可以发现这192KB实际上是分了三个部分的。
本以为这三个SRAM是一样的使用,但看芯片和系统框图和其他资料后发现,使用上还是有需要注意的。

在系统框图上就能看出来:
SRAM1和SRAM2是挂在AHB总线矩阵上的,可被所有 AHB 访问主模块。也就是说可以存数据也可以执行指令代码。
CCM RAM是挂在D-bus总线上的,只能用来存数据,不能运行程序,也不能用DMA访问。
那改怎么使用这部分空间呢。

不同开发环境下使用方法有点不同,这里测试Keil环境下的配置方式:
1、在Keil中工程配置有定义407的CCM RAM,两个都勾选上之后工程会自动分配RAM的地址。但是会优先使用SRAM1和SRAM2的区域。

可以定义一个特别大数组就会看到有部分数据被定义在了CCM RAM中。
char buff2[130000] = {1};
int main(void)
{

    APM_EVAL_LEDInit(LED2);
    APM_EVAL_LEDInit(LED3);

    /** USART Initialization */
    USART_Init();
        /* 发送一个字符串 */
        Usart_SendString( DEBUG_USART,"\r\n这是一个串口中断接收回显实验\r\n");
        printf("\r\n这是一个串口中断接收回显实验\r\n");
    while(1)
    {
                        Delay(0xFFFFFF);
                                                Usart_SendString( DEBUG_USART,buff2);
    }
}

可以看到有部分数据被定义在了0x1000000的地址区域。

2、如果不想让编译器自动分配,要自己将某个变量定义在CCM RAM中,可以这样定义。
手动修改SCT文件,添加CCM RAM的定义。


然后如下定义变量:
__attribute__((section("ccmram")))
#define CCMRAM  __attribute__((section("ccmram")))
CCMRAM         char buff[50] = "\r\nHi,i am CCM text!";

int main(void)
{

    APM_EVAL_LEDInit(LED2);
    APM_EVAL_LEDInit(LED3);

    /** USART Initialization */
    USART_Init();
        /* 发送一个字符串 */
        Usart_SendString( DEBUG_USART,"\r\n这是一个串口中断接收回显实验\r\n");
        printf("\r\n这是一个串口中断接收回显实验\r\n");
    while(1)
    {
                        Delay(0xFFFFFF);

                        Usart_SendString( DEBUG_USART,buff);

                        printf("\r\nbuff[20] address: 0X%x",(int)&buff);

    }
}
然后看MAP文件就会发现只有buff数组定义在了CCM RAM中。

串口也能正常打印buff数组的内容和地址

APM32F4xx_EVAL_SDK_V1.0-CCMtext.zip (6.19 MB)

使用特权

评论回复
沙发
guijial511| | 2024-12-2 18:52 | 只看该作者
所以还是要仔细读芯片手册,不然很容易掉坑里去。

使用特权

评论回复
板凳
Dick Hou| | 2024-12-3 16:44 | 只看该作者
那问题来了,使用ccm,相对于使用sram1/2,好处在哪?

使用特权

评论回复
地板
dirtwillfly| | 2024-12-4 08:54 | 只看该作者
Dick Hou 发表于 2024-12-3 16:44
那问题来了,使用ccm,相对于使用sram1/2,好处在哪?

从资料看,CCM的好处是不占用AHB总线矩阵资源,不知道处理数据的时候会不会速度更快?

使用特权

评论回复
5
Chad1989| | 2024-12-4 09:08 | 只看该作者
读取速度更快,一般把实时操作系统丢里面

使用特权

评论回复
6
Dick Hou| | 2024-12-4 09:08 | 只看该作者
dirtwillfly 发表于 2024-12-4 08:54
从资料看,CCM的好处是不占用AHB总线矩阵资源,不知道处理数据的时候会不会速度更快? ...

假设在没有DMA等bus master访问AHB总线时,AHB总线实际上只有CPU访问,此时访问CCM和访问SRAM没有啥区别。

即使在DMA等bus master访问AHB总线时,只要不访问SRAM,CPU访问SRAM也是不受影响的,因为bus matrix是多主多从的交叉开关,只要不访问同一个从接口,不会冲突。

只有在多个AHB主机(DMA、CPU等)同时访问同一个总线从机,例如同一片SRAM,才会有总线仲裁,从而影响效率。

使用特权

评论回复
7
Dick Hou| | 2024-12-4 09:09 | 只看该作者
Chad1989 发表于 2024-12-4 09:08
读取速度更快,一般把实时操作系统丢里面

你确定清楚了CCM的访问机制?

CCM只能丢data进去,不能运行程序,你把实际操作系统丢进去,是想用意念让它运行吗?

使用特权

评论回复
8
Chad1989| | 2024-12-4 09:22 | 只看该作者
Dick Hou 发表于 2024-12-4 09:09
你确定清楚了CCM的访问机制?

CCM只能丢data进去,不能运行程序,你把实际操作系统丢进去,是想用意念让 ...

RAM只能丢数据进去?差点给我整迷糊,我是不懂,你讲解下

使用特权

评论回复
9
Dick Hou| | 2024-12-4 09:31 | 只看该作者
Chad1989 发表于 2024-12-4 09:22
RAM只能丢数据进去?差点给我整迷糊,我是不懂,你讲解下

仔细看一楼,谢谢

使用特权

评论回复
10
Dick Hou| | 2024-12-4 09:34 | 只看该作者
Chad1989 发表于 2024-12-4 09:22
RAM只能丢数据进去?差点给我整迷糊,我是不懂,你讲解下

如下所示:

使用特权

评论回复
11
Chad1989| | 2024-12-4 09:37 | 只看该作者
Dick Hou 发表于 2024-12-4 09:31
仔细看一楼,谢谢

https://shequ.stmicroelectronics.cn/thread-632878-1-1.html
没仔细看楼主写的,只能说理解上有问题

使用特权

评论回复
12
Dick Hou| | 2024-12-4 10:21 | 只看该作者
Chad1989 发表于 2024-12-4 09:37
https://shequ.stmicroelectronics.cn/thread-632878-1-1.html
没仔细看楼主写的,只能说理解上有问题 ...

我只能说,你两个都没有仔细看,而不只是“没仔细看楼主写的”

APM就是1:1兼容ST的,结构上没有区别。

你引用的文章里已经清晰明白的指出,是把FreeRTOS的数据(堆)放进了CCM,而不是把FreeRTOS的整个程序放进了CCM!

使用特权

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

本版积分规则

43

主题

91

帖子

1

粉丝