在研究原子的程式時,有下面3段
1.
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
2.
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG=regval;
}
void LCD_WR_DATA(u16 data)
{
LCD->LCD_RAM=data;
}
3.
LCD_WR_REG(0xED);
LCD_WR_DATA(0x64);
其中涉及到了結構體(結構體是一種資料類型)、指針、尋址、FSMC、TFT屏,該段程式實際是定義TFT屏(該屏是8080的16位并口模式)的RS标志線為位址0x000007FE:
1.FSMC可以控制外部 SRAM,SRAM有位址線(如 A0~A18)、資料線(如 D0~D15)、寫信号(WE)、讀信号(OE)、片選信号(CS),如果 SRAM 支援位元組控制,那麼還有 UB/LB 信号;TFTLCD有資料線(如 D0~D15)、WR、RD、CS、RST(複位,可以硬體實作) 、RS、BL(背光控制),實際用D0~D15、WR、RD、 CS、RS即可控制TFT。向FSMC尋址的位址寫資料,則FSMC的資料線就輸出該資料,這樣則FSMC可以控制TFT了,由于FSMC有位址線,TFT沒有位址線,但是有RS信号線,RS是資料/指令信号線,RS=0時表示TFT接收的是指令,RS=1時表示TFT接收的是資料,那麼FSMC隻要位址線的任何一根線連接配接了RS都可以控制TFT了:語句#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))中0x6C000000是fsmc4個管理塊中的Bank1的分區4的起始位址,對應位址信号全為0,由于使用了A10連接配接TFT的RS線,為了友善尋址連續,則A10為低電平時的最大尋址位址是0x000007FF,而現在為什麼是0x000007FE,是因為FSMC是由HADDR控制的,HADDR是内部AHB位址總線,當Bank1接的是16位寬度存儲器的時候:HADDR[25:1]對應FSMC-A[24:0],相當于HADDR[25:1]右移一位,HADDR[25:0]的26根線,才能尋址64M位址,是以A10接在RS上相當于HADDR[11]接在RS上,即A10為高電平時的最大尋址位址是0x00000FFF,現在((LCD_TypeDef *) LCD_BASE)将轉換成結構體位址指針,指向結構體第一個成員,即首位址是((u32)(0x6C000000 | 0x000007FE))即0x6C0007FE即此時HADDR[11:0]為011111111110即0x7FE,H[11]低電平即A10低電平,為使尋址連續,是以H[11]高電平即A10高電平時可以對應HADDR[11:0]為100000000000,即0x800,這樣FSMC尋址0x6C0007FE時,則RS為低電平,向0x6C0007FE 寫入資料,則FSMC的資料線向TFT傳送該資料,則TFT認為該資料為指令;FSMC尋址0x6C000800時,則RS為高電平,向0x6C000800 寫入資料,則FSMC的資料線向TFT傳送該資料,則TFT認為該資料為資料;另外0x6C0007FE與0x6C000800差了兩個位元組,是因為FSMC使用了16位模式,資料總線是16位,則位址必須占用兩個位元組才能向位址寫資料。實際FMSC控制TFT并沒有真正尋TFT的位址空間, FSMC隻是通過自身的位址線控制RS,向該位址寫資料就是向資料線傳輸資料,TFT通過RS的高低電平認定接收來的資料是資料還是指令。位址不一定是0x6c0007FE和6c000800,隻要是控制A10高低電平的位址都可以,也不一定要連續位址,可以分别定義0x6c0007FE和0x6c000800;使用了FSMC功能後,其它的位址線最好不再作為别的功能的IO使用,但是在不影響RS的電平的情況下靈活運用其他位址線還是有可能,比如我使A2輸出高電平,則可以使位址尋址0x6c000808,而必須保證此時的A10不會變化。。。