STM32学习笔记(四)OLED显示屏与Keil调试
STM32 学习笔记四OLED 显示屏与 Keil 调试本文以 STM32F103C8T6、0.96 寸 OLED 模块、STM32F10x 标准外设库和 Keil μVision 为例学习显示屏的基本使用方法并介绍 Keil 调试器的常用功能。一、程序调试单片机程序调试常用的方法主要有三种串口调试、显示屏调试和 Keil 调试。它们就像三种不同的“观察窗口”串口和显示屏适合观察程序运行时主动输出的信息Keil 调试则可以暂停程序查看它当前执行到了哪一步。串口调试串口调试是最常见的调试方法之一。单片机通过串口通信把变量值、运行状态或错误提示发送给电脑电脑再使用串口助手显示这些信息。在设计 PCB 时常常会在板边预留串口引脚或调试接口。需要调试程序时把单片机的串口与电脑连接起来就可以在串口助手中观察程序运行状态。例如可以输出当前传感器数值、按键状态或某个函数是否被执行。串口调试的优点是运行过程中不会频繁暂停程序适合观察连续变化的数据缺点是需要额外的串口硬件和通信代码而且输出过多的信息可能影响程序的实时性。显示屏调试显示屏调试是把单片机内部的调试信息直接显示在屏幕上例如显示变量值、状态编号或传感器结果。这种方法不需要电脑一直连接在旁边适合在脱离电脑的情况下观察设备运行状态。不过显示屏本身也需要初始化和驱动。如果显示屏驱动还没有调通就不能把它作为唯一的调试手段否则容易出现“为了调试显示屏先要调试显示屏”的循环问题。Keil 调试Keil 调试需要借助 ST-Link 等硬件调试器。进入调试模式后可以单步运行程序、设置断点、查看变量、寄存器、内存以及反汇编代码还可以观察程序运行到哪一行后出现异常。可以把它想象成给程序装上了“暂停键”和“慢放键”程序正常运行时速度很快调试器可以让它停在某一行再逐条观察每一步执行后的结果。二、OLED 简介与驱动函数OLED 简介OLED 是Organic Light Emitting Diode的缩写中文称为有机发光二极管显示屏。OLED 的每个像素都可以自行发光不需要像普通液晶屏那样依靠背光因此具有功耗较低、响应速度快、可视角度大、厚度较小等特点常用于嵌入式设备显示数据。0.96 寸 OLED 模块课件中介绍的 0.96 寸 OLED 模块具有体积小、接口较少、使用方便等特点。常见参数如下供电电压常见模块标注为3~5.5V但实际仍要以模块说明书为准通信协议常见为I2C或SPI分辨率128 × 64表示横向有 128 个像素点纵向有 64 个像素点主控芯片常见为 SSD1306 或兼容控制器具体型号要以模块资料为准。分辨率可以理解为屏幕上的“方格数量”。128 × 64就是横向排列 128 列、纵向排列 64 行总共 8192 个像素点。驱动程序通过通信协议把要显示的图形或字符写入 OLED 内部显存屏幕再根据显存内容点亮对应像素。OLED 硬件连接4 针 OLED4 针模块通常使用 I²C 通信但仍要以模块丝印和驱动程序为准引脚作用GND接地VCC接电源课件中接3V3SCLI²C 时钟线SDAI²C 数据线I²C 的SCL是时钟线SDA是数据线。I²C 通常采用开漏输出并需要上拉电阻许多 OLED 模块已经在板上集成了上拉电阻但不能默认所有模块都有使用前应查看电路或模块说明。7 针 OLED7 针模块通常使用 SPI 通信引脚作用GND接地VCC接电源课件中接3V3D0SPI 时钟线D1SPI 数据线RES复位信号DC数据/命令选择CS片选信号SPI 模块比 I²C 模块多出复位、数据/命令选择和片选等控制信号。实际接线时必须确认模块型号和驱动程序不能只根据引脚数量猜测通信协议也不能把 SPI 模块的D0/D1与 I²C 模块的SCL/SDA混用。OLED 驱动函数不同 OLED 驱动库的函数名和参数含义可能略有差异。下面这些函数来自本次使用的驱动模块OLED_Init();// 初始化 OLEDOLED_Clear();// 清屏OLED_ShowChar(1,1,A);// 显示一个字符OLED_ShowString(1,3,HelloWorld!);// 显示字符串OLED_ShowNum(2,1,12345,5);// 显示十进制数字OLED_ShowSignedNum(2,7,-66,2);// 显示有符号十进制数字OLED_ShowHexNum(3,1,0xAA55,4);// 显示十六进制数字OLED_ShowBinNum(4,1,0xAA55,16);// 显示二进制数字通常前两个参数表示显示位置例如行号和列号最后一个参数通常表示显示的位数。但这些参数的具体含义取决于所使用的 OLED 驱动库使用前应查看OLED.h或函数定义。常见调用步骤是OLED_Init();OLED_Clear();OLED_ShowString(1,1,STM32);一般先初始化 OLED再根据需要清屏最后调用显示函数输出字符、字符串或数字。部分驱动在初始化过程中已经完成清屏因此OLED_Clear()是否必须调用要以驱动程序实现为准。本节先掌握 OLED 相关函数的基本用法暂时不深入研究显示缓存、字库和通信时序。等到能够稳定显示内容后再回头理解驱动函数内部是如何把字符转换成像素数据的。三、实战演练准备工作把之前的工程复制一份修改工程名称然后删除上一节实验中不需要的函数和语句使工程回到可以重新添加 OLED 驱动的状态。打开程序源码找到 OLED 驱动模块把适合当前硬件的 4 针 OLED 版本文件复制到工程的Hardware文件夹中并在 Keil 工程中添加对应的.c文件和.h文件同时配置头文件路径。打开OLED.c。驱动文件中的大部分内容通常不需要修改主要检查引脚宏定义和 GPIO 初始化部分。修改引脚配置/*引脚配置*/#defineOLED_W_SCL(x)GPIO_WriteBit(GPIOB,GPIO_Pin_8,(BitAction)(x))#defineOLED_W_SDA(x)GPIO_WriteBit(GPIOB,GPIO_Pin_9,(BitAction)(x))这里要根据实际硬件接线修改。如果 OLED 的SCL接到了 PB8SDA接到了 PB9那么宏定义中的端口和引脚就应当写成 PB8、PB9。如果改了硬件接线宏定义也必须同步修改否则程序会把数据发送到错误的引脚。这份驱动使用的是软件模拟 I²C程序通过GPIO_WriteBit手动改变 SCL 和 SDA 的电平而不是直接调用 STM32 硬件 I²C 外设。PB8、PB9 只是本例选择的普通 GPIO并不意味着所有 OLED 都必须接在这两个引脚上。修改引脚初始化/*引脚初始化*/voidOLED_I2C_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PinGPIO_Pin_8;GPIO_Init(GPIOB,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_Init(GPIOB,GPIO_InitStructure);OLED_W_SCL(1);OLED_W_SDA(1);}这里要把 SCL 和 SDA 两个引脚都初始化好并且配置为开漏输出。开漏输出输出低电平时可以主动拉低总线输出高电平时则释放总线由上拉电阻把总线拉高这正是 I²C 总线常用的电气方式。初始化结束时把 SCL 和 SDA 写为 1是为了让总线处于释放状态避免程序刚开始运行时把总线强行拉低。若模块没有上拉电阻还需要根据 I²C 速度和总线电容补充合适的外部上拉电阻。剩余驱动代码通常不需要修改可以直接调用。实战演练先初始化 OLED再显示字符和字符串/* Main */intmain(){OLED_Init();OLED_ShowChar(1,1,A);OLED_ShowString(1,3,Real World?);while(1){}}在这份驱动中前两个参数表示显示位置后面的参数表示显示内容。编译并下载后如果屏幕坐标和驱动库采用常见的行列定义第一行应显示A Real World?。如果显示位置或字符间距不同应以当前 OLED 驱动库的字库和坐标规则为准。显示无符号和有符号十进制数字OLED_ShowNum(2,1,114514,6);//无符号OLED_ShowSignedNum(2,8,-6,1);//有符号这两个函数用于显示十进制整数。前两个参数表示行和列第三个参数是要显示的数字第四个参数是显示长度。如果长度参数比数字实际位数长通常会在前面补 0如果长度参数比实际位数短高位数字可能被截掉。对于有符号数字长度参数通常只计算数字部分不包含负号但具体规则仍要以驱动函数定义为准。显示内容较长时还要注意列数不能超过屏幕范围。显示十六进制数和二进制数OLED_ShowHexNum(3,1,0xAA55,4);//显示十六进制OLED_ShowBinNum(4,1,0xAA55,16);//显示二进制这两个函数分别用于显示十六进制和二进制数字。传统 C 语言标准通常不支持直接写二进制字面量因此可以先写十六进制数再由函数内部逐位转换为二进制显示。这里的长度参数表示转换后要显示的二进制位数。清除屏幕内容OLED_Clear();这个函数会清除屏幕上的全部内容。如果只想清除部分位置可以在对应位置显示空格但要注意空格的宽度必须覆盖原字符占用的显示区域。四、Keil 调试进入调试模式点击工具栏上的“魔术棒”按钮打开Options for Target进入Debug页面。这里通常有两种选择Use ST-Link Debugger使用真实的 STM32 芯片和 ST-Link 硬件进行调试Use Simulator使用 Keil 软件模拟器运行部分程序。本章使用硬件调试因此选择Use ST-Link Debugger。在调试前要先编译工程确认代码能够正常编译和链接然后点击右上角放大镜中带有d的图标进入调试模式。软件模拟器不需要连接开发板但它不能完整模拟真实 OLED、按键和传感器等外部硬件。要观察真实屏幕显示和 GPIO 电平仍然需要使用开发板和 ST-Link。调试界面进入调试界面后主窗口通常显示 C 语言源程序上方或其他窗口可以显示编译后的汇编代码。寄存器窗口能够显示 CPU 和外设寄存器的当前值状态标志位则反映处理器当前的运行状态。调试工具栏中的按钮用于控制程序运行常见功能包括复位程序全速运行停止运行单步运行单步跳过函数内部执行单步跳出当前函数运行到光标所在位置。不同版本的 Keil 图标位置可能略有不同但把鼠标悬停在按钮上通常会显示功能名称。在源代码窗口中黄色箭头表示下一条即将执行的语句。程序暂停后可以单步执行观察变量、寄存器和屏幕状态如何变化。单步执行就像把视频逐帧播放适合分析程序为什么进入了某个分支。设置断点可以单击代码左侧的深灰色区域设置断点再点击全速运行。程序运行到断点所在位置后会自动暂停黄色箭头会指向下一条待执行语句。断点适合观察某个函数是否被调用、某个条件是否成立以及变量在某一时刻的值。硬件调试器的断点数量通常有限调试时应优先设置在最关键的位置不要一次设置过多断点。常用观察窗口调试界面还可以打开以下窗口命令窗口输入调试命令反汇编窗口查看 C 代码对应的汇编指令符号或变量窗口实时查看变量的值内存窗口查看指定地址中的数据串口显示窗口观察串口相关信息逻辑分析仪观察部分信号或变量随时间的变化。调试时可以把源代码、变量窗口、寄存器窗口和反汇编窗口结合起来使用。例如OLED 没有显示时可以先在源代码中确认OLED_Init()是否执行再查看 GPIOB 的配置寄存器和 SCL/SDA 输出状态最后检查 I²C 时序和接线。五、附录下面汇总本文使用的代码正文中的代码保留在对应章节附录方便集中查看和复制。//main.c/* 头文件声明区域 */#includestm32f10x.h// Device header#includeDelay.h#includeLED.h#includeKey.h#includeOLED.h/* 变量声明区域 *//* Main */intmain(){OLED_Init();OLED_ShowChar(1,1,A);OLED_ShowString(1,3,Real World?);OLED_ShowNum(2,1,114514,6);OLED_ShowSignedNum(2,8,-6,1);OLED_ShowHexNum(3,1,0xAA55,4);OLED_ShowBinNum(4,1,0xAA55,16);while(1){}}

