打印
[APM32F4]

APM32F4系列 CCM RAM使用示例

[复制链接]
54|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
所以还是要仔细读芯片手册,不然很容易掉坑里去。

使用特权

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

本版积分规则

37

主题

84

帖子

1

粉丝