阿拉尔市网站建设_网站建设公司_留言板_seo优化
2025/12/25 0:57:26 网站建设 项目流程

让小屏幕大放异彩:STM32驱动ST7735实战全解析

你有没有遇到过这样的项目需求——设备要小巧、功耗要低,还得带个彩色显示屏?在物联网终端、智能仪表或教学开发板中,这几乎是标配。但高分辨率大屏成本高、耗电快、引脚资源吃紧,怎么办?

答案就藏在一个不起眼的芯片里:ST7735

这款TFT-LCD驱动IC,体积小、接口灵活、价格亲民,搭配几乎人手一块的STM32,就能轻松点亮一块1.8英寸的彩屏。别看它分辨率只有160×128,RGB565下照样能显示65K色,图标、文字、波形图统统不在话下。

今天我们就抛开花哨理论,从工程实践出发,手把手带你搞定“STM32 + ST7735”这对黄金组合,讲清楚每一个关键点:为什么选它?怎么接线?如何初始化?代码怎么写?常见坑有哪些?一文打通全流程。


为什么是ST7735?不是ILI9341或其他?

市面上能用的LCD驱动不少,比如大名鼎鼎的ILI9341(常用于2.4寸屏),但如果你做的产品追求紧凑、省电、低成本,那ST7735往往是更合适的选择。

我们不妨直接对比一下:

特性ST7735ILI9341
典型分辨率160×128(最大132×162)320×240
主要接口四线SPI为主并行8/16位为主
引脚占用极少(SPI+3控制线)多达16+根IO
功耗水平更低,支持多种睡眠模式相对较高
成本模组价格普遍低于20元多在30元以上
开发难度简单,社区驱动丰富稍复杂,需更多硬件资源

看到区别了吗?
ILI9341适合需要高清显示的HMI面板;而ST7735则是为资源受限场景量身定制的轻量级选手

尤其是在使用像STM32F103C8T6这种GPIO紧张、没有FSMC外设的小容量MCU时,靠硬件SPI就能驱动的ST7735简直是救星。


它是怎么工作的?三层机制拆解

别被数据手册吓到,其实ST7735的工作逻辑非常清晰,可以分成三个层次来理解:

第一层:接口层 —— MCU和芯片之间的“对话语言”

你通过SPI总线给ST7735发数据,但它怎么知道你是想设置参数还是写像素?这就靠一个关键信号:DC(Data/Command)引脚

  • DC = 低电平 → 当前传输的是命令(如“开始写显存”)
  • DC = 高电平 → 当前传输的是数据(如颜色值)

再加上CS(片选)、SCK(时钟)、MOSI(数据输出),以及RES(复位),一共就5~6根线,就能完全掌控这块屏幕。

小贴士:ST7735支持SPI Mode 0 和 Mode 3,具体用哪种要看模块设计。多数国产模组默认是Mode 0(CPOL=0, CPHA=0),也就是上升沿采样。

第二层:控制层 —— 命令解析与寄存器配置

每次你发送一条命令(比如0x3A),ST7735内部的状态机会识别它,并进入对应的操作流程。例如:
-0x11:退出睡眠模式
-0x2C:开始向GRAM写入像素数据
-0x2A/0x2B:设置列地址和行地址范围

这些命令背后其实是对一系列寄存器的配置。比如0x3A后面跟一个0x05,表示启用16位RGB565格式。

整个初始化过程就是按顺序“喂”一组命令+参数的过程,有点像老式打印机的指令集。

第三层:显示层 —— 显存到像素的映射

ST7735内置了GRAM(Graphic RAM),大小刚好容纳132×162×18bpp的数据,但我们通常只使用其中的160×128区域。

当你调用Memory Write (0x2C)后,后续所有数据都会自动写入当前设定的地址窗口中,然后由驱动电路逐行扫描输出到LCD面板上。

刷新原理很简单:CPU把图像数据塞进GRAM → 屏幕自动从GRAM读取并显示 → 实现视觉上的连续画面。


STM32怎么驱动它?软硬结合实战

现在主角登场:STM32

我们以最常见的STM32F103C8T6为例(蓝丸开发板),来看看如何用硬件SPI高效驱动ST7735。

硬件连接一览

ST7735引脚连接到STM32说明
SCLPA5 (SPI1_SCK)SPI时钟
SDAPA7 (SPI1_MOSI)主机发送,从机接收
RESPA6复位,低电平有效
DCPA5数据/命令选择
CSPA4片选,低电平使能
VCC / GND3.3V / GND注意共地!
BLKPB1 (可选)背光控制,可用于PWM调光

