STM32
直播中

王霞

7年用户 1316经验值
私信 关注
[问答]

分享一个基于STM32F407的中景园0.96寸OLED的程序升级方法

受到警告
提示: 作者被禁止或删除 内容自动屏蔽

回帖(1)

杨明

2021-10-14 15:33:36
前天学习了韦东山老师的嵌入式linux教学的一期视频中关于LCD的刷新显示章节,对于显示的机制有了一些略微的理解,回想起来之前一直在用的OLED不禁想要去看看有没有人做过相应的程序, 结果没有找到! 于是自己做了一个底层的代码。
  还是老规矩 先来展示效果图
  
  

  

  
  

  

  图片展示的是OLED 的显示数字和字符串,OLED屏幕的刷新频率达到了惊人的40Hz,而且几乎不占用 CPU时间(数据全部走DMA) 我的程序是基于其他大佬的硬件IIC和DMA程序改编的,程序的整体框架如下
  
  

  

  在编写用户程序之前 我需要先实现 单片机内存到 OLED内存的这个工作,这一部分我选择使用的是STM32F407的硬件IIC 集合DMA来实现的,虽然网上对STM32F407的硬件IIC诟病比较大,但是我测试的时候还是勉强可以接受,代码是借鉴的网上大佬的,我拿到手就可以实现DMA对IIC设备的读写操作了。 在解决这一部分问题时 我借鉴了 大佬的经验  博客地址如下
  https://blog.csdn.net/qq_24896591/article/details/86287443    (介绍STM32F4 硬件IIC +DMA的)
  在解决了硬件IIC向 OLED 内存写数据的问题后,我发现OLED的数据只能刷新一行(最上面的 128*8的区域),效果暂且不展示,于是去查询各种资料  我查询到了一个重要的信息 : SSD1306 控制器的刷新模式是行刷新!
  https://blog.csdn.net/W1107101310/article/details/79829063
  
  

  

  仔细看了一下确实是这样!  ,然后我再初始化函数里面添加了 修改地址模式
  
  

  

  通过修改指令,我实现了对Gram的整体刷新!(插播一句  OLED内部的叫 GDDRAM)
  
  

  

  刷新过程如下:
  
  

  

  我向Gram里面一次性的写入1024个 byte 刚好对应于整个GDRAM,可以一次刷新一整屏。而这个过程消耗的时间几乎可以忽略(甚至我可以配置一个DMA 的循环模式,自动刷新!!!)
  接下来就是处理现实函数部分了,首先要处理的就是ASCII码的显示,也就是我们的showchar 函数,这一部分的实现我参考了中景园的参考例程(字库也是直接copy的),相比较于官方的代码 我自己的代码实现起来更加的容易
  
  

  

  

  

  我的代码里面还加入了反白的选项,可以让字符反白显示(这里的反白是基于软件反白的,不是使用指令操作 OLED寄存器实现的!)实现了 字符显示函数,剩下的 显示字符串和 数字的函数就简单了!,字符串显示的函数,几乎是完全照搬的官方代码,但是数字显示部分的函数加进去了我的一些个人的解决方案,数字显示部分代码如下
  
  

  

  我个人感觉代码用起来还行,前面补的几个0影响不是很大。。。。(借口,只是懒得解决而已)
  之后的画点画圆的代码是从 正点原子的代码里面抄的,,,,  我记得原子哥将视频的时候好像说自己也是抄的。。。
  算法这种东西就交给大佬们去解决了,咱也看不懂, 咱也想不明白,  确实可以运行。   不过在这之前我们还是需要完善一个底层的画点的函数,这个函数实现起来还是很简单的
  
  

  

  这就是我的画点的函数,只有一行代码, 一次可以添加一个点。。。。  只要在我们的内存buffer中的指定值的指定位置1,剩下的DMA 这个苦力会去给我们完成!
  有了画点函数的支持,我们的画圆,画线,画正方形 等等函数都不是梦! 然后就有了我先前展示的第二章图片
  接下来是反白显示的介绍,反白显示也是很简单就实现了的,,,
  
  

  

  主要的代码就是一句话 , 给我们的字库数据按位取反。。
  至此,程序的实现就大致完成了。
  代码的链接 在我整理完会上传,目前还是处于编写阶段,还有待优化。
   
   
   
   
   
   
举报

更多回帖

发帖
×
20
完善资料,
赚取积分