当前位置: 首页 > article >正文

0.91寸OLED彩屏(SSD1306驱动)基于STM32的IIC接口移植实战

0.91寸OLED彩屏SSD1306驱动基于STM32的IIC接口移植实战最近在做一个需要小型显示界面的项目选来选去发现0.91寸的OLED彩屏是个不错的选择。它尺寸小巧功耗低显示效果又很清晰。不过从网上买回来的模块厂家给的例程往往不能直接在自己的STM32开发板上跑通需要自己动手移植。今天我就以手头这块STM32F103C8T6核心板为例带大家走一遍完整的移植流程把这块0.91寸、SSD1306驱动的彩屏用IIC接口点亮。咱们的目标很明确拿到厂家资料把驱动代码“搬”到自己的工程里修改引脚和时序最后在屏幕上显示出字符。整个过程我会手把手讲解即使你是刚接触嵌入式不久的朋友跟着做也能成功。1. 准备工作认识你的屏幕与获取资料在开始敲代码之前咱们先得把“家伙事儿”备齐并了解要驱动的对象。1.1 屏幕规格与硬件连接我用的这块屏幕关键信息如下你在购买时也可以参考这些参数型号0.91寸OLED彩屏分辨率128 x 32 像素驱动芯片SSD1306这是一款非常常见的OLED驱动IC通信接口IIC也叫I2C工作电压3.3V - 5VSTM32的IO口一般是3.3V直接连接即可接口引脚通常只有4个VCC接3.3V或5VGND接地SCLIIC时钟线SDAIIC数据线硬件连接非常简单用杜邦线把屏幕和开发板对应引脚连起来就行。注意IIC通信需要上拉电阻不过很多模块已经在板上集成好了如果你的模块没有需要在SCL和SDA线上各接一个4.7K-10K的电阻到VCC。1.2 获取原始驱动资料移植的起点是厂家提供的原始代码。我这次使用的模块资料可以通过以下方式获取资料来源于原始文章可供参考资料下载链接https://pan.baidu.com/s/1fKmD5lr4bA0WB54ukonI-A提取码1111下载后你会找到一个压缩包解压后里面应该有一个OLED文件夹这个文件夹里就是最核心的驱动源码oled.c和oled.h以及一些示例。我们的移植工作主要就是围绕这两个文件展开。2. 移植第一步将源码加入你的工程拿到厂家代码后别急着改。第一步是先把它放到你的STM32工程里并解决最基本的编译问题。2.1 文件放置与工程添加在你的STM32工程目录下找一个合适的地方存放外设驱动通常可以放在Drivers、BSP或User文件夹里。我这里按照习惯在工程根目录下新建了一个BSP文件夹。将厂家资料里的整个【OLED】文件夹复制到你刚建好的BSP文件夹里。打开你的IDE比如Keil MDK或STM32CubeIDE在项目管理器中将oled.c文件添加到你的工程组例如User组中。同时记得在IDE的配置里把头文件路径也加上指向你放oled.h的目录即BSP/OLED。2.2 基础适配与宏定义修改厂家的代码为了通用性可能用了自己的类型定义和头文件我们需要把它改成STM32标准库能识别的。首先打开oled.h文件。你可能会发现它包含了sys.h这样的非标准头文件。我们需要将其替换为STM32的标准头文件。找到类似#include “sys.h”的语句将其改为#include stm32f10x.h // 根据你的芯片系列可能是 stm32f1xx.h 等接着厂家代码里可能用u8、u16、u32来定义变量类型。为了兼容性我们可以在oled.h文件的开头在包含头文件之后其他代码之前自己定义一下#ifndef u8 #define u8 uint8_t #endif #ifndef u16 #define u16 uint16_t #endif #ifndef u32 #define u32 uint32_t #endif这样当代码中遇到u8时编译器就知道它指的是uint8_t无符号8位整数依此类推。然后打开oled.c文件。找到包含delay.h的语句将其改为你工程里实际使用的延时头文件。例如如果你的工程里有一个board.h集中管理板级支持或者直接使用delay.h就相应修改。例如#include board.h // 或 #include delay.h做完这几步尝试编译一下工程。可能还会有一些错误但基础的语法和类型错误应该解决了。接下来就是重头戏配置硬件引脚。3. 核心移植配置IIC引脚与时序这块屏幕使用IIC通信厂家提供的驱动是用软件模拟的IIC时序即用两个普通的GPIO口通过程序控制高低电平来模拟SCL时钟和SDA数据线。这种方式非常灵活不占用硬件IIC外设但需要我们正确配置这两个GPIO口。3.1 修改引脚宏定义我们需要告诉程序你把屏幕的SCL和SDA线接到了STM32的哪两个引脚上。假设我连接的是SCL- PA2SDA- PA0打开oled.h文件找到引脚和端口宏定义的地方通常在文件靠后的部分将其修改为你的实际连接//-----------------OLED端口移植---------------- //GND - GND //VCC - 3.3V //SCL - PA2 //SDA - PA0 #define RCC_GPIO RCC_APB2Periph_GPIOA // GPIOA的时钟使能宏 #define PORT_LCD GPIOA // 端口定义为GPIOA //SCL引脚定义 #define GPIO_LCD_SCL GPIO_Pin_2 //SDA引脚定义 #define GPIO_LCD_SDA GPIO_Pin_0注意RCC_APB2Periph_GPIOA是STM32标准库中使能GPIOA端口时钟的宏。如果你用的是HAL库或其他开发方式这里的写法会不同核心思想是“打开对应GPIO端口的时钟”。3.2 修改引脚操作宏同样在oled.h文件中我们需要找到控制引脚高低电平的宏定义。软件IIC就是通过拉高、拉低这些引脚来实现通信的。将其修改为使用我们上面定义的端口和引脚//-----------------OLED端口定义---------------- #define OLED_SCL_Clr() GPIO_WriteBit(PORT_LCD, GPIO_LCD_SCL, Bit_RESET) //将SCL引脚置低 #define OLED_SCL_Set() GPIO_WriteBit(PORT_LCD, GPIO_LCD_SCL, Bit_SET) //将SCL引脚置高 #define OLED_SDA_Clr() GPIO_WriteBit(PORT_LCD, GPIO_LCD_SDA, Bit_RESET) //将SDA引脚置低 #define OLED_SDA_Set() GPIO_WriteBit(PORT_LCD, GPIO_LCD_SDA, Bit_SET) //将SDA引脚置高这里GPIO_WriteBit是STM32标准库的函数。有些例程可能会用GPIO_ResetBits和GPIO_SetBits原理是一样的。3.3 修改GPIO初始化函数现在需要修改引脚的初始化代码。打开oled.c找到OLED_Init(void)函数。这个函数开头部分通常是配置GPIO的。我们需要将其替换为适合我们引脚配置的代码。找到原来的初始化部分替换为如下代码void OLED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 1. 使能GPIOA的时钟因为我们用了PA2和PA0 RCC_APB2PeriphClockCmd(RCC_GPIO, ENABLE); // 2. 配置SCL和SDA引脚为开漏输出模式 GPIO_InitStructure.GPIO_Pin GPIO_LCD_SCL | GPIO_LCD_SDA; // 要初始化的引脚 GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; // 开漏输出模式 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 输出速度50MHz足够 GPIO_Init(PORT_LCD, GPIO_InitStructure); // 应用配置 // 3. 后续是SSD1306芯片的初始化命令序列保持不变 // delay_ms(200); // 有些初始化需要延时根据实际情况决定是否保留 OLED_WR_Byte(0xAE,OLED_CMD); /*display off*/ // ... 其余初始化命令 OLED_Clear(); OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ }关键点解释GPIO_Mode_Out_OD这里设置为开漏输出模式。这是IIC总线标准的要求之一。开漏输出可以方便地实现“线与”功能当总线上的任何一个设备拉低SDA线时整条线就是低电平。RCC_APB2PeriphClockCmd这是STM32标准库的时钟使能函数。在操作任何外设包括GPIO之前必须先打开它的时钟这是STM32编程里非常容易忘记但又至关重要的一步3.4 调整IIC延时软件模拟IIC的通信速度依赖于delay_us()这样的微秒级延时函数。通信时序比如SCL高电平的保持时间必须满足SSD1306芯片数据手册的要求。在oled.c文件中找到一个名为IIC_delay(void)或类似名称的函数它控制着IIC的基本时钟周期。根据原始资料我们需要将其修改为//IIC延时函数 void IIC_delay(void) { delay_us(2); // 延时2微秒 }这个delay_us(2)决定了IIC的通信速率。2微秒的延时意味着SCL周期大约4微秒对应频率约250kHz。对于SSD1306来说这个速度是兼容的。如果你的工程里没有精准的delay_us函数需要先实现一个。通常可以用SysTick定时器来实现。4. 上电测试点亮屏幕并显示字符经过上面的步骤驱动移植的核心工作就完成了。现在让我们写一个简单的main函数来测试一下。在你的main.c文件中包含必要的头文件并编写如下测试代码#include stm32f10x.h #include board.h // 你的板级支持头文件包含系统初始化和延时函数 #include oled.h int main(void) { // 1. 初始化系统时钟、外设等 board_init(); // 2. 初始化OLED屏幕 OLED_Init(); // 3. 清屏 OLED_Clear(); // 4. 在屏幕上不同位置显示不同大小的字符串 while(1) { OLED_ShowString(0, 0, (uint8_t *)Hello, 8, 1); // 在(0,0)坐标显示8号字体“Hello” OLED_ShowString(10, 8, (uint8_t *)OLED, 12, 1); // 在(10,8)坐标显示12号字体“OLED” OLED_ShowString(20, 18, (uint8_t *)STM32, 16, 1);// 在(20,18)坐标显示16号字体“STM32” OLED_ShowString(60, 36, (uint8_t *)OK!, 24, 1); // 在(60,36)坐标显示24号字体“OK!” // 5. 刷新显示将显存数据发送到屏幕 OLED_Refresh(); // 延时一段时间你可以观察显示效果 delay_ms(1000); // 可选清屏后再显示实现闪烁效果 // OLED_Clear(); // delay_ms(500); } }编译并下载程序到你的开发板。如果一切顺利你应该能看到屏幕上清晰地显示出“Hello OLED STM32 OK!”这些字符。5. 常见问题与调试心得第一次移植很可能不会那么顺利这里分享几个我踩过的坑屏幕完全不亮检查电源首先用万用表量一下屏幕的VCC和GND引脚确认是否有3.3V电压。检查接线确认SCL、SDA、GND、VCC四根线没有接错、没有虚焊。检查上拉电阻如果屏幕模块本身没有集成上拉电阻一定要在SCL和SDA上各接一个4.7K-10K的电阻到3.3V。屏幕亮但无显示白屏或花屏检查初始化序列OLED_Init()函数里那一长串OLED_WR_Byte命令是初始化SSD1306芯片的不要随意删减。确保它们被正确执行。检查IIC时序最大的可能性是IIC通信失败。可以用逻辑分析仪或者示波器抓一下SCL和SDA的波形看是否有数据在传输。如果没有仪器可以尝试将IIC_delay()函数里的延时调大比如改成delay_us(10)降低通信速度试试。检查引脚模式务必确认GPIO初始化为开漏输出GPIO_Mode_Out_OD并且使能了GPIO端口的时钟。显示乱码或错位检查字库OLED_ShowString等显示函数依赖于字库数据。确保oledfont.h等字库文件已正确添加到工程并且字库数组没有损坏。检查坐标OLED的坐标原点(0,0)通常是在屏幕左上角。确保你传递的坐标值没有超出屏幕范围128x32。移植成功的关键在于耐心和细心。按照“电源-接线-时钟-初始化-通信”的顺序一步步排查问题总能解决。当你看到自己点亮的第一个OLED屏幕时那种成就感就是驱动开发最大的乐趣。希望这篇教程能帮你顺利搞定这块小彩屏

