本帖最后由 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)
|