前幾天在那個寶上買的STM32F4小板子到了,板子上帶一塊3.2寸320*240的電阻屏。然后就想著把正點原子的LCD驅動和uc/GUI移植到這個小板子上,然后將之前不甚明白的FSMC驅動TFT-LCD的知識全面學習一下。
圖為我的小板,本人什么都喜歡mini的
之所以不用GPIO口直接驅動液晶,是因為這種方法速度太慢,而FSMC是用來外接各種存儲芯片的,所以其數據通信速度是比普通GPIO口要快得多的。TFT-LCD 驅動芯片的讀寫時序和SRAM的差不多,所以就可以用FSMC四塊中的SRAM塊來驅動LCD。SRAM有數據線和地址線,所以FSMC跟它匹配同樣也有數據線和地址線,而LCD數據線跟地址線共用,通信時用RS端來區分線上是數據還是指令,RS高是數據,RS低是指令。
其實這中間一開始最不理解就是與LCD的RS引腳相關的東西,那時候也不知道咋回事一直以為FSMC的地址線和數據線是共用的,導致我一直沒明白怎么回事,昨天一看正點原子的探索者原理圖才發現FSMC有數據線還有地址線,是分開的。驅動液晶的時候,數據線接液晶的并口,RS接到了FSMC的某個地址引腳。具體為什么這樣接,也是我想著重記錄的。
首先,FSMC是什么,FSMC我自己的理解就是,一個銜接CPU與外部存儲的橋梁,它的功能呢就是你往相應的地址里寫數據時候,你不需用軟件來模擬外部存儲芯片的讀寫時序,而只需配置好FSMC相關的時序寄存器,配置好相關寄存器之后,你只管往相應存儲塊中的地址里寫數據就可以了。最直觀的解釋就看上邊正點原子的一小段代碼,代碼中定義了一個結構體,然后強制性的把結構體的起始地址設在了0x6C000000 | 0x0000007E處。那么這個0x6C000000 | 0x0000007E地址是啥意思呢,其中0x6C000000是FSMC存儲塊1的區4起始地址,0x6C00007E為存儲塊1區4內的某個地址,你給LCD_REG賦值,就是往外部存儲設備中的0x6C00007E地址處寫數據,給LCD_RAM賦值,就是往0x6C00007F地址處寫數據。這里是結構體,當然也可以是一個巨大的數組或其他數據類型。當然了,FSMC只是一個數據銜接部件,真正的存儲芯片是需要通過引腳連接在FSMC的地址和數據引腳上的。存儲芯片在指定地址寫入數據的時候需要地址線來指定要寫數據往哪個地址。也就是說上例中,往0x6C00007E中寫數據的時候,地址線的低8位(0x7E)就是0111 1110。這就是FSMC的工作機制。
說完FSMC,下面說如何用FSMC的某跟地址線控制LCD的RS端。以RS連接到A6為例,TFT-LCD的數據是16位的,即讀寫一次數據為兩個字節按字節編址的話就是所有的地址都是偶地址,LCD的顯示RAM編址確實是按兩個字節編址的(即stm32中AHB總線上的地址,總是FSMC地址線上地址的2倍,即左移一位)。具體怎么個意思,就如下圖(朕的御用畫圖軟件Altium Designer16繪制)所示了:
這樣的話FSMC地址線上的0000 0001就代表AHB(FSMC是接到AHB總線上的)總線上的0000 0010,FSMC地址線上的0000 0010就代表AHB總線上的0000 0100,也就是說你在程序中寫的這個地址右移一位才是FSMC地址線引腳上所表現出來的地址狀態。造成這種現象的原因就是因為在配置FSMC傳輸數據位寬時設置成了16位。向LCD傳輸數據一次都是兩個字節。所以對應上例,往地址0x6C00007E寫數據,地址線的低8位并不是0111 1110,而是0011 1111。然后假如RS端連接在地址線A6端,那么也就是讓A6端的高低來決定數據線上傳輸的是數據還是命令。上邊說了,當往0x6C00007E地址(LCD_REG)寫的時候,FSMC地址線低8位是0011 1111,A6(紅色標出)為低電平,這時數據線上的是命令,所以寫命令函數就是直接往LCD_REG寫就行了,實際上就是為了讓RS接低電平,當往0x6C000080(低8位1000 0000)地址(LCD_RAM)中寫數據時,FSMC地址線低8位是01000000,A6(紅色標出)為高電平,這時數據線上是數據,所以寫數據就直接往LCD_RAM中寫,實際是為了讓RS接高電平。
當然了,這里RS接的是A6,其他場合,RS可能接的是其他地址線,只需要根據上邊的規律技巧來改變“0x6C000000 | 0x0000007E”中后者就可以了。這里這個RS的接法和用法很巧妙,摘自正點原子。
|