相关文章:

0.91寸OLED彩屏(SSD1306驱动)基于STM32的IIC接口移植实战

0.91寸OLED彩屏(SSD1306驱动)基于STM32的IIC接口移植实战 最近在做一个需要小型显示界面的项目,选来选去,发现0.91寸的OLED彩屏是个不错的选择。它尺寸小巧,功耗低,显示效果又很清晰。不过,从网…...

douyin-downloader:视频资源自动化管理的效率革命方案

douyin-downloader:视频资源自动化管理的效率革命方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代,视频资源管理已成为内容创作者和学习者的核心痛点。传统手…...

Leather Dress Collection高性能部署:单卡多LoRA热切换,提升皮革时装生成吞吐量

Leather Dress Collection高性能部署:单卡多LoRA热切换,提升皮革时装生成吞吐量 1. 项目概述 Leather Dress Collection是一个专为皮革时装设计打造的AI图像生成工具包,基于Stable Diffusion 1.5框架构建。这套工具包含12个精心调校的LoRA模…...

南北阁Nanbeige4.1-3B与Git集成:智能代码审查实战

南北阁Nanbeige4.1-3B与Git集成:智能代码审查实战 让AI成为你的代码审查助手,提升团队开发效率与代码质量 1. 引言:当Git遇到AI代码审查 每天面对成堆的Pull Request,是不是感觉代码审查成了开发流程中的瓶颈?人工审查…...

