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

[复制链接]
16915|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内存也类似这样操作。
lvyunhua 发表于 2016-8-10 15:00 | 显示全部楼层
请问在MDK 中怎么使用CCMRAM??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

39

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部