MCU_STM32F4xx使用CCM RAM

介绍两点:

其一是CCM (core coupled memory)是在CPU核里的,速度更快,所以可以把最常用的,最频繁用的程序段放到这里面;

其二是,如何高效地使用scatter file配置使用CCM;

第一点:一般介绍

关于如何使用CCM RAM, ST官方文件中已经说得很清楚了,这里就不再重复了,

参考(点击下载):

AN4296 Use STM32F3/STM32G4 CCM SRAM with IAR? EWARM, Keil? MDK-ARM and GNU-based toolchains

这里要注意的是,CCM直接连接到了D-BUS上面,下面两张图,一张来自AN4296,一张来自stm32f4xx系列的DATASHEET。使用时要注意的是,CCM只和DBUS直接相连,没有和外设相连,所以不能用作DMA之类的操作。

MCU_STM32F4xx使用CCM RAM

MCU_STM32F4xx使用CCM RAM

?

第二点:MDK中利用SCATTER 文件配置使用CCM_RAM

因为我的工程比较大,所以先试试MDK。GNU或者IAR还没有时间。

官方的说明中,对于小规模的程序文件是没有问题的,但是,如果你的程序文件比较多,一个个函数地定义和设置,是不现实的。用整个文件夹或文件的形式,在属性中如下这样的设置是无效的(我也不知道为什么无效,没研究过KEIL MDK),

MCU_STM32F4xx使用CCM RAM

我采用的办法是直接修改SCATTER 文件,系统默认的SCATTER文件长这个样子,

MCU_STM32F4xx使用CCM RAM

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

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

在配置之前,你先编译一次,通过查看MAP文件中的memory分析,确定哪些文件是要进RAM的,省得自己去分析。

然后,以我自己的某次配置为例,为了把指定的文件配置到RW_IRAM2(对应STM32F4XX,这个地方就是CCM_RAM),我自己改成了下面的样子,这里不再使用".ANY",而是逐个指定要链接的文件,当然前提是你知道哪些文件是要进RAM的,不要把应该写到FLASH中的文件弄进来了(不清楚弄进来有什么后果,还没来得及测试,有兴趣的可以自己玩一下)。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {
   queue_buffer.o (+RW +ZI)
   fifo_buffer.o (+RW +ZI)
   main.o (+RW +ZI)
   controller.o (+RW +ZI)
   usbd_conf.o (+RW +ZI)
   tim.o (+RW +ZI)
   usb_device.o (+RW +ZI)
   usbd_desc.o (+RW +ZI)
   etharp.o (+RW +ZI)
   rand.o (+RW +ZI)
   lwip.o (+RW +ZI)
   can.o (+RW +ZI)
   stm32f4xx_hal_flash.o (+RW +ZI)
   dhcp.o (+RW +ZI)
   ip.o (+RW +ZI)
   tcp_in.o (+RW +ZI)
   ip4_addr.o (+RW +ZI)
  }
}

最后看一下你的MAP文件,当然生成MAP时要注意,选择那些你关心的选项就够了,不要全选,不然找半天找不到,例如我只关心MEMORY分配,就只选了MEMORYA,如下,

MCU_STM32F4xx使用CCM RAM

?

MCU_STM32F4xx使用CCM RAM

上一篇:LVS理论学习


下一篇:LeetCode085最大子矩形(相关话题:单调栈)