颠覆式AI创作:TaleStreamAI如何将小说推文制作效率提升300%

颠覆式AI创作:TaleStreamAI如何将小说推文制作效率提升300% 【免费下载链接】TaleStreamAI AI小说推文全自动工作流,自动从ID到视频 项目地址: https://gitcode.com/gh_mirrors/ta/TaleStreamAI 创作困境:当灵感遭遇技术瓶颈 深夜两点…...

大模型评测不再靠人工抽样!Dify+私有化Judge模型如何将评估成本降低83%,准确率提升至96.7%?

第一章:大模型评测范式的革命性跃迁传统NLP评测长期依赖单一指标(如准确率、BLEU)与封闭式基准(如GLUE、SQuAD),难以反映大语言模型在真实性、推理鲁棒性、工具调用能力及价值观对齐等维度的综合表现。近年…...

3个痛点解决:用VNote打造高效Markdown笔记系统

3个痛点解决:用VNote打造高效Markdown笔记系统 【免费下载链接】vnote 项目地址: https://gitcode.com/gh_mirrors/vno/vnote 痛点剖析:你的笔记工具是否正在拖慢效率? 你是否也曾遇到这样的困境:精心整理的Markdown笔记…...

5个维度解析MPC-HC:为什么它是专业用户的媒体播放首选

