1. 课程导学与硬件准备
大家好,我是你们的老朋友。做嵌入式这些年,我调试过不少I2C设备,也踩过不少坑。说实话,OLED驱动看起来简单,但真要把它调通、调稳,里面门道不少。这一章我们先打好基础,把硬件和软件环境准备好。
1.1 课程目标:我们要解决什么问题?
这门课不是单纯教你怎么点亮屏幕。我的目标是让你真正理解I2C通信的底层逻辑,学会自己定位和解决通信故障。具体来说,学完这门课你能做到:
- 独立驱动:用STM32F103的硬件I2C或软件模拟I2C,驱动SSD1306 OLED显示字符、汉字、图片
- 故障定位:当屏幕不亮、显示乱码、通信卡死时,能快速找到问题根源
- 工程思维:掌握模块化编程、逻辑分析仪抓波形、示波器测时序等实战技能
核心知识点一览
- I2C协议详解:起始条件、停止条件、应答机制、时钟同步
- SSD1306驱动芯片:显存结构、命令集、初始化序列
- STM32F103硬件I2C:寄存器配置、中断与DMA、常见Bug
- 软件模拟I2C:GPIO位操作、时序精确控制、移植技巧
- 调试工具:逻辑分析仪、示波器、串口打印、Debug断点
1.2 硬件清单:这些东西你都得备齐
我建议你按照这个清单准备,别图省事。有一次我帮一个学员远程调试,结果他用的OLED模块引脚定义和标准不一样,折腾了半小时才发现——嗯,这种冤枉路咱们不走。
| 序号 | 硬件名称 | 规格/型号 | 数量 | 备注 |
|---|---|---|---|---|
| 1 | STM32最小系统板 | STM32F103C8T6 | 1块 | 蓝色板或黑色板均可,注意晶振8MHz |
| 2 | OLED显示模块 | 0.96寸 SSD1306 | 1块 | I2C接口,默认地址0x78或0x7A |
| 3 | USB转TTL模块 | CH340G / CP2102 | 1个 | 用于串口打印调试信息 |
| 4 | 杜邦线 | 公对母、公对公 | 各10根 | 建议买不同颜色,方便区分 |
| 5 | 面包板 | 830孔 | 1块 | 方便搭建临时电路 |
| 6 | 逻辑分析仪 | 24MHz/8通道 | 1个 | 调试I2C时序必备,几十块钱的就行 |
| 7 | 示波器 | 100MHz双通道 | 1台 | 可选,有更好,没有也能用逻辑分析仪 |
我的经验:逻辑分析仪是调试I2C的神器。我当年第一次调I2C,屏幕死活不亮,用逻辑分析仪一看,发现SCL时钟线上有个毛刺——原来是杜邦线接触不良。从那以后,我调试I2C必挂逻辑分析仪。
1.3 硬件连接:别接错,烧了可别怪我
STM32F103C8T6和SSD1306的连接其实很简单。I2C只需要两根线:SCL(时钟)和SDA(数据)。我习惯用PB6和PB7,因为这是STM32的I2C1外设引脚。
| STM32F103C8T6 | SSD1306 OLED | 说明 |
|---|---|---|
| PB6 (SCL) | SCL | I2C时钟线 |
| PB7 (SDA) | SDA | I2C数据线 |
| 3.3V | VCC | 供电,注意OLED是3.3V |
| GND | GND | 共地 |
警告:千万不要把5V接到OLED的VCC上!SSD1306的工作电压是3.3V,接5V会直接烧毁。我见过不止一个新手犯这个错。STM32的GPIO电平也是3.3V,所以不需要电平转换。
1.4 开发环境搭建:Keil MDK 从零开始
Keil MDK是我们用的主力IDE。如果你还没装,去官网下载MDK-Arm版本,建议用5.38或更新版本。安装过程我就不啰嗦了,重点说几个容易忽略的地方:
- 安装器件包:装完MDK后,记得用Pack Installer安装STM32F1系列的器件包。没有这个包,你选不了STM32F103C8T6。
- 注册许可证:MDK需要许可证,否则编译到2KB代码就停了。去Keil官网申请一个免费的评估版许可证,能用30天。
- 安装驱动:如果你用ST-Link下载调试,需要安装ST-Link驱动。如果用J-Link,装J-Link驱动。
避坑指南:我曾经遇到过一个问题——MDK装好了,但死活识别不到ST-Link。折腾了半天,发现是ST-Link的固件版本太旧。去ST官网下载STM32 ST-LINK Utility,更新一下固件就好了。
1.5 创建工程模板:一个清爽的起点
我习惯自己建工程模板,不用CubeMX生成的代码——不是说CubeMX不好,而是我想完全掌控代码结构。下面是我的模板创建步骤:
- 新建工程:Project → New μVision Project,选择STM32F103C8
- 添加启动文件:从Keil安装目录复制startup_stm32f10x_md.s到工程
- 添加核心文件:system_stm32f10x.c、stm32f10x_it.c、stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_i2c.c
- 配置魔术棒:在Target标签页设置晶振频率为8MHz,在C/C++标签页添加宏定义USE_STDPERIPH_DRIVER
- 编写main.c:一个简单的空循环,验证工程能编译通过
// main.c 模板
#include "stm32f10x.h"
int main(void)
{
// 系统时钟配置
SystemInit();
// 这里后面会添加初始化代码
while(1)
{
// 主循环
}
}
1.6 知识体系总览:一张图看懂全局
下面这张图是我画的课程知识体系。你看一眼,心里就有数了——我们这门课到底要学什么、怎么学。
1.7 本章小结:你准备好了吗?
这一章我们做了三件事:明确了课程目标、备齐了硬件、搭好了开发环境。看起来都是准备工作,但千万别小看。我见过太多人一上来就写代码,结果硬件没接对、环境没配好,折腾半天连个灯都点不亮。
你想想看,如果连I2C的SCL和SDA都接反了,再好的代码也白搭。所以,花点时间把基础打牢,后面才能跑得快。
本章核心要点
- 课程目标:掌握STM32驱动SSD1306 OLED的全流程,具备I2C故障定位能力
- 硬件清单:STM32F103C8T6 + SSD1306 + 逻辑分析仪是标配
- 连接注意:3.3V供电,PB6/SCL、PB7/SDA,不要接反
- 环境搭建:Keil MDK + 器件包 + 下载驱动,缺一不可
- 工程模板:从启动文件到main.c,一个清爽的起点