参考文档:
STM32F4上CCM内存的使用小结_ccm sram_城南花已开..的博客-CSDN博客
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=602255&extra=page=&page=1
基于Keil MDK
1.修改配置文件指定相关参数使用该内存
使用CCM一般都要手动分配资源(确保这块内存不被外设使用),自行分配内存需要这样操作:
①参考下图,不勾选USE Memory Layout from Targe Dialog,这时mdk会自动载入一个分散加载文件(.sct),修改这个文件就可以手动选择要放到CCM中的数据了。
②点击 Edit 修改 .sct 文件 增加 ccmram 部分的定义
RW_IRAM2 0x10000000 0x00008000 { ; RW data
.ANY (ccmram)
}
完整的 .sct 文件内容参考
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00014000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00008000 { ; RW data
.ANY (ccmram)
}
}
③定义一个宏
#define CCMRAM __attribute__((section("ccmram")))
④定义分配到 CCMRAM 的变量或函数,如下
//一个变量放到CCM
CCMRAM int count = 0;
//数组放到CCM中,将CCMRAM放在定义的数组即可
CCMRAM const char buff[20] = "Hello World\r\n";
//将一个函数放到CCM
CCMRAM void HRTIM1_TIMA_IRQHandler(void)
{
}
重新编译后,就可以从MAP文件中看到相应的数组和函数被放到0x1000000开始的CCM区域,或者debug也能看到相应的地址。