我最终让我的OLED刷新速度跟老师的一样快

我最终让我的OLED刷新速度跟老师的一样快

  事情发生在今年的暑假,我的学校举办了两个短学期用来提高我们的专业实践水平,其中一个是做嵌入式开发。内容是结合OLED,ESP8266和MPU6050做一个多级菜单的物联网嵌入式系统设计,使用STM32F103C8T6做主控。老师提供了自己手把手教学的HAL库教学视频,但是!肯定是自己做更有意思对不对。并且个人对于HAL库不是很推崇(嵌入式的性能资源本就不富裕,这时还要因HAL库的低效再吃掉一部分是追求极致的我万万不能接受的),所以决定使用STD库自己进行开发。
  问题就出在这。
  初期我进行多级菜单和显示设计时,遇到了一个问题。同寝室的一位舍友采用老师的方案进行开发,他的OLED屏刷新速度很快,指的是按一下立即切换看不到刷新过程。而我当时做的,使用之前寒假自己做的,现如今被我移植到32上的SSD1306库进行开发的显示界面,切换时能看到一丝屏幕刷新的过程,像是60HZ屏对比144HZ屏的那种不流畅。
  当时我百思不得其解,去寻找我系统切换时一切可能占用多余的CPU资源的程序进行优化和删减,经过一番努力之后,优化删减了不少,可是卡顿却还在。然后我又冒险性地(当时如此觉得)去把我SSD1306驱动库里所有的IIC通信函数内的延时(delay_us(1);)都删除了,速度确实快了一些,但是卡顿仍还是有。这让我苦恼不已。想破头都找不出问题的我,最后去找老师探究问题的原因。老师给了我一份他的OLED驱动库,让我去研究源码。
  我一开始是没有头绪的,也没有找到问题所在,直到昨天,我看到了老师驱动库里的IIC通信部分,我发现了问题。
  老师的IIC通信程序里也是没有延时函数的,我才明白,SSD1306竟本就能接受这么高的IIC SCLK频率(当时觉得挺高的),后来经过了解又觉得不对,IIC通信最高速度为单向5Mb/S,而GPIO的速度我(以及老师)直接定义的50MHZ!于是我又经过了一番查询,发现通过固件库进行操作的IO口翻转,实际只能达到2MHZ的翻转速度。。。固件库函数里的参数检查会占用掉不少的时间。即使采用寄存器直接进行操作,免掉固件库即使取消掉参数检查的之后还剩的函数调用的80ns时间,再经过各种优化,也最多输出18MHZ。
  但这显然不是主要原因,虽然确实让速度变快了,但是上面提到了还是没有解决问题。但这个发现对我还是极为有价值的。
  真正解决问题的还是这里:
在这里插入图片描述
  我发现老师在写完“写数据”指令之后,竟然直接开始循环发送!从这里开始,我意识到了不对劲,立马翻出了SSD1306的数据手册IIC页面
在这里插入图片描述
  原来如此!SSD1306在一次控制帧在这里插入图片描述之后,可以一直发送数据帧在这里插入图片描述。这样来说,对比我之前傻傻的三帧结构:“开始信号+IIC地址帧+控制帧+数据帧+结束信号” 的循环来说,在一定长的长度下,效率提高到3倍左右!通过采用控制帧+后续数据的方式,免除了重复的开始信号(大概1-2位长度),重复的结束信号(大概1-2位长度),以及重复的两帧(地址+控制,每帧约9位),通信协议的效率成倍提高。
  而我当初受资料的隐性误导误以为IIC通信写数据都是三帧结构的。。。(所以各位写资料的时候都要尽可能详细呀!)

在这里插入图片描述
  然后看到IIC.C里之后发现老师直接不等待应答了。。。直接拉高SCL然后拉低SCL快速结束ACK位,仔细想想也是,在这里的情况下并不需要进行仔细的数据核对,传过去的数据基本都是对的。又能节省一部分时间,虽然并不多(至少对比第二个发现来说)。

  今天重构完自己的SSD1306驱动库,烧录进去发现达到了老师例程一样的效果,非常开心

附代码:

重构完的51版SSD1360 OLED驱动库



  DaveoCKII
2020.7.21

  • 57
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值