STM32F429 如何使用SDRAM

關於STM32F429 控制SDRAM( FMC—擴展外部SDRAM )

(1)原理介紹:https://www.cnblogs.com/firege/p/5805812.html

      》爲什麼是FMC 不是 FSMC ?區別在那裏!
      STM32F429使用FMC外設來管理擴展的存儲器,FMC是Flexible Memory Controller的縮寫,譯爲可變存儲控制器。
      它可以用於驅動包括SRAM、SDRAM、NOR FLASH以及NAND FLSAH類型的存儲器。
      
      在其它系列的STM32控制器中,只有FSMC控制器(Flexible Static Memory Controller),譯爲可變靜態存儲控制器,
      所以它們不能驅動SDRAM這樣的動態存儲器,因爲驅動SDRAM時需要定時刷新,STM32F429的FMC外設才支持該功能,
      且只支持普通的SDRAM,不支持DDR類型的SDRAM。我們只講述FMC的SDRAM控制功能。
      
      》FMC特點:
      FMC連接好外部的存儲器並初始化後,就可以直接通過訪問地址來讀寫數據,這種地址訪問與I2C EEPROM、SPI FLASH的不一樣,
      後兩種方式都需要控制I2C或SPI總線給存儲器發送地址,然後獲取數據;在程序裏,這個地址和數據都需要分開使用不同的變量存儲,
      並且訪問時還需要使用代碼控制發送讀寫命令。而使用FMC外接存儲器時,其存儲單元是映射到STM32的內部尋址空間的;
      在程序裏,定義一個指向這些地址的指針,然後就可以通過指針直接修改該存儲單元的內容,FMC外設會自動完成數據訪問過程,
      讀寫命令之類的操作不需要程序控制。

(2)關於SDRAM寄存器配置的講解:
http://forum.armfly.com/forum.php?mod=viewthread&tid=1942
(3)SDRAM的一些學習資料:
http://forum.armfly.com/forum.php?mod=viewthread&tid=1930
在這裏插入圖片描述
(4)SDRAM的內存操作

使用指針的方式訪問SDRAM存儲器,完成初始化SDRAM後,我們就可以利用它存儲數據了,由於SDRAM的存儲空間是被映射到內核的尋址區域的,我們可以通過映射的地址直接訪問SDRAM,訪問這些地址時,FMC外設自動讀寫SDRAM,程序上無需額外操作。

通過地址訪問內存,最直接的方式就是使用C語言的指針方式了:
/SDRAM起始地址存儲空間2的起始地址/
#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) /SDRAM大小,8M字節/
#define IS42S16400J_SIZE 0x800000
uint32_t temp;
( uint8_t) (SDRAM_BANK_ADDR ) = (uint8_t)0xAA; /向SDRAM寫入8位數據/
temp = ( uint8_t) (SDRAM_BANK_ADDR ); /從SDRAM讀取數據/
( uint16_t) (SDRAM_BANK_ADDR+10 ) = (uint16_t)0xBBBB;/寫/讀 16位數據/
temp = ( uint16_t) (SDRAM_BANK_ADDR+10 );
( uint32_t) (SDRAM_BANK_ADDR+20 ) = (uint32_t)0xCCCCCCCC;/寫/讀 32位數據/
temp = ( uint32_t) (SDRAM_BANK_ADDR+20 );

爲方便使用,代碼中首先定義了宏SDRAM_BANK_ADDR表示SDRAM的起始地址,該地址即FMC映射的存儲區域2的首地址;宏IS42S16400J_SIZE表示SDRAM的大小,所以從地址(SDRAM_BANK_ADDR)到(SDRAM_BANK_ADDR+IS42S16400J_SIZE)都表示在SDRAM的存儲空間,訪問這些地址,直接就能訪問SDRAM。
配合這些宏,使用指針的強制轉換以及取指針操作即可讀寫SDRAM的數據,使用上跟普通的變量無異。

直接指定變量存儲到SDRAM空間,每次存取數據都使用指針來訪問太麻煩了,爲了簡化操作,可以直接指定變量存儲到SDRAM空間.
#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000) /SDRAM起始地址存儲空間2的起始地址/
uint8_t testValue attribute((at(SDRAM_BANK_ADDR)));/絕對定位方式訪問SDRAM,這種方式必須定義成全局變量/
testValue = 0xDD;

這種方式使用關鍵字"attribute((at()))"來指定變量的地址,代碼中指定testValue存儲到SDRAM的起始地址,從而實現把變量存儲到SDRAM上。要注意使用這種方法定義變量時,必須在函數外把它定義成全局變量,纔可以存儲到指定地址上。

更常見的是利用這種方法定義一個很大的數組,整個數組都指定到SDRAM地址上,然後就像使用malloc函數一樣,用戶自定義一些內存管理函數,動態地使用SDRAM的內存,我們在使用emWin寫GUI應用的時候就是這樣做的。

在本書的《MDK編譯過程及文件類型全解》章節將會講解使用更簡單的方法從SDRAM中分配變量,以及使用C語言標準庫的malloc函數來分配SDRAM的空間,更有效地進行內存管理。

(5)如果要把SDRAM映射到FMC SDRAM的存儲區域1,需要如何修改STM32與SDRAM的硬件連接?程序上需要修改哪些內容?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章