常听到有人说刷屏太慢,于是想测一下我的屏最快能刷多少帧。目的不是为了看视频,而是减少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。完整的程序见附件。 |