5个维度解析MPC-HC:为什么它是专业用户的媒体播放首选 【免费下载链接】mpc-hc MPC-HCs main repository. For support use our Trac: https://trac.mpc-hc.org/ 项目地址: https://gitcode.com/gh_mirrors/mpc/mpc-hc 一、核心价值:重新定义轻量…...

GLM-4.7-Flash在智能客服场景实战:多轮对话与高并发压测全解析

GLM-4.7-Flash在智能客服场景实战:多轮对话与高并发压测全解析 1. 智能客服的“新大脑”:为什么是GLM-4.7-Flash? 如果你正在为智能客服系统寻找一个“既聪明又扛得住”的大模型,GLM-4.7-Flash可能就是你一直在等的那个答案。这…...

RocketMQ-Exporter 监控告警配置实战指南

1. RocketMQ-Exporter 监控体系核心价值 第一次接触RocketMQ监控时,我也曾困惑:为什么需要额外部署Exporter?直接看Broker日志不就行了?直到某次线上故障让我彻底改变了看法。当时消费者积压突然飙升,但由于缺乏实时监…...

锐捷WLAN——AC热备与DHCP核心交换机配置实战

1. 锐捷WLAN高可用架构设计原理 在企业无线网络部署中,业务连续性至关重要。想象一下这样的场景:当主AC设备突然宕机时,所有无线AP会在5秒内自动切换到备用AC,用户完全感知不到网络中断——这就是AC热备技术创造的奇迹。锐捷的这套…...

Dify.AI工作流构建:串联BERT文本分割与LLM生成任务

Dify.AI工作流构建:串联BERT文本分割与LLM生成任务 你有没有遇到过这样的情况?面对一份几十页的文档,或者一个包含多个子问题的复杂需求,直接扔给大模型处理,结果要么是回答得笼统模糊,要么干脆因为内容太…...

抽象类 vs 接口:为什么选择它?

文章目录抽象类 vs 接口:为什么选择它?什么是抽象类?抽象类的特点抽象类的示例什么是接口?接口的特点接口的示例抽象类 vs 接口:谁更适合你?1. 多继承的支持2. 方法的实现3. 常量的使用4. 使用场景总结为什…...

RVC新手必看:3步完成音频导入→数据处理→模型训练

RVC新手必看:3步完成音频导入→数据处理→模型训练 想用自己的声音唱歌,或者把别人的声音变成你的专属音色吗?RVC(Retrieval-based-Voice-Conversion)这个工具就能帮你实现。它就像一个声音“克隆”和“转换”神器&am…...

代码块折叠:提升Markdown编辑效率的核心功能解析

代码块折叠:提升Markdown编辑效率的核心功能解析 【免费下载链接】typora_plugin Typora plugin. feature enhancement tool | Typora 插件,功能增强工具 项目地址: https://gitcode.com/gh_mirrors/ty/typora_plugin 在技术文档创作过程中&#…...

Stable-Diffusion-V1-5 安全与合规指南:内容过滤、版权风险与伦理考量

Stable-Diffusion-V1-5 安全与合规指南:内容过滤、版权风险与伦理考量 最近和不少做企业服务的朋友聊天,发现大家把AI绘画模型部署到内部环境后,除了关心效果,最头疼的就是安全和合规问题。比如,员工不小心生成了不合…...

