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或更新版本。安装过程我就不啰嗦了,重点说几个容易忽略的地方:

  1. 安装器件包:装完MDK后,记得用Pack Installer安装STM32F1系列的器件包。没有这个包,你选不了STM32F103C8T6。
  2. 注册许可证:MDK需要许可证,否则编译到2KB代码就停了。去Keil官网申请一个免费的评估版许可证,能用30天。
  3. 安装驱动:如果你用ST-Link下载调试,需要安装ST-Link驱动。如果用J-Link,装J-Link驱动。

避坑指南:我曾经遇到过一个问题——MDK装好了,但死活识别不到ST-Link。折腾了半天,发现是ST-Link的固件版本太旧。去ST官网下载STM32 ST-LINK Utility,更新一下固件就好了。

1.5 创建工程模板:一个清爽的起点

我习惯自己建工程模板,不用CubeMX生成的代码——不是说CubeMX不好,而是我想完全掌控代码结构。下面是我的模板创建步骤:

  1. 新建工程:Project → New μVision Project,选择STM32F103C8
  2. 添加启动文件:从Keil安装目录复制startup_stm32f10x_md.s到工程
  3. 添加核心文件:system_stm32f10x.c、stm32f10x_it.c、stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_i2c.c
  4. 配置魔术棒:在Target标签页设置晶振频率为8MHz,在C/C++标签页添加宏定义USE_STDPERIPH_DRIVER
  5. 编写main.c:一个简单的空循环,验证工程能编译通过
// main.c 模板
#include "stm32f10x.h"

int main(void)
{
    // 系统时钟配置
    SystemInit();
    
    // 这里后面会添加初始化代码
    
    while(1)
    {
        // 主循环
    }
}

1.6 知识体系总览:一张图看懂全局

下面这张图是我画的课程知识体系。你看一眼,心里就有数了——我们这门课到底要学什么、怎么学。

课程知识体系结构图 STM32F103 OLED驱动与I2C调试 知识体系 课程目标:独立驱动 + 故障定位 硬件基础与连接 I2C协议与驱动 调试与故障定位 STM32最小系统板 · OLED模块 · 杜邦线 电源与电平匹配 · 上拉电阻 起始/停止条件 · 应答机制 硬件I2C配置 · 软件模拟I2C SSD1306命令集 · 显存操作 逻辑分析仪抓波形 示波器测时序 串口打印 · Debug断点 实战输出:OLED显示驱动 + I2C调试能力 字符显示 · 汉字显示 · 图片显示 · 故障排查 💡 学习路径:硬件搭建 → I2C协议理解 → 驱动编写 → 调试优化 → 故障定位 每章都有实战代码和调试案例,跟着做就能掌握

1.7 本章小结:你准备好了吗?

这一章我们做了三件事:明确了课程目标、备齐了硬件、搭好了开发环境。看起来都是准备工作,但千万别小看。我见过太多人一上来就写代码,结果硬件没接对、环境没配好,折腾半天连个灯都点不亮。

你想想看,如果连I2C的SCL和SDA都接反了,再好的代码也白搭。所以,花点时间把基础打牢,后面才能跑得快。

本章核心要点

  • 课程目标:掌握STM32驱动SSD1306 OLED的全流程,具备I2C故障定位能力
  • 硬件清单:STM32F103C8T6 + SSD1306 + 逻辑分析仪是标配
  • 连接注意:3.3V供电,PB6/SCL、PB7/SDA,不要接反
  • 环境搭建:Keil MDK + 器件包 + 下载驱动,缺一不可
  • 工程模板:从启动文件到main.c,一个清爽的起点