天天看點

利用STM32的FSMC控制2.8寸TFTLCD問題。

一、LCD位址結構體

typedef struct

{

u16 LCD_REG;

u16 LCD_RAM;

} LCD_TypeDef;

//使用NOR/SRAM的 Bank1.sector4,位址位HADDR[27,26]=11 A6作為資料指令區分線 

//注意設定時STM32内部會右移一位對其! 111 1110=0X7E    

#define LCD_BASE        ((u32)(0x6C000000 | 0x0000007E))   

#define LCD             ((LCD_TypeDef *) LCD_BASE)

1、LCD為指針強制類型轉換,指向NE4(Bank1第四區)A6。

2、為什麼會右移一位?

 因為當Bank1 接的是16 位寬度存儲器的時候:HADDR[25:1]-->FSMC[24:0]。

        當 Bank1 接的是 8位寬度存儲器的時候: HADDR[25:0]-->FSMC[25:0]。

 而不論外部接8 位/16位寬裝置, FSMC_A[0]永遠接在外部裝置位址A[0]。這裡, TFTLCD使用的是16 位資料寬度,是以HADDR[0]并沒有用到,隻有HADDR[25:1]是有效的,對應關系變為:HADDR[25:1]--> FSMC[24:0],相當于右移了一位。另外,HADDR[27:26]的設定,是不需要我們幹預的,初始化的時候可以選擇區。

3、為什麼是7E?  7E轉換成二進制就是: 1111110,而16 位資料時,位址右移一位對齊,那麼實際對應到位址引腳的時候,就是:A6:A0=0111111,此時A6 是 0,但是如果 16 位位址再加1(注意:對應到 8位位址是加 2,即7E+0X02),那麼: A6:A0=1000000,此時 A6 就是 1了,即實作了對 RS 的 0 和1 的控制。 還有一個簡單的方法就是,當選A6時将第七位和最後一位置0,為01111110=0X7E 8 位位址是加 2為1000000,就可以實作A6對RS的控制了,例如我操作NE1、A10那麼位址就為(u32)(0x60000000 | 0x000007FE),其中7FE=011111111110。

利用STM32的FSMC控制2.8寸TFTLCD問題。

注:1、HADDR是需要轉換到外部存儲器的内部AHB位址線。

繼續閱讀