LV16-25-OLED-01-OLED基础知识
本文主要是STM32开发——OLED屏幕显示基础知识的一些相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
- 通用
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.st.com/content/st_com/zh.html | ST官方网站,在这里我们可以找到STM32的相关文档 | |
https://www.stmcu.com.cn/ | 意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档 | |
http://elm-chan.org/fsw/ff/00index_e.html | FatFs文件系统官网 | |
教程书籍 | 《ARM Cortex-M3权威指南》 | ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩 |
《ARM Cortex-M0权威指南》 | ||
《ARM Cortex-M3与Cortex-M4权威指南》 | ||
开发论坛 | http://47.111.11.73/forum.php | 开源电子网,正点原子的资料下载及问题讨论论坛 |
https://www.firebbs.cn/forum.php | 国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT | |
https://www.amobbs.com/index.php | 阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。 | |
http://download.100ask.net/index.html | 韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。 | |
博客参考 | http://www.openedv.com/ | 开源网-原子哥个人博客 |
http://blog.chinaaet.com/jihceng0622 | 博主是原Freescale现NXP的现场应用工程师 | |
cortex-m-resources | 这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接) |
- STM32
STM32 | STM32 HAL库开发实战指南——基于F103系列开发板 | 野火STM32开发教程在线文档 |
STM32库开发实战指南——基于野火霸道开发板 | 野火STM32开发教程在线文档 |
- SD卡
SD Association | 提供了SD存储卡和SDIO卡系统规范 |
点击查看相关文件下载
STM32F103xx英文数据手册 | STM32F103xC/D/E系列的英文数据手册 |
STM32F103xx中文数据手册 | STM32F103xC/D/E系列的中文数据手册 |
STM32F10xxx英文参考手册(RM0008) | STM32F10xxx系列的英文参考手册 |
STM32F10xxx中文参考手册(RM0008) | STM32F10xxx系列的中文参考手册 |
Arm Cortex-M3 处理器技术参考手册-英文版 | Cortex-M3技术参考手册-英文版 |
STM32F10xxx Cortex-M3编程手册-英文版(PM0056) | STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版 |
SD卡相关资料——最新版本 | 有关SD卡的一些资料可以从这里下载 |
SD卡相关资料——历史版本 | 有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议 |
SD 2.0 协议标准完整版 | 这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看 |
本节笔记放在这里,主要是为了学习8080时序,为后边FSMC产生8080时序做铺垫,这一部分的笔记是用GPIO模拟8080时序,这样对8080时序的认识会更深刻一些。这一节会涉及一些像素啊,显存啊什么的基本概念,笔记写在LCD屏幕学的相关笔记中了。平时我用的还是I2C或者SPI接口的OLED。
一、OLED简介
1. 简介
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。
LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。
2. 0.96寸OLED特点
我学习的是正点原子出的OLED模块ATK-MD0096(但是只是为了学习8080接口,平时我用的还是I2C或者SPI接口的OLED),它有以下特点:
(1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。单色模块每个像素点只有亮与不亮两种情况,没有颜色区分。
(2)尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小。
(3)高分辨率,该模块的分辨率为128*64。
(4)多种接口方式,该模块提供了总共4种接口包括:6800、8080两种并行接口方式、 4线的穿行SPI接口方式,、I2C接口方式(只需要2根线就可以控制OLED了)。
(5)不需要高压,直接接3.3V就可以工作了。
【注意】该模块不和5.0V接口兼容,所以请大家在使用的时候一定要小心,不要直接接到5V的系统上去,否则可能烧坏模块。
3. SSD1036
我使用的OLED芯片是使用SSD1036这款芯片来驱动的,它是香港Solomon Systech公司(晶门科技)的一款显示屏驱动芯片,它的相关介绍我们可以在这里看到:SSD1306 - Solomon Systech (International) Limited (solomon-systech.com),从这个网站是可以下载芯片手册的,但是好像要填一堆信息,可以看本地的:[SSD1306](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)
SSD1306是一款单芯片CMOS OLED/PLED驱动器和控制器,用于有机/聚合物发光二极管点阵图形显示系统。它由128个段和64个公共端组成(没看懂,反正他可以驱动128*64的OLED屏)。该集成电路是为普通阴极型OLED面板设计的。
SSD1306嵌入了对比度控制、显示RAM和振荡器,减少了外部元件的数量和功耗。它有256级亮度控制。数据/命令通过硬件可选的6800/8000系列兼容并行接口,I2C接口或串行外设接口从通用MCU发送。它适用于许多小型便携式应用,如手机子显示器、MP3播放器、计算器等。
4. 相关资料查阅
这两个资料都是本地文档,只有在本地的时候点击连接才会打开文档。
OLED屏幕的原理图:M00750_VGM128064C0W01_Y01.pdf
SSD1036芯片手册:[SSD1306_datasheet](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)
二、SSD1306
接下来我们来看一下SSD1306这款控制器,芯片手册可以看[SSD1306_datasheet](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)
1. 功能框图
功能框图我们可以看[SSD1306_datasheet](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)的4 BLOCK DIAGRAM 一节:
关于引脚的详细定义,我们可以查看[SSD1306_datasheet](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)的7 PIN DESCRIPTION 一节,引脚比较多,这里就不说了。
2. BS[2:0]
引脚中的BS0、BS1和BS2这里要关注一下,它们三个是芯片与MCU通信接口的选择引脚:
0就表示接到低电平VSS,1就表示接到高电平VDD。
3. 并行8080接口
3.1 相关引脚说明
我们主要是关注一下8080并行接口的读写时序,方便后边LCD的学习。我们先来看一下相关引脚的说明:
(1)E (RD#):当选择8080接口模式时,该引脚接收读取(RD#)信号。当该引脚拉低并选择芯片时,开始读取操作。
(2)R/W#(WR#) :这是连接到MCU接口的读写控制输入引脚。当选择8080接口模式时,该引脚将作为写入(WR#)输入。当该引脚被拉低并选择芯片时,开始数据写入操作。
(3)CS#:片选信号,低电平有效。
(4)D/C#:这是数据/命令控制引脚。当它被拉高(即连接到VDD),数据在D[7:0]被视为数据。当它被拉低时,D[7:0]的数据将被转移到命令寄存器,也就是被当做命令处理。
3.2 读时序
(1)先根据要读取的数据的类型,设置D/C#为高(数据)/低(命令);
(2)然后拉低片选,选中SSD1306;
(3)接着是要读数据,所以要将RD#拉低;
(4)读数据:在RD#的上升沿, 使数据锁存到数据线(D[7:0])上;
3.3 写时序
(1)先根据要写入的数据的类型,设置D/C#为高(数据)/低(命令);
(2)然后拉低片选,选中SSD1306;
(3)接着是要写数据,所以要将WR#拉低;
(4)写数据:在WR#的上升沿, 使数据写入到SSD1306里面;
3.4 同步频率
在 8080 方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命(Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始,才是我们真正要读的数据。
可以看到,在发送了列地址之后,开始读数据,第一个是 Dummy Read,也就是假读,我们从第二个开始,才算是真正有效的数据。
4. 显存
4.1 显存的划分格式
这一部分我们可以看[SSD1306_datasheet](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)的8.7 Graphic Display Data RAM (GDDRAM) 一节。SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节(128*8bit ),总共8页,这样刚好是128*64的点阵大小。
屏幕行列 | 0~127 列 |
---|---|
0~7 行 | PAGE0 |
8~15 行 | PAGE1 |
16~23 行 | PAGE2 |
24~31 行 | PAGE3 |
32~39 行 | PAGE4 |
40~47 行 | PAGE5 |
48~55 行 | PAGE6 |
56~63 行 | PAGE7 |
以 PAGE2 为例, PAGE2 中的显存数据与屏幕像素点的对应关系,如下图所示 :
可以看出, 显存中的 1 字节数据对应了屏幕上的 8 个像素, 当往控制器 SSD1306 显存的某一页的某一列写入 1 数据, 那么将会同时修改显存中这一页的这一列对应屏幕上的 8个像素。 如果只想修改屏幕上某一个像素的状态,那么通常可以采用读、修改、写或外部微控制器内建显存的方式,但要注意的是, 在 ATK-MD0096 使用 SPI 或 IIC 通讯接口模式时,是无法读取控制器 SSD1306 的数据的,因此,在此情况下建议使用外部微控制器内建显存的方式,如果是对于 RAM 资源不足的外部微控制器,则建议使用 8 位 6800 或 8 位 8080 通讯接口模式,以减少对 RAM 空间的占用。
STM32程序显示数据的原理?
在STM32的内部建立一个 缓存(共128*8个字节),在每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。当然这个方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。
4.2 与像素的对应关系
1 | * 显存中的每一比特代表ATK-MD0096模块OLED上的一个像素 |
5. 命令
SS1306的命令我们可以查看[SSD1306_datasheet](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)的9 COMMAND TABLE 和 10 COMMAND DESCRIPTIONS 。这里只介绍几个我们用得到的。
(1)命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
(2)命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。
(3)命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
(4)命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。
(5)命令0X00~0X0F:用于设置显示时的起始列地址低四位。
(6)命令0X10~0X1F:用于设置显示时的起始列地址高四位。
三、OLED模块
这里还是以正点原子的这款OLED模块为例。
1. OLED模块接口方式
接口方式 | 4 线 SPI | IIC | 8 位 6800 | 8 位 8080 |
---|---|---|---|---|
BS1 | 0 | 1 | 0 | 1 |
BS2 | 0 | 0 | 1 | 1 |
ALIENTEK OLED 模块默认设置是: BS1 和 BS2 接 VCC ,即使用 8080 并口方式,如果想要设置为其他模式,则需要在 OLED 的背面,用烙铁修改 BS1 和 BS2 的设置。
2. 屏幕原理图
这个的话,我们还是看屏幕厂家给的原理图:M00750_VGM128064C0W01_Y01.pdf,这里只贴一下引脚的定义吧:
引脚描述的话我们可以查看M00750_VGM128064C0W01_Y01.pdf的5 Module Interface一节,这里就不详细说明了。
3. 与SSD1036接线?
在屏幕厂家给的原理图M00750_VGM128064C0W01_Y01.pdf的6 Function Block Diagram一节还给出了OLED屏幕与SSD1036控制器的接线图: