STM32
示例程序
Transparent_Test
程序说明
- 本示例使用 STM32F103ZET6,通过四线 SPI 接口驱动分辨率为 128 × 64 的 SSD1312 OLED。工程基于 STM32Cube HAL,并提供 Keil MDK 工程文件。
- 系统时钟由 8 MHz 外部晶振倍频至 72 MHz。OLED 默认使用 SPI1,工作在 SPI 模式 0,时钟频率为 2.25 MHz,只向屏幕发送数据,无需连接 MISO。
- SSD1312 驱动提供清屏、刷新、点、线、矩形、圆、英文字符、中文点阵字符和 BMP 点阵图等显示接口。显存大小为 1024 字节,按 128 列 × 8 页组织,每页对应 8 行像素。
- 默认运行
OLED_DemoRun(),依次演示英文字符串、中文点阵字符、BMP 点阵图、线条场景和仪表盘点阵图。工程还提供旋转线框立方体示例,可在Core/Src/main.c中切换。 - 工程同时预留了 I2C1 驱动,速率为 400 kHz,默认 7 位地址为
0x3C。模块需要通过焊点切换至 I2C 模式后才能使用该接口。
硬件连接
接线前断开电源
OLED 的工作电压为 3.3 V。请勿将 VCC 接入 5 V 电源。
默认四线 SPI 接线如下:
| 0.96inch Transparent OLED | STM32F103ZET6 |
|---|---|
| VCC | 3.3 V |
| GND | GND |
| DIN | PA7 / SPI1_MOSI |
| CLK | PA5 / SPI1_SCK |
| CS | PA4 |
| DC | PA3 |
| RST | PA2 |
| EN | 不连接 |
模块的 EN 引脚默认开启,本示例未使用该引脚。OLED 只接收 SPI 数据,因此无需连接 MISO。完成接线后,使用 ST-Link 连接开发板的 SWD 接口,其中 SWDIO 对应 PA13,SWCLK 对应 PA14,同时连接 3.3 V 和 GND。
如需使用 I2C,请先将 OLED 模块的硬件接口焊点切换至 I2C,再按下表接线:
| 0.96inch Transparent OLED | STM32F103ZET6 |
|---|---|
| VCC | 3.3 V |
| GND | GND |
| DIN / SDA | PB7 / I2C1_SDA |
| CLK / SCL | PB6 / I2C1_SCL |
| RST | PA2 |
| EN | 不连接 |
同时修改 App/Inc/oled_config.h,确保只启用一个通信接口:
#define OLED_USE_SPI 0
#define OLED_USE_I2C 1
I2C 的 SCL 和 SDA 需要上拉电阻;如果模块未集成上拉电阻,需要外接合适的上拉电阻。
代码分析
main():初始化 HAL、72 MHz 系统时钟、GPIO、SPI1 和 I2C1,随后调用OLED_Init()初始化屏幕。初始化失败时进入Error_Handler(),成功后运行当前选择的演示程序。OLED_Init():通过 PA2 对 OLED 进行硬件复位,发送 SSD1312 初始化命令,清除显示 RAM 后开启显示。OLED_Show():将 128 × 64 帧缓冲区分成 8 页写入 OLED,每页传输 128 字节显示数据。OLED_Pixel()、OLED_Line()、OLED_Rect()和OLED_Circle():在帧缓冲区中绘制基本图形;绘制完成后调用OLED_Show()才会更新到屏幕。OLED_ShowString()、OLED_DrawChinese()和OLED_DrawBitmap():分别用于显示英文字符串、中文点阵字符和 BMP 点阵图。OLED_DemoRun():循环显示英文Waveshare、中文“微雪”、BMP 点阵图、夜景线稿和仪表盘点阵图。Cube_DemoRun():对立方体的 8 个顶点进行旋转和透视投影,再使用 12 条边绘制连续旋转的线框立方体。
OLED_DemoRun() 和 Cube_DemoRun() 内部均为持续运行的循环,因此每次只能选择其中一个。在 Core/Src/main.c 中保留需要运行的函数,并注释另一个函数:
OLED_DemoRun();
/* Cube_DemoRun(); */
如需运行旋转立方体示例,修改为:
/* OLED_DemoRun(); */
Cube_DemoRun();
编译和运行
- 安装 Keil MDK 5,并在 Pack Installer 中安装
Keil::STM32F1xx_DFP2.3.0 或更新版本。工程当前配置使用 Arm Compiler 5。 - 打开
MDK-ARM/Transparent_STM32F103ZE.uvprojx。 - 单击 Build 或按
F7编译工程。编译成功后会在MDK-ARM/Objects目录生成Transparent_STM32F103ZE.hex。 - 在 Options for Target → Debug 中选择 ST-Link Debugger,然后单击 Download 将程序烧录到开发板。
- 烧录完成后复位或重新上电,OLED 即开始运行演示程序。
工程默认按 8 MHz 外部晶振配置。如果开发板使用其他频率的晶振,需要相应修改 Core/Src/main.c 中的 SystemClock_Config()。
运行效果
默认程序启动后,OLED 按以下顺序循环显示:
| 顺序 | 显示内容 | 保持时间 |
|---|---|---|
| 1 | 英文 Waveshare | 2 秒 |
| 2 | 中文“微雪” | 2 秒 |
| 3 | 内置 128 × 64 BMP 点阵图 | 2 秒 |
| 4 | 星星、月牙、山峰和松树线稿 | 3 秒 |
| 5 | 内置 128 × 64 仪表盘点阵图 | 5 秒 |

切换为 Cube_DemoRun() 后,OLED 持续显示绕竖直方向旋转的线框立方体,程序每 20 ms 绘制并刷新一帧。