stm32 ccmram的使用(stm32f407)

stm32 ccmram的使用(stm32f407)

stm32內存分析

  1. stm32 ram使用,例如192k的stm32f407zg,實際看總線分佈圖,分成了3部分
    在這裏插入圖片描述
  2. 112k sdram1 + 16k sdram2 + 64k ccm = 192k, 平時使用中,keil的默認設置只會用到128k,不會用到ccm,要用的話,設置工程的IRAM2即可,開了ccm會優先使用這個內存進行分配。
    在這裏插入圖片描述
    在這裏插入圖片描述
  3. 所以在設置heap和stack大小的時候要考慮RW的size不要超過128k,否則程序肯定hardfault。怎麼看RW的size,用到keil工具的map,Program Size: Code=218950 RO-data=33350 RW-data=3480 ZI-data=125152, RW-DATA + ZI-DATA就是最後會加載到ram中的總大小。RW是已經初始化好的變量,ZI是未初始化的變量數據包括heap和stack也在其中。
    在這裏插入圖片描述
    在這裏插入圖片描述

如何使用ccmram

  1. 新建一個sct文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08020000 0x000D0000  {    ; load region size_region
  ER_IROM1 0x08020000 0x000D0000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {
   .ANY (ccmram)
  }
}
  1. 配置工程,加載剛纔sct在這裏插入圖片描述

  2. 宏定義指定區域

#define CCMRAM __attribute__((section("ccmram")))
  1. 聲明變量
/** This is the actual memory used by the pools (all pools in one big block). */
CCMRAM static u8_t memp_memory[MEM_ALIGNMENT - 1 
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "lwip/memp_std.h"
];

編譯後的map文件中

  • map中的內存分配已經可以看到了,分配到了ccmram這個區域。
  • 相應的64K ram已經使用了,剩下原來佔用的128k也會相應的釋放到相同的size。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章