STM32之FSMC驅動LCD難點理解
根據外設存儲器的位寬分為8Bit和16Bit驅動
STM32內部存儲單位為一個字節,也就是一個地址存儲一個字節大小的數據,當外部存儲器的位寬為8位時,寫入一個數據需要一個字節即地址加1,當外部存儲器的位寬為16位時,寫入一個數據需要兩個字節即地址加2,如下圖所示:
外設存儲器位寬8位:寫入0x11 和 0x22
| 地址 | 內存 |
|---|---|
| 0x6000 0000 | 0x11 |
| 0x6000 0001 | 0x22 |
| 外設存儲器位寬16位:寫入0x1122 和 0x3344 | |
| 地址 | 內存 |
| -- | -- |
| 0x6000 0000 | 0x11 |
| 0x6000 0001 | 0x22 |
| 0x6000 0002 | 0x33 |
| 0x6000 0003 | 0x44 |
| 寫16位數據地址變化 | HADDR[25:0] |
|---|---|
| 0x00 | 0000 0000 |
| 0x02 | 0000 0010 |
| 0x04 | 0000 0100 |
| 0x06 | 0000 0110 |
由于內存地址映射都是偶地址開始,當外設存儲器的位寬為16位時,每次寫數據時地址加2,相當于所有的地址為2的倍數,即寫16位數據時地址位右移1位。FSMC將使用內部的HADDR[25:1]地址來作為對外部存儲器的尋址地址FSMC_A[24:0]。

當FSMC模擬80并口時序驅動LCD外設時,以A6為例,作為LCD_RS信號控制線,A6輸出0寫命令,A6輸出1寫數據。當外設是8位位寬時,FSMC以HADDR[25:0] (映射FSMC_A[25:0])對外尋址,只要HADDR[25:0]的Bit6為0寫命令,為1寫數據。當外設是16位位寬時,FSMC以HADDR[25:1](映射FSMC_A[24:0])對外尋址,相當于整個地址右移一位,原來的Bit6輸出實則是FSMC_A5輸出,要讓A6輸出需要設置Bit7輸出。如下所示:
外設為8位:Bit6->0100 0000->0x40
寫命令->A6輸出0 地址0x6000 0000用HADDR[25:0]表示,FSMC_A6為0
寫數據->A6輸出1 地址(0x6000 0000|0x40)用HADDR[25:0]表示,FSMC_A6為1
外設為16位:Bit6->0100 0000->0x40 Bit7->1000 0000->0x80
寫命令->A6輸出0 地址0x6000 0000用HADDR[25:1]表示即右移1位寫入FSMC_A[24:0],FSMC_A6仍為0
寫數據->A6輸出1 地址(0x6000 0000|0x40)用HADDR[25:1]表示即右移1位寫入FSMC_A[24:0],FSMC_A6變為0, FSMC_A5變為1,要使FSMC_A6輸出1,地址需或上Bit7即地址(0x6000 0000|0x80)
LCD存儲地址表示
LCD存儲地址表示方式有兩種,宏定義表示和結構體表示,結構體表示跟結構體成員所占空間大小有關。
FSMC_A6為LCD_RS信號控制線,控制命令和數據的讀寫,2^6=0x40,2^7=0x80,

浙公網安備 33010602011771號