1.簡介
?FSMC模塊能夠與同步或異步存儲器和16位PC存儲器卡接口,它的主要作用是:
● 將AHB傳輸信號轉換到適當的外部設備協議
● 滿足訪問外部設備的時序要求
所有的外部存儲器共享控制器輸出的地址、數據和控制信號,每個外部設備可以通過一個唯一的片選信號加以區分。 FSMC在任一時刻只訪問一個外部設備。
FSMC具有下列主要功能:
● 具有靜態存儲器接口的器件包括:
? ─ 靜態隨機存儲器(SRAM)
? ─ 只讀存儲器(ROM)
? ─ NOR閃存
? ─ PSRAM(4個存儲器塊)
● 兩個NAND閃存塊,支持硬件ECC并可檢測多達8K字節數據
● 16位的PC卡兼容設備
● 支持對同步器件的成組(Burst)訪問模式,如NOR閃存和PSRAM
● 8或16位數據總線
FSMC管理1GB空間,擁有4個Bank連接外部存儲器,每個Bank有獨立的片選信號,每個Bank有獨立的時序配置,同步批量傳輸訪問最高頻率可達60MHz
支持的存儲器類型:
靜態地址映射存儲器:SRAM、PSRAM、NOR/ONENAND、ROM
LCD接口:支持8080和6800模式
NANDFlash和16位PCCard
2.外掛設備地址映射
NOR/PSRAM是”static memory map”設備: 256M字節的空間需要28根地址線尋址,HADDR表示內部AHB地址線;
HADDR[27:26]用來對4個region尋址;
HADDR[25:0]用來對外部地址FSMC[25:0];
無論8位/16位寬度,FSMC_A[0]始終連接外部設備地址A[0]
當外接設備16位數據寬度:HADDR[25:1]–>FSMC_A[24:0]
當外接設備8位數據寬度:HADDR[25:0]–>FSMC_A[25:0]
3.LCD硬件接口
LCD屏
?分辨率:320*480;3.5寸;
?驅動方式:8080并口時序(Intel公司),16位真彩色(RGB565);
?屏幕驅動IC:NT35310;
4.軟件設置
?1.芯片選擇
2. 時鐘配置
3.FSMC配置
?根據LCD硬件接口可知LCD接在FSMC_Blank1的region4上。
5 代碼生成
?1.FSMC配置代碼
FSMC寄存器配置可參考STM32中文參考手冊第19章靈活靜態存儲器控制器(FSMC)。
2.LCD顯示圖片和顯示漢字示例
(1) 讀寫數據
根據LCD硬件接口時序8080,要想實現對LCD屏數據顯示則需要完成LCD寫數據和寫寄存器,LCD接在FSMC_Blank1的region4上,通過地址線FSMC_A10作為數據命令選擇線,通過FSMC地址映射關系可知:
讀寫寄存器地址:0x6c000000
讀寫數據地址:0x6c000800
寫寄存器和寫數據代碼如下:
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
#define LCD_WR_REG *((volatile u16 *)0x6c000000)
#define LCD_WR_DAT *((volatile u16 *)0x6c000800)
/*LCD寫寄存器*/
static void LcdWriteReg(u16 reg)
{
LCD_WR_REG=reg;
}
/*LCD寫數據*/
static void LcdWriteData(u16 dat)
{
LCD_WR_DAT=dat;
}
(2)設置光標指令0X2A 和0X2B
該指令是頁地址設置指令,在從左到右,從上到下的掃描方式(默認)下面,該指令用于設置縱坐標( x 坐標)
在默認掃描方式時,該指令用于設置 x 坐標,該指令帶有 4 個參數,實際上是 2 個坐標值: SC 和 EC,即列地址的起始值和結束值, SC 必須小于等于 EC,且 0≤SC/EC≤239。一般在設置 x 坐標的時候,我們只需要帶 2個參數即可,也就是設置 SC 即可,因為如果 EC 沒有變化,我們只需要設置一次即可,從而提高速度。
0X2B 指令,該指令是頁地址設置指令,在從左到右,從上到下的掃描方式(默認)下面,該指令用于設置縱坐標( y 坐標)。
/*設置光標*/
static void LCD_SetCursor(u16 x,u16 y)
{
LcdWriteReg(0x2A);//設置x坐標
LcdWriteData(x>>8);
LcdWriteData(x&0xff);
LcdWriteReg(0x2B);//設置y坐標
LcdWriteData(y>>8);
LcdWriteData(y&0xff);
}
(3)寫入數據到GRAM指令0x2C
??該指令是寫 GRAM 指令,在發送該指令之后,我們便可以往 LCD 的 GRAM 里面寫入顏色數據了,該指令支持連續寫 (地址自動遞增)。
/*清屏函數*/
void LCD_Clear(u16 c)
{
u32 i=0;
LCD_SetCursor(0,0);//設置光標
LcdWriteReg(0x2c);//開始寫數據到GRAM
for(i=0;i<320*480;i++)
{
LcdWriteData(c);
}
}
(4)顯示圖片
??通過圖片取模工具Img2Lcd進行圖片取模:
?將生成的圖片數據放到工程中:
/*lcd圖片顯示*/
void LCD_DrawBMP(u16 x,u16 y,u16 w,u16 h,const u8 *buff)
{
u16 i,j;
u16 temp;
LcdWriteReg(0x2A);//設置x坐標
//設置x的起始坐標
LcdWriteData(x>>8);
LcdWriteData(x&0xff);
//設置x的結束坐標
LcdWriteData((x+w)>>8);
LcdWriteData((x+w)&0xff);
LcdWriteReg(0x2B);//設置y坐標
//設置y的起始坐標
LcdWriteData(y>>8);
LcdWriteData(y&0xff);
//設置y的結束坐標
LcdWriteData((y+h)>>8);
LcdWriteData((y+h)&0xff);
LcdWriteReg(0x2c);//開始寫數據到GRAM
for(i=0;i>8);
LcdWriteData(0);
//設置x的結束坐標
LcdWriteData(320>>8);
LcdWriteData(320&0xff);
LcdWriteReg(0x2B);//設置y坐標
//設置y的起始坐標
LcdWriteData(0>>8);
LcdWriteData(0);
//設置y的結束坐標
LcdWriteData(480>>8);
LcdWriteData(480&0xff);
}
;i++)>
(5)漢字顯示
??通過PCtoLCD2002進行漢字取模,取模方式:高位在前,逐行式。
/*
漢字取模方式:逐列式,高位在前,高度需保證為8個倍數
*/
void LCD_Display_Font(u16 x,u16 y,u8 size,u8 *font,u16 c)
{
u16 i,j;
u8 temp;
u16 x0=x;
for(i=0;i*size>
6 示例效果
-
lcd
+關注
關注
34文章
4424瀏覽量
167398 -
存儲器
+關注
關注
38文章
7484瀏覽量
163762 -
STM32
+關注
關注
2270文章
10895瀏覽量
355729 -
FSMC
+關注
關注
0文章
55瀏覽量
38134
發布評論請先 登錄
相關推薦
評論