⚠️ 提醒:部分模块使用5V供电逻辑,务必确认是否电平兼容。若非3.3V耐受,请加电平转换或选用3.3V版本模组。

初始化前的准备:SPI配置要点

在CubeMX中配置SPI1为主机模式,关键参数如下:

  • 模式:Full-Duplex Master
  • Clock Polarity:Low (Mode 0)
  • Clock Phase:1 Edge (Mode 0)
  • Baud Rate Prescaler:建议初始调试设为fPCLK/64(约360kHz),稳定后再提至/4(约7.2MHz)
  • Data Size:8 bits
  • NSS:Software(手动控制CS)
  • First Bit:MSB First

同时将CS、DC、RES引脚设为推挽输出,并开启高速模式(High Speed GPIO)以保证时序准确。


核心驱动代码:从零封装一套可用API

下面这段代码是你驱动ST7735的基础骨架,基于HAL库编写,结构清晰、易于移植。

#include "stm32f1xx_hal.h" // 引脚定义 #define ST7735_CS_LOW() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET) #define ST7735_CS_HIGH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET) #define ST7735_DC_CMD() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET) #define ST7735_DC_DATA() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) #define ST7735_RST_LOW() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET) #define ST7735_RST_HIGH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET) extern SPI_HandleTypeDef hspi1; // 发送命令 void ST7735_WriteCmd(uint8_t cmd) { ST7735_CS_LOW(); ST7735_DC_CMD(); HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY); ST7735_CS_HIGH(); } // 发送单字节数据 void ST7735_WriteData(uint8_t data) { ST7735_CS_LOW(); ST7735_DC_DATA(); HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY); ST7735_CS_HIGH(); } // 批量发送数据(用于刷屏) void ST7735_WriteBuffer(uint8_t *buffer, size_t len) { ST7735_CS_LOW(); ST7735_DC_DATA(); HAL_SPI_Transmit(&hspi1, buffer, len, HAL_MAX_DELAY); ST7735_CS_HIGH(); }

有了这三个基本函数,就可以开始构建更高阶的功能了。

设置显示区域:绘图的前提

要在屏幕上画东西,必须先告诉ST7735:“我要往哪块区域写数据”。这就是地址窗口(Address Window)的作用。

