基于STM32G474的0.96寸OLED(SSD1306)显示屏驱动程序(4针脚I2C接口),支持硬件IIC/软件IIC,HAL库版。
这款驱动程序比较完善,可以实现 英文、整数、浮点数、汉字、图像、二进制数、十六进制数 等内容显示,可以画点、直线、矩形、圆、椭圆、三角形等,支持多种字体,差不多相当于一个简易版图形库了。
该程序是基于江协科技的代码二次修改的,原版程序是基于STM32F103的,且只支持软件I2C,我修改后支持硬件I2C,也可以修改宏定义改成使用软件I2C。
测试硬件为NUCLEO-G474RE开发板
关于OLED的驱动原理,以及驱动程序的使用教程可以看江协科技的视频:https://url.zeruns.tech/L7j6y
- STM32使用硬件I2C读取SHTC3温湿度传感器:https://blog.zeruns.tech/archives/692.html
- 移植好U8g2图形库的STM32F407标准库工程模板:https://blog.zeruns.tech/archives/722.html
- 基于STM32F1的0.96寸OLED显示屏驱动程序,支持硬件/软件I2C:https://blog.zeruns.tech/archives/769.html
电子/单片机技术交流群:820537762
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备(那些电平转化芯片),现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
I2C只有一跟数据总线 SDA(Serial Data Line),串行数据总线,只能一位一位的发送数据,属于串行通信,采用半双工通信。
半双工通信:可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替进行,其实也可以理解成一种可以切换方向的单工通信,同一时刻必须只能一个方向传输,只需一根数据线。
对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性(硬件部分),确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准(软件层面)。
I2C 通讯设备之间的常用连接方式
(1) 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线SDA(Serial Data Line ),一条串行时钟线SCL(Serial Clock Line )。数据线即用来表示数据,时钟线用于数据收发同步
(3) 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
I2C通信时单片机GPIO口必须设置为开漏输出,否则可能会造成短路。
关于更多STM32的I2C相关信息和使用方法可以看这篇文章:https://url.zeruns.tech/JC0Ah
还有江协科技的STM32入门教程:https://www.bilibili.com/video/BV1th411z7sn?p=31
我这里就不详细讲解了。
工程使用Keil5创建,用Vscode+EIDE开发,两个软件都可以打开此工程。
工程文件全部使用UTF-8编码,如果打开显示乱码需要修改编辑器编码为UTF-8。
STM32CubeMX配置,找到你要用的I2C外设的引脚,并设置引脚功能为SCL和SDA,如下图所示是I2C3的SCL。
接着配置I2C外设,启用对应的I2C外设,速度模式设置为 Fast Mode Plus
,速度改成 1000,其他默认就行。
配置GPIO,上面设置完后会自动把那两个引脚配置为复用开漏输出模式,接着只需要把IO输出速度改成 Very High
,还有GPIO标签(User Label)定义分别改成I2C3_SCL
和I2C3_SDA
就行,如果是用的别的I2C也可以设置成别的值,代码对应处要修改一下。改完后点击生成代码。
OLED.c文件里,将 #define OLED_USE_SW_I2C
注释掉,将 #define OLED_USE_HW_I2C
取消注释,如果你用的是别的引脚作为I2C引脚,并且定义了别的名字那就将代码里的 I2C3_SCL
和 I2C3_SDA
也改一下。
STM32CubeMX配置,设置两个引脚作为I2C的SCL和SDA信号线,修改IO口的 User Lable
分别为I2C3_SCL
和I2C3_SDA
,如果改成别的需要到代码里修改一下,IO模式设置为开漏输出,默认输出电平高电平,上拉输出,速度设置到最高,如下图所示。改为后点击生成代码。
OLED.c文件里,将 #define OLED_USE_HW_I2C
注释掉,将 #define OLED_USE_SW_I2C
取消注释,如果你用的是别的引脚作为I2C引脚,并且定义了别的名字那就将代码里的 I2C3_SCL
和 I2C3_SDA
也改一下。
- STM32开发板入门套件:https://u.jd.com/fQS0YAe
- STM32G474开发板:https://s.click.taobao.com/8OwQ8vt
- OLED模块:https://s.click.taobao.com/EF0Evwt
- 杜邦线:https://s.click.taobao.com/VMkDvwt
- 面包板:https://s.click.taobao.com/bhg8Txt
- DAPLink(可代替ST-Link,带虚拟串口):https://s.click.taobao.com/QVQ8Txt
江协科技的STM32入门套件:https://s.click.taobao.com/NTn9Txt
- 高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.tech/archives/383.html
- 做了个三相电量采集器开源出来,可以方便监测家里用电情况:https://blog.zeruns.tech/archives/771.html
- 我的世界开服教程:https://blog.zeruns.tech/tag/mc/
- 幻兽帕鲁开服教程:https://blog.zeruns.tech/tag/PalWorld/
- 睿登RD6012P数控可调电源简单开箱评测,60V 12A数控直流电源:https://blog.zeruns.tech/archives/740.html
- 拓竹P1SC 3D打印机开箱体验:https://blog.zeruns.tech/archives/770.html
- 不同品牌和种类的电容与电感实测对比(D值、Q值、ESR、X):https://blog.zeruns.tech/archives/765.html