常聽到有人說刷屏太慢,于是想測一下我的屏最快能刷多少幀。目的不是為了看視頻,而是減少MCU在刷屏方面占用的時間。提高其使用效率。 本實驗使用的MCU是STC32G12K128,屏采用了晶聯訊的JLX256128-920-PN。屏的時序是6800. 測試時采用了一幅256x128的單色圖(黑白圖)。因為這款屏只能顯示單色圖像。 先在群里咨詢了一下各位大師。用什么辦法方便測試屏的刷新速度。有高人指出。找一個閑置IO口,每次刷新完就讓IO口翻轉一次。然后運行時用示波器測IO口的頻率,其二倍就是刷新速度了。 按這個思路,寫了一個程序,第一次測出刷新是40X2=80幀。 不太滿意,又修改了程序。使用了STC32G12K128的硬件LCM接口和DMA功能。再測刷新速度成為265x2=530幀。 做最后的努力。對程序進行極限優化,測出的刷新速度為323x2=646幀。 這時mcu的設置到了極限,就是說找不到可以繼續提高的速度的設置了。估計使用STC32F,刷新速度還會有大的提高。 對這個數據我簡單分析了一下。一屏圖像的數據量為256x128=32768點。單色屏需要4096字節。也就是4K。646幀數據需要每秒傳送2646016字節。不到3M,一個字節需要的時間包括相關使能電平變化,數據的移動,指令的下達,應該是這個時間的4-6倍。按5倍核算的話,這時端口的運行速度在15M。無論對MCU還是屏都是可以接受的。 下面給出程序的主要內容和測試時示波器的顯示: void main(void) { uint i; mcu_initial(); initial_lcd(); //對液晶模塊進行初始化設置 transfer_command_lcd(0x08); //數據格式, clear_screen(); //清屏 for (i=0;i<4096;i++) buffer1[ i]=onecolor[ i];//把code的數據搬到xdata lcm_dma_transfer(1,1,256,128,4096,buffer1);//這是個完整的顯示函數 clear_screen(); //清屏 lcd_address(1,1,256,128); while(1) { DMA_LCM_CR = 0xa1; //啟動 DMA 開始發送數據 P1=~P1; while(!(DMA_LCM_STA&0x01));//等待一屏數據發送完成 DMA_LCM_STA = 0x00; //清除 DMA 狀態 } } void mcu_initial(void) { P1M1=0x00; P1M0=0x00; //P1配置為準雙向 P2M1=0x00; P2M0=0x00; //P2配置為準雙向 P3M1=0x00; P3M0=0x00; //P3配置為準雙向 P4M0=0xff; P4M1=0x00; EAXFR = 1; //使能訪問 XFR CKCON = 0x00; //設置外部數據總線速度為最快 WTST = 0x00; //設置程序代碼等待參數, LCMIFCFG = 0x01; //設置 LCM 接口為 8 位數據位,6800 接口,數據口為 P2 LCMIFCFG2 = 0x00; //RS:P45,RD:P44,WR:P42; Setup Time=0,HOLD Time=0。 LCMIFSTA = 0x00;//標志位清零 LCMIFCR = 0x80; //使能 LCM 接口 } 速度提升最大的是LCM接口的使用和DMA功能的使用。極限優化主要表現在兩點,一個是LCMIFCFG2=0。把數據建立時間和保持時間都設成最小了。 二是主程序循環中把設置項都提前了。避免重復設置。循環中只保留了向屏發送數據指令,IO口翻轉指令和等待任務完成指令。MCU主頻為35M。完整的程序見附件。 |