LV16-25-OLED-02-8080时序驱动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时序的认识会更深刻一些。由于我没有8080并口的OLED模块,所以还是以正点原子的OLED模块来进行时序的模拟。
一、硬件设计
(1)CS: OLED 片选信号,对应 PD6。
(2)WR:向 OLED 写入数据,对应 PG14。
(3)RD:从 OLED 读取数据,对应 PG13。
(4)D[7: 0]: 8 位双向数据线,对应 PC[7: 0] 。
(5)RST(RES):硬复位 OLED,对应 PG15。
(6)DC:命令/数据标志(0,读写命令; 1,读写数据),对应 PD3 。
二、STM32CubeMX配置
1. GPIO配置
由于我们是模拟8080时序,所以只需要配置GPIO就可以了。
2. 时钟树
三、OLED显示实现
1. 宏定义
1 | //---------------------------OLED端口定义-------------------------- |
2. 基本驱动函数实现
2.1 GPIO初始化
首先肯定是我们引脚的初始化啦,由于是模拟8080时序,所以都是设置成推挽输出模式。
1 | void MX_GPIO_Init(void) |
2.2 向SSD1306写一个字节数据
1 | void OLED_WR_Byte(uint8_t dat,uint8_t cmd) |
【函数说明】向SSD1306写入一个字节的数据,可以是命令也可以是数据,毕竟命令其实也是特殊的数据嘛。
【参数说明】
- dat :要写入的数据/命令
- cmd :数据/命令标志。0,表示命令;1,表示数据;
2.3 更新GRAM数据到OLED
SSD1306是自带显存的,我们将数据写入到显存后,还需要将数据刷新到OLED显示,这样才能真正实现OLED的显示。
1 | void OLED_Refresh_Gram(void) |
【函数说明】我们在 STM32F1内部定义了一个块GRAM:OLED_GRAM[128][8]此部分 GRAM 对应 OLED 模块上的 GRAM。在操作的时候,我们只要修改 STM32F1 内部的 GRAM 就可以了,然后通过 OLED_Refresh_Gram 函数把 GRAM 一次刷新到 OLED 的 GRAM 上。函数数先设置页地址,然后写入列地址(也就是纵坐标),然后从 0 开始写入 128 个字节,写满该页,最后循环把 8 页的内容都写入,就实现了整个从 STM32F1 显存到 OLED 显存的拷贝。
2.4 OLED清屏
1 | void OLED_Clear(void) |
【函数说明】清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样。
2.5 SSD1306初始化
上边相关的驱动函数实现完毕后,就需要来初始化和配置我们的SSD1306啦:
1 | //初始化SSD1306 |
【函数说明】上边的这些个命令,一般厂家都会提供给我们,我们直接按照厂家给的进行初始化就可以了。详细的每个命令可以干什么我们可以查看[SSD1306_datasheet](./STM32开发相关资料/02显示屏参考资料/OLED参考资料/01-SSD1306-Revision 1.1 (Charge Pump).pdf)的9 COMMAND TABLE 和 10 COMMAND DESCRIPTIONS 。
2.6 OLED显示开关
2.6.1 开启OLED显示
1 | //开启OLED显示 |
2.6.2 关闭OLED显示
1 | //关闭OLED显示 |
3. 应用函数的实现
应用函数主要是指完成画点,画线,显示字符等一系列的操作。不过这里暂时只写了一个画点函数,因为目前这一部分还不是重点,后边会再补充这里的笔记。
3.1 画点函数
OLED_GRAM[128][8]中的 128 代表列数(x 坐标),而 8 代表的是页, 每页又包含 8 行,总共 64 行(y 坐标)。从高到低对应行数从小到大。比如,我们要在 x=100, y=29 这个点写入1,则可以用这个语句实现:
1 | OLED_GRAM[100][4]|=1<<2; |
所以一个通用的在点(x, y)置 1 表达式为 :
1 | OLED_GRAM[x][7-y/8]|=1<<(7-y%8);// 其中 x 的范围为: 0~127; y 的范围为: 0~63。 |
所以我们可以写出这样一个画点的函数:
1 | //画点 |
【函数说明】这个函数可以实现在OLED的画一个点,其实就是点亮指定位置的像素点。
【参数说明】
- x :横向的坐标,可以看做是列坐标,就是在第几列,范围是0~127
- y :纵向的坐标,可以看做是行坐标,就是在第几行,范围是0~63
- t :表示是点亮这个点,还是说清空这个点(熄灭),1 表示填充;0表示清空。