STM32 之五 Core Coupled Memory(CCM)内存
寫在前面
- 今天在搞STM32F4時,用到了一部分特殊內存——CCM。搜了搜網上沒多少介紹,索性自己查手冊。
- 某些芯片沒有CCM
基本架構
??廢話少說,先看看這塊內存特殊在哪里。官方的基本架構說明如下:
??The main system consists of 32-bit multilayer AHB bus matrix that interconnects:
- Eight masters:
– Cortex? -M4 with FPU core I-bus, D-bus and S-bus
– DMA1 memory bus
– DMA2 memory bus
– DMA2 peripheral bus
– Ethernet DMA bus
– USB OTG HS DMA bus - Seven slaves:
– Internal Flash memory ICode bus
– Internal Flash memory DCode bus
– Main internal SRAM1 (112 KB)
– Auxiliary internal SRAM2 (16 KB)
– AHB1 peripherals including AHB to APB bridges and APB peripherals
– AHB2 peripherals
– FSMC
??The bus matrix provides access from a master to a slave, enabling concurrent access and efficient operation even when several high-speed peripherals work simultaneously. The 64-Kbyte CCM (core coupled memory) data RAM is not part of the bus matrix and can be accessed only through the CPU. This architecture is shown in
??其架構和之前的STM32F1x區別還是挺大的。由上可知,CCM共64KB,是直接掛在D-bus上的,除了CPU(即Cortex-M核)之外,誰都無法訪問。此外,由于CCM不屬于BusMatrix的一部分,所有也就不能被其他組件訪問,例如DMA控制器。
??對于CCM,CPU能以最大的系統時鐘和最小的等待時間從CCM中讀取數據或者代碼。官方文檔說明了使用CCM的一些優勢:比如將頻繁讀取的數據放到CCM,將中斷函數放到CCM,這都能加快程序的執行速度。
如何使用
使用方式一
??知道了這塊特殊內存,那么我們怎么來使用他呢?常用Keil的人應該知道,在其配置中,有如下選項:
??在默認情況下,其中的IRAM2我們不選中,現在我們就可以選中該部分。這樣,Keil在生產代碼時,就會自動將變量分配到該部分RAM中了。具體的可以打開,Keil生成的.map文件看看。
注意:
??但是,這樣就有一個問題:由于其只能被內核訪問,一旦Keil將例如DMA用的內存放到了該部分RAM中,那么DMA將不能工作! 那么怎么使用更合適呢?
使用方式二
??如前所說,直接讓編譯器自動分配貌似不太合適,所以我們可以自己指定分配的內存。這其中也有兩種方式。
??第一種依靠分散加載文件(.sct),更強大,直接定義一個文件(例如,名字為 RAM2.c),將所有要放得變量均放到該文件中,然后如下修改分散加載文件。
??還有一種方式就是直接使用編譯器指令:__attribute__+at。在定義變量時,如下即可:
UINT32 EventNum __attribute__((at(0x10000000))) = 0;??當然,這種方式也可以稍微變化一下,使用__attribute__+section。給變量指定一個節區名字,然后在分散加載文件中指定節區位置。
??如上處理編譯后,可查看map文件對應部分內存中變量的分配了。
關于系統
??我這搞這部分的時候,正好用了FreeRTOS。于是就像既然這部分只能給內核訪問,為了內存的合理利用,能不能直接將這部分內存給系統,剩下的給不就是想怎么用就怎么用了么?而且分給FreeRTOS 64KB的內存正好符合我的設計需要!
??了解了上面的分散加載文件后,要將FreeRTOS放到RMA2中就非常簡單了,根據使用的FreeRTOS的文件,只需要如下的分散加載文件即可。
??這樣就又有一個問題,如果使用動態申請的內存,則內存還是在RAM2中,如果傳遞給DMA時,則會出錯!
注意:
??1. FreeRTOS中部分文件只有代碼,沒有數據(RW和ZI),例如:list.c,這樣就不能放到上面的分散加載文件中
注意事項
- 需要了解ARM的分散加載文件。
- 需要了解個別的編譯器指令
參考文檔
- STM32F407 Reference manual
總結
以上是生活随笔為你收集整理的STM32 之五 Core Coupled Memory(CCM)内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeRTOS 低功耗之 tickle
- 下一篇: LwIP 之一 源码目录文件详解及移植说