革新性宽屏优化实战指南:让暗黑破坏神2重获新生

革新性宽屏优化实战指南:让暗黑破坏神2重获新生 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 问题溯源&#x…...

单分类算法实战:One Class SVM在异常检测中的应用

1. 单分类算法与异常检测的奇妙结合 第一次接触One Class SVM时,我被它的设计哲学深深吸引。想象你是一名质检员,面前是一条高速运转的生产线,你的任务是找出不合格产品。但问题是,你手头只有合格品的样本,根本不知道不…...

FragmentContainerView 与 Jetpack Navigation 的深度整合指南

1. 为什么你需要 FragmentContainerView 与 Navigation 的深度整合? 如果你正在开发一个现代化的 Android 应用,特别是那种采用“单 Activity 多 Fragment”架构的应用,那你肯定绕不开两个东西:FragmentContainerView 和 Jetpack…...

FanControl:为硬件爱好者打造的智能温控工具 - 3步掌握多场景风扇调节核心能力

FanControl:为硬件爱好者打造的智能温控工具 - 3步掌握多场景风扇调节核心能力 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode…...

突破格式壁垒:让B站缓存视频自由流转的技术解密

突破格式壁垒:让B站缓存视频自由流转的技术解密 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你精心缓存的B站视频在跨设备播放时遭遇格式阻碍,当珍…...

ms-swift实战体验:用命令行快速微调大模型,简单高效

ms-swift实战体验:用命令行快速微调大模型,简单高效 1. 引言 如果你对大模型微调还停留在“复杂、耗时、门槛高”的印象,那今天这篇文章可能会改变你的看法。过去,想给一个大模型“教点新东西”,往往意味着要面对繁琐…...

深入解析YOLOv8正样本匹配机制与损失函数优化策略

1. YOLOv8正样本匹配机制揭秘 目标检测任务中,正样本匹配是决定模型性能的关键环节。YOLOv8采用的TAL(TaskAlignedAssigner)正样本匹配机制,相比传统方法有了显著改进。我第一次接触这个机制时,就被它的巧妙设计所吸引…...

Chatbot UI插件秘钥管理:从安全存储到动态加载的AI辅助实践

从硬编码到零信任:Chatbot UI插件秘钥管理的AI辅助实践 还记得那次震惊业界的GitHub历史提交泄露事件吗?一家知名公司的开发者不小心将包含数据库秘钥、API令牌的配置文件推送到了公共仓库。短短几小时内,这些秘钥被恶意脚本扫描并利用&…...

MixFormer实战解析:从混合注意力到高效目标跟踪

1. 初识MixFormer:一个“打包”了所有步骤的跟踪器 想象一下,你要在一个人头攒动的广场上,持续跟拍一个穿着红色衣服、正在奔跑的小孩。传统的目标跟踪算法,就像是一个分工明确的团队:先派一个“侦察兵”(特…...

SUPER COLORIZER数据库集成方案:使用MySQL管理海量上色任务与结果

SUPER COLORIZER数据库集成方案:使用MySQL管理海量上色任务与结果 如果你正在用AI工具批量处理图片,比如给成百上千张黑白照片上色,那你肯定遇到过这样的麻烦:处理到哪张了?哪张失败了?处理好的图片存哪了…...

突破暗黑破坏神2宽屏限制:d2dx技术重构经典游戏视觉体验

突破暗黑破坏神2宽屏限制:d2dx技术重构经典游戏视觉体验 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 在现代游…...

【Flowable】流程决策的艺术:深入解析四大网关的实战应用

1. 流程引擎中的决策大脑:网关核心价值解析 第一次接触Flowable的朋友,常常会被各种网关类型绕晕。其实网关就像交通路口的红绿灯和指示牌,控制着流程的走向和分支。在实际项目中,我经常看到开发者因为选错网关类型,导…...

突破B站缓存格式壁垒:m4s-converter的跨平台视频自由解决方案

突破B站缓存格式壁垒:m4s-converter的跨平台视频自由解决方案 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你辛苦缓存的B站视频只能在特定设备观看&#xff0…...

NAS玩家必看:SSD缓存vs机械硬盘,xfs文件系统下的bcache配置全指南

NAS存储性能优化实战:SSD缓存与机械硬盘的bcache配置指南 在家庭与企业级NAS存储解决方案中,机械硬盘(HDD)凭借其大容量和低成本优势依然是主流选择,但随机读写性能的瓶颈始终困扰着追求效率的用户。本文将深入探讨如何通过bcache技术&#x…...