相关新闻

OpenClaw集成DeepSeek API:从配置到优化的完整实践指南

OpenClaw集成DeepSeek API:从配置到优化的完整实践指南

1. 从“能用”到“好用”:为什么OpenClaw接入DeepSeek值得一试最近在折腾本地大模型应用的朋友,估计没少被各种部署、配置和API调用问题搞得头大。我自己也是,从早期的ChatGLM、Qwen一路玩过来,直到遇到了OpenClaw。这玩意儿本质上…

2026/10/1 15:16:09 阅读更多 →
Windows本机搭建FTP服务器:基于IIS的完整配置与安全实践指南

Windows本机搭建FTP服务器:基于IIS的完整配置与安全实践指南

1. 项目概述:为什么要在Windows本机搭建FTP?如果你手头有一台Windows电脑,无论是台式机还是笔记本,并且经常需要在局域网内(比如家里、办公室)和手机、平板或者其他电脑之间快速互传文件,那么自…

2026/10/7 19:25:29 阅读更多 →
我对面向对象分析与设计与实现的一些看法

我对面向对象分析与设计与实现的一些看法

我对面向对象分析与设计与实现的一些看法 面向对象(Object-Oriented, OO)不仅仅是一种编程风格,更是一种思考问题、组织代码和构建系统的哲学。从我初学编程时的“万物皆对象”的朦胧理解,到如今在复杂项目中实践OO分析与设计&…

