一、ILI9341內存到顯示地址的映射
本文只討論“正常顯示”,不討論“垂直滾動顯示”模式。
可以看到物理內存被兩個指針訪問,行指針和列指針,行指針范圍從000h到013Fh,列指針范圍為0000h到00EFh。也就是說,物理內存和LCD顯示屏的對應關系是一種豎屏(240*320)的對應的關系。至於如何讓GRAM數據顯示到LCD屏上,不需要我們去考慮,只要知道這種對應關系就可以了。
那么ILI9341有8種顯示方式:左上角->右下角(豎屏)、左下角->右上角(豎屏)、右上角->左下角(豎屏)、右下角->左上角(豎屏)、左上角->右下角(橫屏)、左下角->右上角(橫屏)、右上角->左下角(橫屏)、右下角->左上角(橫屏),又是怎么實現的呢?
二、MCU讀寫GRAM的方向
1、來自MCU讀寫數據流
2、ILI9341讀寫GRAM的控制
1) ILI9341讀寫GRAM的控制器的結構圖
2) 虛擬地址到物理地址的轉換關系
由此可見,正是通過虛擬地址到物理地址的轉換,使得寫入到GRAM中圖片的映射方向發生了改變。也就是說,通過改變寫入GRAM的位置,改變了LCD的顯示方向。
3、8中顯示方向描述
看圖說明:
- MV、MX、MY的控制位在命令0x36對應的寄存器中
- Image in the Memory(MPU)中描述的是在MCU的240(寬)*320(高)*16bit(假設565顯示方式)中顯示了一個圖像“F”。
- Image In the Driver(Frame Memory)描述的是經過虛擬地址到物理地址轉換器后,實際傳輸到GRAM中的數據顯示陣列。
- B、E分別描述了MCU傳輸的數據流的起始位置和終止位置。
注:(x,y)代表(列地址,行地址)
example 1: Y-Mirror
MCU向(0,0)寫入數據,經過虛擬地址到物理地址的轉換,實際寫入到GRAM的地址是(0,319),對應LCD的左下角。MCU向(239,319)寫入數據,經過虛擬地址到物理地址的轉換,實際寫入到GRAM的地址是(239,0),對應LCD的右上角。最終的效果就是LCD的顯示實現了Y方向上的翻轉。
example 1: X-Y Exchange
MCU向(0,0)寫入數據,經過虛擬地址到物理地址的轉換,實際寫入到GRAM的地址是(0,0),對應LCD的左上角。MCU向(239,319)寫入數據,經過虛擬地址到物理地址的轉換,實際寫入到GRAM的地址是(319,239),對應LCD的右下角。
經過這樣的變換,LCD變成了橫屏顯示。最終的效果就是LCD的顯示實現了行列的交換。
4、8種顯示方向探秘
不論哪種顯示方向,其實並沒有改變GRAM物理內存與LCD顯示屏的對應關系,也即是說GRAM物理內存與顯示屏之間的對應關系、內存到LCD的掃描方式,是固定不變的。
那么這種顯示方向是怎么說起的?
實際上,顯示方向說的是MCU的顯示緩存MPU(或者MCU讀寫GRAM的數據流)與LCD顯示屏的對應關系。由於GRAM物理內存與LCD顯示屏的對應關系是不會改變的,所以就是MPU與GRAM的對應關系,也即是虛擬地址與物理地址的轉換關系。
用戶在寫程序的過程中,LCD顯示操作是更改MPU的內容,至於MPU到GRAM的傳輸是驅動程序完成的。也就是說,用戶控制顯示的內容,接觸的是MPU,而更改顯示方向需要配置ILI9341的寄存器。
其實,ILI9341的掃描方向的功能也可以沒有,這個時候需要用戶自己軟件進行轉換,實際上就是那么轉換關系表。
三、測試
1、左上角->右下角(豎屏)
2、左下角->右上角(豎屏)
3、右上角->左下角(豎屏)
4、右下角->左上角(豎屏)
5、左上角->右下角(橫屏)
6、左下角->右上角(橫屏)
7、右上角->左下角(橫屏)
8、右下角->左上角(橫屏)
參考資料:《ILI9341芯片手冊》
附STM32測試代碼:GramScan_Test.zip