void ST7735_SetAddressWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) { ST7735_WriteCmd(0x2A); // Column Address Set ST7735_WriteData(0x00); ST7735_WriteData(x0 + 2); // X偏移修正(常见于某些模组) ST7735_WriteData(0x00); ST7735_WriteData(x1 + 2); ST7735_WriteCmd(0x2B); // Page Address Set ST7735_WriteData(0x00); ST7735_WriteData(y0 + 1); ST7735_WriteData(0x00); ST7735_WriteData(y1 + 1); ST7735_WriteCmd(0x2C); // Memory Write }

🔍 注意:不同厂商的ST7735模组可能存在X/Y偏移差异。有的需要+2,有的+0,务必根据实际显示效果调整。否则会出现边缘裁剪或错位。

最重要的一步:初始化序列

这是最容易出问题的地方。很多开发者照搬网上代码却无法点亮屏幕,原因就在于初始化顺序不对,或者遗漏关键步骤。

以下是经过验证的精简初始化流程:

void ST7735_Init(void) { HAL_Delay(10); ST7735_RST_LOW(); HAL_Delay(10); ST7735_RST_HIGH(); HAL_Delay(120); ST7735_WriteCmd(0x11); // Sleep Out HAL_Delay(120); ST7735_WriteCmd(0x3A); // COLMOD: 设置颜色格式 ST7735_WriteData(0x05); // 16-bit RGB565 ST7735_WriteCmd(0x36); // MADCTL: 拉伸方向控制 ST7735_WriteData(0xC0); // 上下翻转(适配常规视角) ST7735_WriteCmd(0x21); // INVON - 开启显示反转(让颜色更自然) ST7735_WriteCmd(0x13); // Normal Display On // 可选:Gamma校正、电源参数等(视模组而定) ST7735_WriteCmd(0x29); // Display ON }

📌重点提醒
-0x11之后必须延时足够长时间(≥120ms)
-0x3A必须紧跟0x05,否则颜色异常
-0x29才是最终开启显示的关键命令


如何提升性能?别让SPI拖后腿

你以为初始化完就万事大吉?不,真正的挑战才刚开始。

问题来了:刷新太慢,动画卡成PPT?

是的,这是ST7735最常见的痛点。160×128 × 2 Byte =40KB显存,如果SPI跑在1MHz,全屏刷新一次就得40ms以上,帧率不到25fps,动起来明显卡顿。

怎么办?三条路:

✅ 方法一:提高SPI时钟频率

ST7735官方支持最高36MHz SPI,STM32F1 APB2最高72MHz,完全可以做到18MHz甚至36MHz(分频系数设为2)。

修改SPI配置:

hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; // fPCLK/2 = 36MHz

实测结果:全屏刷新时间可压缩至~2.2ms,理论帧率达400fps(受限于其他处理时间,实际可达60fps流畅动画)!

✅ 方法二:启用DMA传输(高端型号推荐)

对于STM32F4/F7/H7等带DMA的型号,可以用DMA代替CPU轮询发送大量GRAM数据。

好处:
- CPU解放出来做别的事
- 数据传输更稳定,避免中断打断导致花屏

示例伪代码:

HAL_SPI_Transmit_DMA(&hspi1, pixel_buffer, 40000);

配合双缓冲机制,甚至可以实现无缝翻页。

✅ 方法三:局部刷新 + 差异更新

大多数情况下不需要重绘整个屏幕。比如只改了一个数字、弹了个提示框,完全可以只刷那一小块区域。

// 只刷新状态栏(顶部20行) ST7735_SetAddressWindow(0, 0, 159, 19); ST7735_WriteBuffer(status_bar_fb, 160*20*2);

这一招能让平均刷新时间下降80%以上。


常见问题与避坑指南

❌ 屏幕花屏、乱码、闪屏?

  • 检查SPI速率是否过高→ 先降到10MHz试试
  • 确认DC引脚连接正确→ 接反会导致命令数据混淆
  • 查看是否有X/Y偏移未补偿→ 尝试±1~2像素调整
  • 电源不稳定→ 加0.1μF陶瓷电容靠近VDD引脚

❌ 颜色发白、偏绿、像蒙了一层雾?

  • 检查是否设置了正确的颜色模式:0x3A+0x05
  • 是否误启用了18位模式(0x06)?
  • RGB565字节顺序是否正确?有些库需要高低字节交换

❌ 背光亮但无显示?

  • 确认已发送0x29开启显示
  • 检查是否还在Sleep In状态(未执行0x11
  • 查看GRAM是否真的写入了非零数据

❌ 功耗居高不下?

  • 背光常亮占大头!建议用PWM调节亮度(PB1接BLK)
  • 闲置时发送0x10进入Sleep Mode,唤醒后再发0x11
  • 关闭未使用的外设时钟

设计建议:不只是点亮,更要可靠耐用

PCB布局要点

  • SPI走线尽量短且平行,远离高频信号线
  • VCC加滤波电容(1μF钽电容 + 0.1μF瓷片电容)
  • 若有AVDD引脚,单独走线并加磁珠隔离
  • 使用排针连接时,建议加上拉电阻(10kΩ)增强稳定性

内存管理策略

  • 全缓冲方案:需40KB SRAM,适合F4及以上
  • 半缓冲/无缓冲:边生成边发送,节省内存但CPU负载高
  • 字体/图标预存在Flash,采用RLE压缩减少占用

可靠性增强

  • 添加看门狗监控GUI任务
  • 初始化失败时尝试最多3次重试
  • 在Bootloader中保留最小显示功能,便于调试

结语:小屏幕也有大舞台

回过头看,ST7735或许不是最强的LCD驱动芯片,但它绝对是最适合入门者和中小型项目的那一款。

配合STM32,你可以用极低的成本构建出具备完整图形交互能力的嵌入式系统——无论是环境监测仪、迷你示波器、智能手表原型,还是学生实验平台,都能胜任。

更重要的是,这个组合教会我们一个道理:不是所有问题都需要“高性能”来解决,有时候,“刚刚好”才是最优解。

当你第一次亲手让一个小方块在屏幕上移动,当第一个中文字符成功显示,那种成就感,远超复制粘贴别人的库所能带来的。

所以,别再犹豫了。找一块ST7735模组,插上你的STM32,动手试试吧。

如果你在实现过程中遇到了其他挑战,欢迎在评论区分享讨论。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询