2026/10/13 18:51:51 阅读更多 →

最新新闻

SpringBoot+Vue高校疫情防控管理系统毕设项目完整设计与实现

SpringBoot+Vue高校疫情防控管理系统毕设项目完整设计与实现

1. 项目定位:这套系统到底解决什么问题总有人拿着“SpringBootVue 高校疫情防控web系统管理平台源码【适合毕设/课设/学习】JavaMySQL”这个标题来问我,它到底能不能直接拿来当毕业设计、能不能跑通、要不要改代码。先说我的结论:这套系统选型…

2026/10/14 11:39:48 阅读更多 →
硬件选型笔记:国产 PCIe Gen2.1 交换芯片 IX6012@ACP,紧凑型工控与小型边缘采集 IO 扩展评估

硬件选型笔记:国产 PCIe Gen2.1 交换芯片 IX6012@ACP,紧凑型工控与小型边缘采集 IO 扩展评估

前言最近行业内 PCIe 相关讨论大多集中在 Gen4/Gen5 的高端 AI 服务器方案。但在工控、嵌入式采集、小型边缘终端项目里,很多硬件工程师遇到的痛点并不是带宽不够,而是主控原生 PCIe 通道数量有限,同时板卡空间紧张、整机功耗需要严格控制。这…

2026/10/14 11:39:48 阅读更多 →
建筑智能化:高效楼宇自控图形图库设计与应用

