news 2026/6/19 19:30:50

STM32CubeMX配置ST7735:实战案例详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32CubeMX配置ST7735:实战案例详解

STM32驱动ST7735实战:从零点亮一块1.8寸彩屏

你有没有遇到过这样的情况?手头有一块1.8寸的TFT彩屏,标着“ST7735”,买回来插上STM32却死活点不亮——要么全白、要么花屏、要么干脆黑屏。别急,这几乎是每个嵌入式开发者都会踩的坑。

今天我们就来彻底解决这个问题。不是简单贴代码,而是带你一步步搞懂原理、配对时序、写出稳定驱动,最终用STM32CubeMX+HAL库,把这块小屏幕真正“驯服”。


为什么是ST7735?

在众多TFT控制器中,ST7735是个特别的存在。它不像ILI9341那样功能复杂,也不像SSD1351主打OLED,它的定位非常清晰:为1.8英寸及以下的小尺寸彩屏提供低成本、低功耗、易集成的显示方案

这类屏幕常见于:
- 智能手表原型
- WiFi天气站
- 手持测试仪
- 学生机/教学套件

分辨率通常是128×160像素,支持RGB565格式(65K色),通过SPI接口与主控通信。最关键的是——它便宜!很多模块十几块钱就能买到。

但便宜不代表简单。如果你只是照搬网上的驱动代码,大概率会翻车。因为不同厂商的模块,初始化序列、引脚定义、甚至颜色顺序都可能不一样。

那怎么办?答案就是:掌握底层逻辑 + 使用STM32CubeMX精准配置


硬件连接:别小看这几根线

我们先来看最基础的硬件连接。假设你用的是STM32F103C8T6(蓝 pill 板),搭配一个典型的ST7735模块,接线如下:

STM32ST7735模块功能说明
PA5 (SCK)SCL / SCKSPI时钟
PA7 (MOSI)SDA / MOSI数据输出
PA4DC数据/命令选择
PA6CS片选(低有效)
PB1RST复位(低有效)
3.3VVCC, LED电源和背光
GNDGND共地

⚠️ 注意:有些模块标注的是“SDA”而不是“MOSI”,其实是一回事;还有些模块需要额外供电给LED背光,记得检查。

这里的关键是DC引脚——它是命令和数据的“开关”。当DC=0时,传输的是控制命令(比如清屏、旋转屏幕);当DC=1时,传的就是像素数据了。


STM32CubeMX怎么配?这才是重点

很多人失败的第一步,就出在SPI配置上。我们打开STM32CubeMX,新建工程,选择你的MCU型号(如STM32F103C8),然后开始配置。

✅ 正确配置SPI1(或其他SPI)

进入Pinout & Configuration页面,启用SPI1,设置为主机模式(Master),关键参数如下:

参数推荐值说明
ModeFull Duplex Master单向传输也够用,但默认即可
Hardware NSS SignalDisabled我们自己用GPIO控制CS
Baud Rate Prescalerfpclk / 16初始建议不要太快,避免时序问题
Clock PolarityLow空闲时SCK为低电平
Clock Phase1 Edge第一个上升沿采样 → 实际是SPI Mode 0
Frame FormatMotorola标准SPI格式
Data Size8 bits每次发一个字节

📌划重点:虽然HAL库里写的是CPHA = SPI_PHASE_1EDGE,但这对应的是Mode 0(CPOL=0, CPHA=0),也就是大多数ST7735模块要求的SPI模式!

如果你不确定模块支持哪种模式,优先尝试 Mode 0。

✅ 配置控制引脚(GPIO)

除了SPI,你还得手动分配几个GPIO用于控制:

  • TFT_DC→ PA4 → 输出推挽
  • TFT_CS→ PA6 → 输出推挽(初始高)
  • TFT_RST→ PB1 → 输出推挽(初始高)

这些都可以在Pinout图上直接点击设置,并命名Label方便后续生成宏定义。

最后别忘了配置RCC时钟源(通常使用外部晶振8MHz,PLL倍频到72MHz),然后生成代码。


底层驱动函数:一切从这里开始

CubeMX只帮你做了初始化,真正的通信还得靠你自己封装函数。以下是三个最核心的接口:

1. 写命令

