首页
/ ST7789 驱动与 STM32 应用开发指南:从准备到实战

ST7789 驱动与 STM32 应用开发指南:从准备到实战

2026-02-06 05:40:59作者:羿妍玫Ivan

一、准备篇:认识 ST7789 与 STM32 显示驱动项目

1.1 项目功能模块解析

ST7789-STM32 项目是一套专为 STM32 微控制器设计的显示驱动方案,核心由两大功能模块组成:

显示驱动核心模块(st7789.c/h)

  • 初始化引擎:负责显示器硬件参数配置与启动流程
  • 图形绘制系统:提供点、线、矩形等基础图形绘制功能
  • 数据传输层:支持 SPI 接口的常规传输与 DMA 加速模式

字体渲染模块(fonts.c/h)

  • 字体库:内置 7x10、11x18、16x26 三种分辨率字体
  • 文本渲染器:实现字符与字符串的显示控制
  • 颜色系统:采用 RGB565 色彩模式,提供 65536 种颜色支持

📌 注意事项:项目中的 fig 目录包含 SPI 配置示意图和数据传输波形图,建议在硬件连接时参考。

1.2 环境搭建指南

开始使用前,请确保你的开发环境满足以下条件:

  1. 硬件要求

    • STM32 系列微控制器(推荐 STM32F103 及以上型号)
    • ST7789 控制器的 IPS 显示屏(支持 135x240/240x240/170x320 分辨率)
    • SPI 接口连接(至少需要 SCK、SDA、DC、RST 四根信号线)
  2. 软件环境

    • STM32CubeMX/CubeIDE 或其他 STM32 开发环境
    • HAL 库支持(项目基于 HAL 库开发)
  3. 项目获取

    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模式下的数据传输波形,传输连续无间隔

普通填充效果 非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 性能优化建议

针对不同应用场景,可以从以下方面优化性能:

  1. 内存优化

    • 小容量 MCU 禁用 DMA 功能,节省缓冲区内存
    • 使用 ST7789_DrawImage() 显示图片时,采用压缩格式并动态解压
  2. 速度优化

    • 静态内容使用 ST7789_DrawImage() 一次性绘制
    • 动态内容只刷新变化区域,如:
    // 局部刷新示例(只刷新温度数值区域)
    ST7789_Fill(120, 40, 220, 65, BLACK);  // 清除旧数据
    ST7789_WriteString(120, 40, temp_str, Font_16x26, GREEN, BLACK);  // 写入新数据
    
  3. 功耗优化

    • 非活动时调用 ST7789_SLPIN() 进入睡眠模式
    • 降低 SPI 时钟频率(不影响显示质量的前提下)

3.4 新手常见问题

Q: 如何显示自定义图片?
A: 可以使用 Image2Lcd 等工具将图片转换为 RGB565 格式的数组,然后通过 ST7789_DrawImage() 函数显示。注意图片尺寸不要超过屏幕分辨率。

Q: 显示屏出现条纹或花屏怎么办?
A: 检查 SPI 信号线是否过长或接触不良;尝试降低 SPI 时钟频率;确认 X_SHIFTY_SHIFT 参数是否适合你的显示屏(不同厂家的屏幕可能有偏移)。

Q: 如何实现屏幕局部刷新?
A: 使用 ST7789_SetAddressWindow(x1, y1, x2, y2) 函数设置显示窗口,然后只更新该区域的数据。这比全屏刷新效率更高,特别适合动态数据显示。

结语

通过本指南,你应该已经掌握了 ST7789-STM32 驱动的基本使用方法和高级技巧。这个项目虽然小巧,但功能强大,适合各种嵌入式显示应用。无论是制作数据监控设备、小型游戏机还是物联网终端,ST7789 驱动都能为你的项目提供清晰、高效的显示解决方案。

如果你在使用过程中发现新的应用场景或优化方法,欢迎贡献代码和经验!嵌入式开发的乐趣就在于不断探索和创新。

祝你的 STM32 显示项目开发顺利!

登录后查看全文
热门项目推荐
相关项目推荐