建筑智能化:高效楼宇自控图形图库设计与应用

1. 项目背景与核心价值作为一名在建筑智能化领域摸爬滚打十年的工程师,我深知一套高质量的楼宇自控图形图库对项目效率意味着什么。最近整理完成的这套空调送排风系统图库,正是基于这些年踩过的坑和积累的经验,把行业里最常用的设备符号、系统…

2026/10/14 11:39:48 阅读更多 →
印章检测数据集VOC转YOLO训练全流程:小样本目标检测实战解析

印章检测数据集VOC转YOLO训练全流程:小样本目标检测实战解析

简介:面向目标检测入门与印章识别场景的专用数据集,包含210张真实印章图片,提供Pascal VOC与YOLO两种主流标注格式,共计488个矩形框,标注类别仅seal一种。适合练习训练YOLO系列、Faster R-CNN等常见检测模型&#xff0…

2026/10/14 11:39:48 阅读更多 →
《重排模型反而拖垮检索?我用 56 道电气题测出了 Rerank 的真话》

《重排模型反而拖垮检索?我用 56 道电气题测出了 Rerank 的真话》

TL;DR 交叉编码器 Rerank 号称“更准”,我把它接进 RAG 检索链路实测:Recall 没涨、延迟涨了 8 倍。更意外的是,我在 10 道题的小样本上找到了“完美阈值”,又在 56 道题全量上亲手推翻了它。结论:重排不是没用&#x…

2026/10/14 11:39:48 阅读更多 →
具身智能的空间记忆引擎:从反应式导航到认知式叙事

具身智能的空间记忆引擎:从反应式导航到认知式叙事

1. 这不是又一个“具身智能”概念炒作:它撕开了当前AI导航系统的根本性裂缝你有没有试过让一个机器人在陌生公寓里找钥匙?不是实验室里贴满二维码的白墙,而是真实家庭——沙发底下有猫毛、茶几上堆着杂志、玄关处还斜靠着一把雨伞。我去年带团…

2026/10/14 11:38:48 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →