[APM32F4] APM32F4系列 CCM RAM使用示例

[复制链接]
2270|11
 楼主| Alden 发表于 2024-12-2 17:25 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2024-12-2 17:25 编辑

#申请原创# #技术资源#
使用APM32F407的时候发现SRAM虽然是192KB,但查看用户手册就可以发现这192KB实际上是分了三个部分的。 6e5860342d63457c7689cf0bf2d99d9.png
本以为这三个SRAM是一样的使用,但看芯片和系统框图和其他资料后发现,使用上还是有需要注意的。
58f3fc1b955bc20e40297a25f63c982.png
在系统框图上就能看出来:
SRAM1和SRAM2是挂在AHB总线矩阵上的,可被所有 AHB 访问主模块。也就是说可以存数据也可以执行指令代码。
CCM RAM是挂在D-bus总线上的,只能用来存数据,不能运行程序,也不能用DMA访问。
那改怎么使用这部分空间呢。

不同开发环境下使用方法有点不同,这里测试Keil环境下的配置方式:
1、在Keil中工程配置有定义407的CCM RAM,两个都勾选上之后工程会自动分配RAM的地址。但是会优先使用SRAM1和SRAM2的区域。
2d648f898ce0ab90033f101582b8bdb.png
可以定义一个特别大数组就会看到有部分数据被定义在了CCM RAM中。
  1. char buff2[130000] = {1};
  2. int main(void)
  3. {

  4.     APM_EVAL_LEDInit(LED2);
  5.     APM_EVAL_LEDInit(LED3);

  6.     /** USART Initialization */
  7.     USART_Init();
  8.         /* 发送一个字符串 */
  9.         Usart_SendString( DEBUG_USART,"\r\n这是一个串口中断接收回显实验\r\n");
  10.         printf("\r\n这是一个串口中断接收回显实验\r\n");
  11.     while(1)
  12.     {
  13.                         Delay(0xFFFFFF);
  14.                                                 Usart_SendString( DEBUG_USART,buff2);
  15.     }
  16. }
9f4e4c490cda9e529a68653778e0602.png
可以看到有部分数据被定义在了0x1000000的地址区域。

2、如果不想让编译器自动分配,要自己将某个变量定义在CCM RAM中,可以这样定义。
手动修改SCT文件,添加CCM RAM的定义。
3c29c37395bfdd9ba222b01c7809c4d.png
31b69214b4d589b403561ab42984afd.png
然后如下定义变量:
  1. __attribute__((section("ccmram")))
  2. #define CCMRAM  __attribute__((section("ccmram")))
  3. CCMRAM         char buff[50] = "\r\nHi,i am CCM text!";

  4. int main(void)
  5. {

  6.     APM_EVAL_LEDInit(LED2);
  7.     APM_EVAL_LEDInit(LED3);

  8.     /** USART Initialization */
  9.     USART_Init();
  10.         /* 发送一个字符串 */
  11.         Usart_SendString( DEBUG_USART,"\r\n这是一个串口中断接收回显实验\r\n");
  12.         printf("\r\n这是一个串口中断接收回显实验\r\n");
  13.     while(1)
  14.     {
  15.                         Delay(0xFFFFFF);

  16.                         Usart_SendString( DEBUG_USART,buff);

  17.                         printf("\r\nbuff[20] address: 0X%x",(int)&buff);

  18.     }
  19. }
然后看MAP文件就会发现只有buff数组定义在了CCM RAM中。
32edd6e74ac9f1932fc69481fb93255.png
串口也能正常打印buff数组的内容和地址
796d9e172d98499a28b575ac3bfc710.png
APM32F4xx_EVAL_SDK_V1.0-CCMtext.zip (6.19 MB, 下载次数: 4)
guijial511 发表于 2024-12-2 18:52 来自手机 | 显示全部楼层
所以还是要仔细读芯片手册,不然很容易掉坑里去。
Dick Hou 发表于 2024-12-3 16:44 | 显示全部楼层
那问题来了,使用ccm,相对于使用sram1/2,好处在哪?
dirtwillfly 发表于 2024-12-4 08:54 | 显示全部楼层
Dick Hou 发表于 2024-12-3 16:44
那问题来了,使用ccm,相对于使用sram1/2,好处在哪?

从资料看,CCM的好处是不占用AHB总线矩阵资源,不知道处理数据的时候会不会速度更快?
Chad1989 发表于 2024-12-4 09:08 | 显示全部楼层
读取速度更快,一般把实时操作系统丢里面
Dick Hou 发表于 2024-12-4 09:08 | 显示全部楼层
dirtwillfly 发表于 2024-12-4 08:54
从资料看,CCM的好处是不占用AHB总线矩阵资源,不知道处理数据的时候会不会速度更快? ...

假设在没有DMA等bus master访问AHB总线时,AHB总线实际上只有CPU访问,此时访问CCM和访问SRAM没有啥区别。

即使在DMA等bus master访问AHB总线时,只要不访问SRAM,CPU访问SRAM也是不受影响的,因为bus matrix是多主多从的交叉开关,只要不访问同一个从接口,不会冲突。

只有在多个AHB主机(DMA、CPU等)同时访问同一个总线从机,例如同一片SRAM,才会有总线仲裁,从而影响效率。
Dick Hou 发表于 2024-12-4 09:09 | 显示全部楼层
Chad1989 发表于 2024-12-4 09:08
读取速度更快,一般把实时操作系统丢里面

你确定清楚了CCM的访问机制?

CCM只能丢data进去,不能运行程序,你把实际操作系统丢进去,是想用意念让它运行吗?
Chad1989 发表于 2024-12-4 09:22 | 显示全部楼层
Dick Hou 发表于 2024-12-4 09:09
你确定清楚了CCM的访问机制?

CCM只能丢data进去,不能运行程序,你把实际操作系统丢进去,是想用意念让 ...

RAM只能丢数据进去?差点给我整迷糊,我是不懂,你讲解下
Dick Hou 发表于 2024-12-4 09:31 | 显示全部楼层
Chad1989 发表于 2024-12-4 09:22
RAM只能丢数据进去?差点给我整迷糊,我是不懂,你讲解下

仔细看一楼,谢谢
Dick Hou 发表于 2024-12-4 09:34 | 显示全部楼层
Chad1989 发表于 2024-12-4 09:22
RAM只能丢数据进去?差点给我整迷糊,我是不懂,你讲解下

如下所示: 2024-12-04_9-33-27.png
Chad1989 发表于 2024-12-4 09:37 | 显示全部楼层
Dick Hou 发表于 2024-12-4 09:31
仔细看一楼,谢谢

https://shequ.stmicroelectronics.cn/thread-632878-1-1.html
没仔细看楼主写的,只能说理解上有问题
Dick Hou 发表于 2024-12-4 10:21 | 显示全部楼层
Chad1989 发表于 2024-12-4 09:37
https://shequ.stmicroelectronics.cn/thread-632878-1-1.html
没仔细看楼主写的,只能说理解上有问题 ...

我只能说,你两个都没有仔细看,而不只是“没仔细看楼主写的”

APM就是1:1兼容ST的,结构上没有区别。

你引用的文章里已经清晰明白的指出,是把FreeRTOS的数据(堆)放进了CCM,而不是把FreeRTOS的整个程序放进了CCM!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

115

帖子

2

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