利用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 位地址是加 2爲1000000,就可以實現A6對RS的控制了,例如我操作NE1、A10那麼地址就爲(u32)(0x60000000 | 0x000007FE),其中7FE=011111111110。

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

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