news 2026/4/15 10:43:00

ST7789显示屏入门必看:手把手驱动配置教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ST7789显示屏入门必看:手把手驱动配置教程

一块小屏幕,如何点亮你的嵌入式项目?——ST7789驱动全解析

你有没有遇到过这样的场景:精心设计的电路板终于焊好了,STM32或树莓派Pico也烧录了代码,可那块小小的彩色LCD屏却死活不亮?要么黑屏、要么花屏,甚至只闪一下就没了……别急,这大概率不是硬件坏了,而是ST7789没被“唤醒”

作为目前最流行的Mini TFT控制器之一,ST7789凭借高分辨率、低功耗和高度集成的特性,已经成了无数DIY玩家和工程师心中的“标配屏”。但它的初始化流程却暗藏玄机——稍有疏忽,就会掉进“命令发错”、“时序不对”、“背光亮了画面黑”的坑里。

今天我们就抛开那些泛泛而谈的手册翻译,从实战角度出发,带你一步步搞懂ST7789 是怎么被驱动起来的,并告诉你为什么别人能轻松点亮,而你却总在调试路上打转。


一、先搞清楚:ST7789到底是个啥?

简单说,ST7789 就是给小型TFT屏幕“当管家”的芯片。它负责接收MCU发来的图像数据,然后指挥屏幕上的每一个像素点该显示什么颜色。

它不像OLED那样自发光,需要外部提供电源和背光,但它支持高达240×320 分辨率,色彩深度达65K色(RGB565),而且引脚少、功耗低,特别适合用在资源有限的嵌入式系统中。

它凭什么比别的驱动IC更受欢迎?

特性ST7789 实际表现
接口方式支持SPI / 并行 / RGB,SPI最常用
最高刷新速率在40MHz SPI下可达~30fps(240×240)
是否内置升压✅ 内部DC-DC,无需额外电荷泵
显示旋转通过寄存器一键切换0°/90°/180°/270°
初始化复杂度中等偏上,依赖正确时序

对比老前辈 ILI9341,ST7789 不仅速度更快,还省去了外接VCOM偏压电路的设计麻烦,BOM成本直接降了一截。


二、通信靠什么?SPI是怎么“说话”的

绝大多数情况下,我们都是用四线SPI来驱动 ST7789:

  • SCL(SCK):时钟线,由MCU主控输出
  • SDA(MOSI):数据线,传命令和图像
  • CS:片选,拉低才开始通信
  • DC:数据/命令选择,这是关键!
  • RST:复位引脚,建议保留

其中,DC 引脚决定了每个字节的意义
- DC = 0 → 当前传输的是命令
- DC = 1 → 当前传输的是参数或图像数据

举个例子,你想设置列地址范围(也就是告诉屏幕:“接下来我要往哪几列写东西”),就得先发一个命令0x2A(CASET),这时 DC 要为低;紧接着发送4个参数字节表示起始和结束列号,这时候 DC 就得切到高。

整个过程就像对讲机喊话:

“喂!注意听!我现在要说的是‘指令’!”
➜ 发送0x2A
“现在我说的是‘参数’!”
➜ 发送0x00, 0x00, 0x00, 0xEF

如果 DC 搞反了,屏幕就会把命令当成数据处理,结果就是——乱码、花屏、无响应。


SPI模式必须设成 Mode 3!

这是很多人踩过的坑。ST7789 默认工作在CPOL=1, CPHA=1的SPI模式,也就是:

  • 空闲时 SCK 为高电平(CPOL=1)
  • 数据在上升沿采样(CPHA=1)

如果你用的是Arduino、STM32 HAL库或者ESP-IDF,请务必确认SPI配置如下:

hspi->Init.CLKPolarity = SPI_POLARITY_HIGH; // CPOL = 1 hspi->Init.CLKPhase = SPI_PHASE_2EDGE; // CPHA = 1

否则即使连线都对,也可能收不到任何回应。


三、点亮第一步:初始化序列不能乱

你以为上电就能看到画面?太天真了。ST7789 上电后处于睡眠状态,必须经历一套精确的“唤醒仪式”,才能正常工作。

这个过程大致分为三步:

  1. 软件复位(SWRESET)
  2. 退出睡眠(SLPOUT)
  3. 配置显示参数(方向、色深、窗口等)

下面这段初始化代码,几乎是所有ST7789驱动的核心骨架:

void ST7789_Init(void) { HAL_Delay(120); // 上电稳定 ST7789_WriteCmd(0x01); // 软件复位 HAL_Delay(150); ST7789_WriteCmd(0x11); // 退出睡眠 HAL_Delay(120); // 设置色彩格式为16位(RGB565) ST7789_WriteCmd(0x3A); uint8_t color_mode = 0x55; ST7789_WriteData(&color_mode, 1); // 设置显示方向(横屏+BGR顺序) ST7789_WriteCmd(0x36); uint8_t madctl = 0x08; ST7789_WriteData(&madctl, 1); // 设置列地址范围 (0~239) ST7789_WriteCmd(0x2A); uint8_t caset[4] = {0x00, 0x00, 0x00, 0xEF}; ST7789_WriteData(caset, 4); // 设置行地址范围 (0~319) ST7789_WriteCmd(0x2B); uint8_t raset[4] = {0x00, 0x00, 0x01, 0x3F}; ST7789_WriteData(raset, 4); ST7789_WriteCmd(0x29); // 开启显示 HAL_Delay(20); }

关键点解析:

  • 延时不可省SLPOUT后必须等待至少120ms,让内部稳压电路建立。
  • RGB565 格式要用 0x55:这是文档规定的值,不是随便写的。
  • MADCTL 寄存器决定方向0x08表示 MV=1(行列交换),BGR=1(使用BGR顺序)。
  • 地址高位在前:虽然是小端CPU,但ST7789要求大端格式传输地址。

⚠️ 常见错误:有人把raset写成{0, 0, 0xFF, 0},导致行数溢出,屏幕下半部分错乱。


四、画图之前,先学会“圈地”

ST7789 内部有一块叫 GRAM(Graphic RAM)的内存区域,用来存放当前要显示的图像数据。你要想改某个位置的颜色,不能直接往坐标(x,y)写,而是要先划定一个“矩形区域”,然后向这个区域内连续写入像素数据。

这就是所谓的地址窗口机制(Address Window)

比如我们要在 (50,60) 处画一个红色像素(0xF800),步骤如下:

  1. 调用setAddrWindow(50, 60, 1, 1)设定目标区域
  2. 发送RAMWR (0x2C)命令,准备写入GRAM
  3. 连续发送两个字节:0xF8,0x00

对应的函数实现:

void setAddrWindow(uint8_t x, uint8_t y, uint8_t w, uint8_t h) { writeCommand(ST7789_CASET); writeData(0x00); writeData(x); writeData(0x00); writeData(x + w - 1); writeCommand(ST7789_RASET); writeData(0x00); writeData(y); writeData(0x00); writeData(y + h - 1); } void drawPixel(int16_t x, int16_t y, uint16_t color) { if (x < 0 || x >= 240 || y < 0 || y >= 320) return; setAddrWindow(x, y, 1, 1); writeCommand(ST7789_RAMWR); writeData(color >> 8); writeData(color & 0xFF); }

⚠️ 注意:频繁调用drawPixel效率极低!每画一个点都要发一堆命令。实际开发中应尽量批量写入,例如一次性刷满一整行或整个缓冲区。


五、调试翻车现场:这些问题你肯定遇见过

❌ 屏幕全黑,背光也不亮?

检查以下几点:
-LED_A 或 LED_K 引脚是否接了电源?
- 很多模块的背光是独立供电的,VCC ≠ 背光!
-RST 是否一直处于低电平?
- 如果RST被拉死,芯片永远无法启动。
-电源电压是否达标?
- ST7789 IO电压支持1.8V~3.3V,但低于2.5V可能导致通信异常。

建议做法:单独给模块供电,并用万用表测各引脚电压。


❌ 花屏、条纹、颜色错乱?

典型症状:文字扭曲、彩虹条滚动、局部乱码。

可能原因:
-D/C 控制错误:命令和数据混在一起发了
-字节顺序颠倒:RGB565 高低位传反了
-未启用BGR交换:硬件是BGR排列,但软件按RGB生成颜色

解决方法:
- 使用逻辑分析仪抓SPI波形,看命令帧是否正确
- 检查MADCTL是否设置了 BGR bit(bit 3)
- 确保发送颜色时高位字节先发


❌ 刷新卡顿,动画像幻灯片?

根本问题:传输效率太低

常见误区:
- 逐点调用drawPixel
- SPI频率只有8MHz
- 没使用DMA或硬件加速

优化策略:
- 提升SPI到40MHz以上
- 使用DMA传输图像块
- 实现局部刷新,避免每次重绘全屏
- 引入双缓冲机制,减少撕裂感

实测数据显示,在STM37F4上使用DMA+40MHz SPI,240×240全屏刷新可达28fps,足够跑简单UI动画。


六、工程级设计建议:不只是点亮就行

当你从“能不能亮”过渡到“怎么做得更好”,就需要考虑一些系统级设计问题了。

1. 电源设计要干净

  • VCC 推荐使用LDO供电,纹波控制在30mV以内
  • 背光可单独通过MOSFET控制,实现亮度调节
  • 添加0.1μF去耦电容靠近VCC引脚

2. PCB布线要注意

  • SPI信号线尽量短,远离PWM、电机等干扰源
  • 必要时串联1kΩ电阻抑制振铃
  • CS线不宜过长,防止误触发

3. 复位引脚别省

虽然可以用软件复位,但保留RST引脚可以在固件升级或异常时强制重启屏幕,提升稳定性。

4. 加入节能模式

空闲时发送SLPIN命令进入睡眠,唤醒时再重新初始化,这对电池设备至关重要。


七、结语:掌握底层,才能驾驭更高阶的GUI

你现在看到的LVGL、TouchGFX、emWin这些炫酷界面框架,底层其实都在做同一件事:跟ST7789这类控制器打交道

理解了初始化流程、SPI通信规则、GRAM写入机制,你就不再是一个只会调库的“搬运工”,而是真正掌握了显示系统的主动权。

下次当你面对一块新屏幕时,不会再问“有没有现成库”,而是会思考:

“它的通信方式是什么?”
“初始化序列该怎么写?”
“如何最快地把图像推上去?”

这才是嵌入式开发的乐趣所在。

如果你正在做一个带屏项目,不妨试试亲手写一遍初始化代码,哪怕只是点亮一个红点。那种“我让它动了”的成就感,远比复制粘贴来得真实。


💬互动时间:你在驱动ST7789时遇到过哪些奇葩问题?欢迎留言分享你的“踩坑日记”,我们一起排雷!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 7:30:16

cv_unet_image-matting支持哪些格式?JPG/PNG/WebP兼容性测试报告

cv_unet_image-matting支持哪些格式&#xff1f;JPG/PNG/WebP兼容性测试报告 1. 引言 1.1 项目背景与使用场景 随着AI图像处理技术的普及&#xff0c;自动化图像抠图已成为设计、电商、社交媒体等多个领域的刚需。cv_unet_image-matting 是一款基于U-Net架构的智能图像抠图工…

作者头像 李华
网站建设 2026/4/15 10:43:00

图片旋转判断模型RESTful接口开发实战

图片旋转判断模型RESTful接口开发实战 1. 引言 1.1 业务场景描述 在实际的图像处理系统中&#xff0c;图片的方向问题是一个常见但容易被忽视的技术痛点。尤其是在移动端用户上传照片、扫描文档或OCR识别等场景下&#xff0c;由于设备拍摄角度不同&#xff0c;图片可能以0、…

作者头像 李华
网站建设 2026/4/15 10:43:00

1.5B参数小钢炮:DeepSeek-R1-Distill-Qwen-1.5B部署全攻略

1.5B参数小钢炮&#xff1a;DeepSeek-R1-Distill-Qwen-1.5B部署全攻略 1. 技术背景与选型价值 在当前大模型快速发展的背景下&#xff0c;如何在资源受限的设备上实现高效、高质量的推理能力&#xff0c;成为边缘计算、嵌入式AI和本地化服务的关键挑战。传统大模型虽然性能强…

作者头像 李华
网站建设 2026/4/14 5:24:39

AI应用落地实操:Qwen3-4B-Instruct-2507企业知识库构建案例

AI应用落地实操&#xff1a;Qwen3-4B-Instruct-2507企业知识库构建案例 1. 引言&#xff1a;AI驱动的企业知识管理新范式 随着大模型技术的快速发展&#xff0c;企业对智能化知识管理的需求日益增长。传统知识库系统普遍存在信息检索不准、语义理解弱、交互体验差等问题&…

作者头像 李华
网站建设 2026/4/13 16:12:34

YOLOv13+Flask部署:API服务1小时上线

YOLOv13Flask部署&#xff1a;API服务1小时上线 你是不是也遇到过这样的场景&#xff1f;作为全栈开发者&#xff0c;项目里突然需要加入一个“智能识别图片中物体”的功能——比如上传一张照片&#xff0c;自动标出里面的人、车、狗、卡车甚至“黄色的工程车”。你第一时间想…

作者头像 李华
网站建设 2026/4/13 17:21:52

YOLOE官版镜像在智能安防中的实际应用案例

YOLOE官版镜像在智能安防中的实际应用案例 随着城市化进程加快和公共安全需求提升&#xff0c;智能安防系统正从“看得见”向“看得懂”演进。传统监控系统依赖人工回看录像或基于固定类别目标的检测模型&#xff0c;难以应对复杂多变的安全场景。而开放词汇表&#xff08;Ope…

作者头像 李华