打印

请教一下,STM32F4中的CCM ram怎么使用?

[复制链接]
15929|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coolie2009|  楼主 | 2012-5-10 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我建了几个大的缓冲区,编译提示内存不足,我算了一下,应该是刚刚超过128k。
而F4里面有192k的ram,应该是有一个64k的CCM ram没有被用起来。

请问如何把数组定义到CCM ram里面呢?

或者如何把CCM ram当成普通ram用?

在ICF文件中,有如下的定义:
define symbol __ICFEDIT_region_RAM_start__    = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__      = 0x2001FFFF;
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;


看起来CCM RAM和普通RAM地址是不连续的。
沙发
ilovezeno| | 2012-5-11 09:08 | 只看该作者
请修改分散加载文件,建立一个对应于ccm的 section
然后把你的buff指定到这个 section,不同的编译器用的语句不太一样 ,看你用的编译器了。

另外,ccm不能用dma的,请注意 。

使用特权

评论回复
板凳
sjnh| | 2012-5-11 09:16 | 只看该作者
C文件:
// 前端设备运行状态,放在SRAM中
#pragma location = ".DeviceSram"
StatDev SDev;

ICF:

/* 外扩ISS25616,512K SRAM */
define symbol __region_SRAM_start__  = 0x64000000;
define symbol __region_SRAM_end__    = 0x6407FFFF;
define region SRAM_region  = mem:[from __region_SRAM_start__  to __region_SRAM_end__];
place in SRAM_region { section .DeviceSram,
                       section .AlarmSram,
                     };

使用特权

评论回复
地板
钱愈玉| | 2016-2-19 10:27 | 只看该作者
在工程中,找到分散加载文件 *.sct,将ccm内存添加进去,本来是:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08020000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08020000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
添加完后,这样:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08020000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08020000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI )
  }
  ER 0x10000000 0x0000ffff{
  .ANY (ccmram)
  }
}

然后,将文件加载到工程中,打开keil软件,option for target -> linker ->去掉 勾选 use memory layout for target dialog ->在scatter file 方框中选择你修改过的*.sct文件。
完成上面步骤,就相当你告诉keil软件你的设备有ccm内存了。然后在程序中将你要放在ccm的数组,或函数前面修改一下就好,如下:
1.首先你要声明一个宏:
#define CCMRAM __attribute__((section("ccmram")))
2.如果你程序中有一个数组叫:arrdata[100]:如下:
uint8_t arrdata[100];
需要修改为:
CCMRAM uint8_t arrdata[100];
这样你就将数组arrdata[100]放在ccm内存了。如果是将函数放在ccm内存也类似这样操作。

使用特权

评论回复
5
lvyunhua| | 2016-8-10 15:00 | 只看该作者
请问在MDK 中怎么使用CCMRAM??

使用特权

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

本版积分规则

7

主题

39

帖子

1

粉丝