SPI驱动0.96寸OLED单色屏刷新率测试以及代码优化改进,方法适用于SPI驱动其他设备
目前嵌入式当中OLED常用驱屏方式有两种:SPI或IIC。以速度来讲,SPI速度相较于IIC会快上一些,硬件IIC相较于模拟IIC速度又会快上一些。此外还有模拟SPI的,但该种用法我遇到较少,本文就硬件SPI驱动OLED屏幕做一个简单的刷新率测试。
测试硬件平台:
CH32V307VCT6+杜邦线连接0.96寸SPI接口OLED屏
CH32V307VCT6介绍如下:
最高144MHz系统主频,64KB SRAM,256KB Flash,其中FLASH、RAM大小可配,SPI最高时钟频率支持到Fpclk的一半,即72MHz。
0.96寸OLED屏介绍如下:
采用OLED技术,支持SPI和IIC驱动显示数据,像素是128*64,单色屏。
测试方法:
每次刷新10张图片,计算刷新100次的时间。其中刷新100次采用for循环的方式,计数采用定时器计数中断的方式,每1ms进一次中断,记录进入中断的次数。100次,每次10张,即1000张,1000张除以用时,即可获得每秒刷新的图片张数,可简单认为为FPS值。
注:关于图片的刷新,每次都是先清屏,然后加载图片数据,最后再刷新,具体程序如下:
测试结果以及程序优化过程:
直接使用SPI:
(1)采用硬件SPI+库操作的方式:FPS值为228;
(2)若将程序中SPI读写操作直接改为寄存器操作,如下程序,刷新率可进一步提升,FPS值为256。若全部改为寄存器操作,应该还会有进一步提升。
进一步将引脚拉高拉低改为寄存器操作,FPS提高为280;
(3)若将代码进一步优化,省去不必要的步骤,比如在更新显存到OLED的函数中,因为都是写数据,可以不调用OLED_WR_Byte函数,直接配置,如下图:
可进一步将FPS提高到321.
(4)若按照下图再进一步优化,则可将刷新率再一次提高
可进一步将刷新率提高到343;
(5)若按照下图方法再优化一下,刷新率还能再次提高:
刷新率被提高到了397,将近400,这提升还是比较明显的。其中,读完数据寄存器之后再读状态寄存器是为了清除溢出标志位。
使用SPI+DMA:
采用硬件SPI+DMA的方式,测的FPS的值为379,测试代码如下,DMA的使用主要是在更新显存函数中使用。
这结果让我很是诧异,使用DMA传输速度竟然比不上不使用DMA优化后的速度。考虑到会受for循环中数据复制搬运的影响,又做了一下处理,先复制两个字节到DMA缓冲区,然后启动DMA,然后复制剩下的 ,代码如下
修改过后,刷新率FPS达到了394.
以上就是我整个的一个测试结果和我对代码优化的一个流程,可能看结果使用DMA和不使用DMA刷新率差不读,但其实可能受限于个人代码水平的影响,DMA应该还有提升的空间。此外,DMA的好处远不止于此,他不需要依赖CPU做大量处理,在复杂应用中优势的体现会更加明显。