void tft_write_command(uint8_t cmd) { HAL_GPIO_WritePin(TFT_DC_GPIO_Port, TFT_DC_Pin, GPIO_PIN_RESET); // 命令模式 HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_RESET); // 选中设备 HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_SET); // 取消选中 }

2. 写数据

void tft_write_data(uint8_t data) { HAL_GPIO_WritePin(TFT_DC_GPIO_Port, TFT_DC_Pin, GPIO_PIN_SET); // 数据模式 HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_SET); }

3. 批量写数据(提升效率)

单字节发送太慢,画图卡成PPT。我们可以加个批量函数:

void tft_write_buffer(uint8_t *buffer, size_t len) { HAL_GPIO_WritePin(TFT_DC_GPIO_Port, TFT_DC_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, buffer, len, HAL_MAX_DELAY); HAL_GPIO_WritePin(TFT_CS_GPIO_Port, TFT_CS_Pin, GPIO_PIN_SET); }

这三个函数构成了整个驱动的地基。所有高级操作(清屏、画点、写字)都将基于它们实现。


初始化序列:能不能亮屏,全看它了

这是最容易出错的部分。网上很多代码直接复制某家模块的初始化流程,结果换一块屏就不行了。

正确的做法是:参考官方Datasheet,结合具体模块调整参数

下面是适用于大多数绿色PCB版ST7735(俗称“绿屏”)的初始化流程:

void st7735_init(void) { // 硬件复位 HAL_GPIO_WritePin(TFT_RST_GPIO_Port, TFT_RST_Pin, GPIO_PIN_RESET); HAL_Delay(10); HAL_GPIO_WritePin(TFT_RST_GPIO_Port, TFT_RST_Pin, GPIO_PIN_SET); HAL_Delay(120); tft_write_command(0x11); // Sleep Out HAL_Delay(120); tft_write_command(0x3A); // COLMOD: 设置颜色格式 tft_write_data(0x05); // 16位色 (RGB565) tft_write_command(0x36); // MADCTL: 显存访问控制 tft_write_data(0xC0); // BGR顺序 + Y轴镜像(适配常见方向) tft_write_command(0x2C); // RAMWR: 准备写GRAM tft_write_command(0x29); // Display ON }

📌 解释几个关键命令:
-0x11: 退出睡眠模式,必须等待至少120ms
-0x3A: 设置颜色深度,0x05 表示16位色
-0x36: 控制显示方向和颜色排列,如果你发现颜色发紫或倒置,多半是这里错了
-0x29: 开启显示,否则屏幕不会亮

💡 提示:有些模块是“BGR”排列而非“RGB”,如果你发现红色变蓝、蓝色变红,就把MADCTL中的颜色标志位改一下,或者找找有没有RGB/BGR切换命令。


如何验证成功?来个快速测试

写完初始化后,别急着上GUI,先做个简单的测试:整屏填充单一颜色

void tft_fill_screen(uint16_t color) { uint8_t hi = color >> 8; uint8_t lo = color; tft_write_command(0x2A); // CASET: 列地址设置 tft_write_data(0x00); tft_write_data(0x00); tft_write_data(0x00); tft_write_data(0x7F); // 0~127 tft_write_command(0x2B); // RASET: 行地址设置 tft_write_data(0x00); tft_write_data(0x00); tft_write_data(0x00); tft_write_data(0x9F); // 0~159 tft_write_command(0x2C); // RAMWR: 开始写数据 uint8_t color_buf[128 * 2]; // 每次发一行(128像素 × 2字节) for (int i = 0; i < 128; i++) { color_buf[2*i] = hi; color_buf[2*i+1] = lo; } for (int row = 0; row < 160; row++) { tft_write_buffer(color_buf, sizeof(color_buf)); } }

main()里调用:

int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); st7735_init(); tft_fill_screen(0xF800); // 红色填充(RGB565格式) while (1) {} }

如果一切顺利,你应该看到屏幕变成纯红色


常见问题与避坑指南

❌ 屏幕全白或闪动

  • 可能原因:SPI速度太快
  • 解决方案:降低波特率预分频器至/32/64测试

❌ 屏幕全黑无反应

  • 检查RST是否拉高
  • 确认DC、CS电平正确
  • 查看电源是否稳定(尤其是LED引脚是否接了限流电阻)

❌ 颜色异常(偏紫、偏黄)

  • 很可能是BGR/RGB顺序搞反了
  • 修改MADCTL参数试试0xA0,0xC0,0xE0等组合

❌ 显示倒置或左右翻转

  • 调整MADCTL中的MY/MX/MV标志位
  • 常见组合:
  • 0xC0: 正常竖屏(Y镜像)
  • 0xA0: 横屏(旋转90°)

❌ 刷新太慢

  • 当前是CPU轮询发送,占用资源大
  • 进阶方案:启用DMA传输,或使用FSMC/QSPI接口替代SPI

后续扩展思路

一旦你能成功点亮并填充颜色,接下来就可以逐步添加更多功能:

  • 封装draw_pixel(x, y, color)函数
  • 实现直线、矩形、圆等基本图形
  • 添加字体渲染(ASCII或中文)
  • 接入轻量级GUI库如LVGL(需外扩RAM或启用DMA双缓冲)
  • 结合传感器做动态数据显示(温湿度、电压等)

而且这套代码结构清晰,移植性强。换个STM32系列?只要重新用CubeMX生成SPI和GPIO配置,驱动层几乎不用改。


写在最后

别再盲目复制GitHub上的例程了。真正掌握一个外设,不是“让它跑起来”,而是理解每一行代码背后的硬件逻辑

通过这次实践,你应该已经明白:
- STM32CubeMX不只是个代码生成器,更是帮你理清外设配置逻辑的好工具;
- ST7735虽小,但也有自己的脾气,初始化顺序、时序匹配一点都不能错;
- 驱动开发的本质,是对协议的理解 + 对细节的把控。

下次当你拿到一块新屏幕,不再慌张,而是冷静分析手册、合理配置SPI、一步一步调试——恭喜你,已经是一名合格的嵌入式工程师了。

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

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

RK3568 Android14 调试 RTL8211F 千兆以太网 (RGMII)

实战&#xff1a;RK3568 Android14 调试 RTL8211F 千兆以太网 (RGMII) 前言 在 RK3568 的产品定义中&#xff0c;千兆以太网&#xff08;Gigabit Ethernet&#xff09;通常是标配。‌RTL8211F是Realtek&#xff08;瑞昱半导体&#xff09;推出的一款高度集成的千兆以太网PHY芯片…

作者头像 李华
网站建设 2026/6/9 17:39:10

JLink接线防反插设计技巧:项目应用分享

JLink接线防反插设计&#xff1a;从工程失误中提炼的实战经验你有没有遇到过这样的场景&#xff1f;调试正酣&#xff0c;突然“啪”一声轻响&#xff0c;板子冒烟了——回头一看&#xff0c;同事把JLink排线倒着插了。MCU锁死、电源异常、SWDIO引脚电压拉高……更糟的是&#…

作者头像 李华
网站建设 2026/6/15 19:31:53

可穿戴设备健康监测:心电图分析模型在TensorRT上轻量化运行

可穿戴设备健康监测&#xff1a;心电图分析模型在TensorRT上轻量化运行 在智能手表、贴片式心电仪等可穿戴设备日益普及的今天&#xff0c;用户不再满足于简单的步数统计和心率估算。越来越多的人开始关注持续性心脏健康监测——尤其是房颤、早搏等隐匿性心律失常的早期预警。这…

作者头像 李华
网站建设 2026/6/19 8:09:38

如何在数据科学家面试中脱颖而出

原文&#xff1a;towardsdatascience.com/how-to-stand-out-in-your-data-scientist-interview-f3cbaddbbae4 TL;DR 最好的面试是你和面试官之间的对话&#xff0c;而不是 FBI 审讯。像以下例子一样结构化你的回答&#xff0c;以操纵面试的动态&#xff0c;让面试官感觉就像刚…

作者头像 李华
网站建设 2026/6/16 2:55:57

森林火灾预警系统:卫星遥感分析模型通过TensorRT自动扫描

森林火灾预警系统&#xff1a;卫星遥感分析模型通过TensorRT自动扫描 在气候变化日益严峻的今天&#xff0c;森林火灾正以前所未有的频率和强度席卷全球。从澳大利亚的丛林大火到加州山火&#xff0c;再到地中海沿岸的连年焚毁&#xff0c;生态与人类安全面临巨大威胁。传统的防…

作者头像 李华
网站建设 2026/6/10 9:37:40

【ESP32】Keil搭建ESP32-C3环境

1. Keil的局限性 Keil MDK主要针对ARM Cortex-M系列芯片ESP32-C3使用的是RISC-V架构Keil官方不支持RISC-V架构 2. 可能的解决方案 方案A&#xff1a;使用RT-Thread Studio&#xff08;基于Eclipse&#xff0c;支持RISC-V&#xff09; 这是更好的选择&#xff1a; 下载RT-T…

作者头像 李华