使用st的hal庫進行開發,sdram使用的是w9825g6kh-6。
w9825g6kh-6共有4個bank,13位行位址,9位列位址,位寬是16位,
所以晶元的容量是:4x8192x512x16=256mbits=32mbytes。
w9825g6kh-6的原理圖如下:
fmc_d0~15:16位資料線;
fmc_sdnwe:低電平時寫,高電平時讀;
fmc_sdne0:片選訊號,低電平有效;
fmc_ba0~1:bank選擇訊號;
fmc_sdcke0:時鐘使能訊號;
fmc_sdclk:時鐘訊號;
fmc_nbl0~1:寫訪問的輸出位元組遮蔽。
stm32f429自帶fmc外設,可以對多種外部儲存器進行控制,儲存區域對應如下:
我們使用的是bank5,也就是sdram bank1。
我們要做的就是對sdram進行初始化配置,初始化成功後即可對指定的記憶體進行訪問,微控制器和外部sdram之間的讀寫時序
是由外設自動產生的,不需要程式進行控制,非常方便。
使用stm32cubemx生成fmc的初始化**,如下:
void mx_fmc_init(void)
}
上述fmc的初始化**完成了sdram初始化中的1、2兩個步驟;
接下來新增sdram初始化中的步驟3~8:
uint8_t sdram_sendcommand(uint32_t commandmode, uint32_t bank, uint32_t refreshnum, uint32_t regval)
void sdram_init(void)
函式sdram_sendcommand()用來傳送命令,內部呼叫了hal的庫函式hal_sdram_sendcommand()傳送配置命令;
函式sdram_init()完成了sdram初始化中的步驟3~8。
至此,我們就完成了對sdram的初始化操作,此時外部sdram已經被對映到了相應的記憶體位址;需要注意的是,
sdram bank1的位址是從0xc0000000~0xcfffffff,sdram bank2的位址是從0xd0000000~0xdfffffff,
我們使用的是sdram bank1,並且外部sdram的大小是32m位元組,所以對應的記憶體位址範圍是0xc0000000~0xc1ffffff。
接下來就測試一下sdram的讀寫:
#define sdram_bank1_base_address 0xc0000000 //sdram bank1起始位址
#define sdram_half_word_size 0x1000000 //定義16m個的16bits資料,共32m位元組
__no_init uint16_t uhsdramarray[sdram_half_word_size] @sdram_bank1_base_address; //強制定義陣列在sdram的記憶體中
void sdram_test(void)
for(i = 0; i < sdram_half_word_size; i += 4096)
}
串列埠列印結果如下,資料太多,沒有全部顯示,
sdram測試結束。
STM32F429除錯記錄(一)
stm32f429的晶元有兩路can介面 四路串列埠 內部乙太網以及內部dsp處理器等硬體,硬體的豐富程度可見一斑,而且主頻達到180mhz,雖然比a8 a9架構的arm晶元還是差一大截,但是在工業控制上的應用還是比較多的。在程式編寫方面stm32f4系列不管在mdk還是庫函式都有挺大改動,剛著手除...
STM32F429 如何使用SDRAM
關於stm32f429 控制sdram fmc 擴充套件外部sdram 1 原理介紹 為什麼是fmc 不是 fsmc 區別在那裡!stm32f429使用fmc外設來管理擴充套件的儲存器,fmc是flexible memory controller的縮寫,譯為可變儲存控制器。它可以用於驅動包括sram...
STM32F429 如何使用NAND Flash
1 原理介紹 flash即是儲存晶元的一種,其結合了rom和ram的特點,既具備電可擦除程式設計的效能,又可以快速讀取資料,資料不會因斷電丟失。目前市面上flash主要有nor flash和nand flash。nor flash具有隨機訪問和隨位元組執行寫操作的能力,即可以訪問到儲存器內部的任意乙...