ST7789 驱动与 STM32 应用开发指南:从准备到实战
一、准备篇:认识 ST7789 与 STM32 显示驱动项目
1.1 项目功能模块解析
ST7789-STM32 项目是一套专为 STM32 微控制器设计的显示驱动方案,核心由两大功能模块组成:
显示驱动核心模块(st7789.c/h)
- 初始化引擎:负责显示器硬件参数配置与启动流程
- 图形绘制系统:提供点、线、矩形等基础图形绘制功能
- 数据传输层:支持 SPI 接口的常规传输与 DMA 加速模式
字体渲染模块(fonts.c/h)
- 字体库:内置 7x10、11x18、16x26 三种分辨率字体
- 文本渲染器:实现字符与字符串的显示控制
- 颜色系统:采用 RGB565 色彩模式,提供 65536 种颜色支持
📌 注意事项:项目中的 fig 目录包含 SPI 配置示意图和数据传输波形图,建议在硬件连接时参考。
1.2 环境搭建指南
开始使用前,请确保你的开发环境满足以下条件:
-
硬件要求
- STM32 系列微控制器(推荐 STM32F103 及以上型号)
- ST7789 控制器的 IPS 显示屏(支持 135x240/240x240/170x320 分辨率)
- SPI 接口连接(至少需要 SCK、SDA、DC、RST 四根信号线)
-
软件环境
- STM32CubeMX/CubeIDE 或其他 STM32 开发环境
- HAL 库支持(项目基于 HAL 库开发)
-
项目获取
git clone https://gitcode.com/gh_mirrors/st/ST7789-STM32
1.3 新手常见问题
Q: 项目支持哪些型号的 STM32 芯片?
A: 理论上支持所有带硬件 SPI 的 STM32 型号,实际测试过 STM32F103、F407、L431 等系列。低容量型号(如 F103C8T6)使用 DMA 时需注意内存限制。
Q: 显示屏不亮可能是什么原因?
A: 首先检查 RST 复位信号是否正确释放,其次确认 SPI 时钟频率是否过高(杜邦线连接建议不超过 20MHz),最后检查背光控制引脚是否有效。
二、核心篇:ST7789 驱动的工作原理与应用
2.1 核心工作流程解析
ST7789 驱动的工作流程就像一场精密的"舞台表演",主要分为三个阶段:
初始化阶段:搭建舞台
void ST7789_Init(void) {
// 硬件复位序列
ST7789_RST_Clr(); // 拉低复位引脚
HAL_Delay(10); // 保持10ms
ST7789_RST_Set(); // 释放复位
// 初始化序列配置(相当于告诉显示器"我们要开始表演了")
ST7789_WriteCommand(ST7789_SWRESET); // 软件复位
HAL_Delay(120); // 等待复位完成
// 配置色彩模式为RGB565(16位色)
ST7789_WriteCommand(ST7789_COLMOD);
ST7789_WriteSmallData(ST7789_COLOR_MODE_16bit);
// 设置显示方向和分辨率(根据实际硬件配置)
ST7789_SetRotation(ST7789_ROTATION);
// 打开显示(灯光亮起,舞台就绪)
ST7789_WriteCommand(ST7789_DISPON);
}
数据传输阶段:数据演员登场
驱动与显示屏的通信通过 SPI 接口完成,就像舞台监督(MCU)向演员(显示屏)发送表演指令:
// 发送命令(告诉显示屏要做什么)
static void ST7789_WriteCommand(uint8_t cmd) {
ST7789_DC_Clr(); // DC引脚拉低表示发送命令
HAL_SPI_Transmit(&ST7789_SPI_PORT, &cmd, 1, HAL_MAX_DELAY);
}
// 发送数据(告诉显示屏具体内容)
static void ST7789_WriteData(uint8_t *buff, size_t buff_size) {
ST7789_DC_Set(); // DC引脚拉高表示发送数据
HAL_SPI_Transmit(&ST7789_SPI_PORT, buff, buff_size, HAL_MAX_DELAY);
}
图形绘制阶段:精彩表演呈现
所有的图形绘制都基于"设置显示窗口-填充颜色数据"的模式:
// 在指定位置画点(就像舞台上的一个演员站位)
void ST7789_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
ST7789_SetAddressWindow(x, y, x, y); // 设置1x1的显示窗口
uint8_t data[] = {color >> 8, color & 0xFF}; // RGB565颜色拆分
ST7789_WriteData(data, sizeof(data)); // 发送颜色数据
}
2.2 基础绘图功能详解
项目提供了丰富的图形绘制函数,可满足大多数应用场景:
像素级操作
ST7789_DrawPixel(x, y, color):绘制单个像素点ST7789_Fill(x1, y1, x2, y2, color):填充矩形区域
基础图形
ST7789_DrawLine(x1, y1, x2, y2, color):绘制直线(使用Bresenham算法)ST7789_DrawCircle(x0, y0, r, color):绘制圆形ST7789_DrawRectangle(x1, y1, x2, y2, color):绘制矩形边框
文本显示
ST7789_WriteChar(x, y, ch, font, color, bgcolor):显示单个字符ST7789_WriteString(x, y, str, font, color, bgcolor):显示字符串
📌 实用技巧:文本显示支持三种字体大小,建议根据屏幕分辨率选择:小字体(7x10)适合显示大量数据,中字体(11x18)适合标题,大字体(16x26)适合重点提示。
2.3 DMA 加速原理与应用
DMA 就像舞台的"后台助理",能帮助 CPU 处理数据传输,让主程序更流畅:
#ifdef USE_DMA
// DMA模式下的全屏填充(效率更高)
void ST7789_Fill_Color(uint16_t color) {
// 使用缓冲区分块传输,适合内存较小的MCU
for (i = 0; i < ST7789_HEIGHT / HOR_LEN; i++) {
memset(disp_buf, color, sizeof(disp_buf)); // 填充缓冲区
ST7789_WriteData(disp_buf, sizeof(disp_buf)); // DMA传输
}
}
#endif
DMA 与非 DMA 性能对比:
DMA模式下的数据传输波形,传输连续无间隔
📌 注意事项:启用 DMA 时,默认使用大小为 ST7789_WIDTH * 5 的缓冲区。如果你的 MCU RAM 不足(如 128KB 以下),建议减小 HOR_LEN 宏定义的值。
2.4 新手常见问题
Q: 为什么绘制图形时出现闪烁?
A: 这是因为没有使用"双缓冲"技术。对于动态界面,建议在内存中构建完整画面后一次性刷新,或使用局部刷新减少重绘区域。
Q: 如何提高文本显示速度?
A: 可以预先生成常用字符的字模数组,避免实时计算;或者使用更大的 DMA 缓冲区减少传输次数。项目中的 fonts.c 已经包含了优化后的字模数据。
三、拓展篇:个性化配置与高级应用
3.1 个性化配置指南
ST7789 驱动提供了丰富的配置选项,通过修改 st7789.h 文件可以定制显示效果:
分辨率与旋转配置
| 配置项 | 说明 | 应用场景 |
|---|---|---|
USING_240X240 |
240x240 分辨率 | 1.3英寸方形屏 |
USING_170X320 |
170x320 分辨率 | 1.9英寸长条形屏 |
ST7789_ROTATION 0 |
0度旋转 | 默认方向 |
ST7789_ROTATION 2 |
180度旋转 | 显示屏安装方向颠倒时 |
配置示例:
// 选择240x240分辨率,180度旋转
#define USING_240X240
#define ST7789_ROTATION 2
SPI 接口配置
// SPI实例选择(根据硬件连接修改)
#define ST7789_SPI_PORT hspi1
// SPI超时时间
#define SPI_TIMEOUT 1000
// 是否启用DMA(注释此行禁用DMA)
#define USE_DMA
颜色定义
项目预定义了常用颜色,也可以自定义颜色值(RGB565格式):
// 自定义天蓝色
#define SKYBLUE 0x84DD // RGB565格式:R=132, G=221, B=255
3.2 项目应用场景
ST7789-STM32 驱动可应用于多种嵌入式显示场景:
1. 数据监控终端
利用文本和简单图形显示传感器数据,如环境监测设备:
// 显示温度数据示例
ST7789_WriteString(10, 20, "Temperature:", Font_11x18, WHITE, BLACK);
char temp_str[10];
sprintf(temp_str, "%.1f C", temperature);
ST7789_WriteString(10, 40, temp_str, Font_16x26, GREEN, BLACK);
2. 小型游戏机
利用图形绘制功能实现简单游戏,如贪吃蛇:
// 绘制游戏元素
ST7789_DrawFilledCircle(snake_head.x, snake_head.y, 5, YELLOW); // 蛇头
for(i=0; i<food_count; i++) {
ST7789_DrawFilledCircle(food[i].x, food[i].y, 3, RED); // 食物
}
3. 界面交互系统
结合触摸功能(需额外硬件)实现图形界面,如小型控制面板:
// 绘制按钮
ST7789_DrawFilledRectangle(20, 100, 80, 40, BLUE); // 按钮背景
ST7789_WriteString(30, 110, "START", Font_11x18, WHITE, BLUE); // 按钮文本
3.3 性能优化建议
针对不同应用场景,可以从以下方面优化性能:
-
内存优化
- 小容量 MCU 禁用 DMA 功能,节省缓冲区内存
- 使用
ST7789_DrawImage()显示图片时,采用压缩格式并动态解压
-
速度优化
- 静态内容使用
ST7789_DrawImage()一次性绘制 - 动态内容只刷新变化区域,如:
// 局部刷新示例(只刷新温度数值区域) ST7789_Fill(120, 40, 220, 65, BLACK); // 清除旧数据 ST7789_WriteString(120, 40, temp_str, Font_16x26, GREEN, BLACK); // 写入新数据 - 静态内容使用
-
功耗优化
- 非活动时调用
ST7789_SLPIN()进入睡眠模式 - 降低 SPI 时钟频率(不影响显示质量的前提下)
- 非活动时调用
3.4 新手常见问题
Q: 如何显示自定义图片?
A: 可以使用 Image2Lcd 等工具将图片转换为 RGB565 格式的数组,然后通过 ST7789_DrawImage() 函数显示。注意图片尺寸不要超过屏幕分辨率。
Q: 显示屏出现条纹或花屏怎么办?
A: 检查 SPI 信号线是否过长或接触不良;尝试降低 SPI 时钟频率;确认 X_SHIFT 和 Y_SHIFT 参数是否适合你的显示屏(不同厂家的屏幕可能有偏移)。
Q: 如何实现屏幕局部刷新?
A: 使用 ST7789_SetAddressWindow(x1, y1, x2, y2) 函数设置显示窗口,然后只更新该区域的数据。这比全屏刷新效率更高,特别适合动态数据显示。
结语
通过本指南,你应该已经掌握了 ST7789-STM32 驱动的基本使用方法和高级技巧。这个项目虽然小巧,但功能强大,适合各种嵌入式显示应用。无论是制作数据监控设备、小型游戏机还是物联网终端,ST7789 驱动都能为你的项目提供清晰、高效的显示解决方案。
如果你在使用过程中发现新的应用场景或优化方法,欢迎贡献代码和经验!嵌入式开发的乐趣就在于不断探索和创新。
祝你的 STM32 显示项目开发顺利!
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
