ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32G030F6P6驱动ST7735 0.96寸彩屏工程详解

STM32G030F6P6驱动ST7735 0.96寸彩屏工程详解 简介以STM32G030F6P6为主控的0.96英寸TFT LCD彩屏驱动例程面向希望快速掌握ST7735驱动芯片及小型液晶屏显示控制的嵌入式开发者。工程基于STM32CubeIDE搭建完整演示STM32通过SPI接口与ST7735通讯、初始化显示屏以及输出彩色图像的实现流程可帮助理解底层时序配置与HAL库调用逻辑。压缩包共计193个文件涵盖C/H源码、CubeMX工程配置、链接脚本、编译生成物及一份docx说明文档整体约4.31MB结构紧凑且层次分明可直接导入IDE进行编译和验证。针对时钟、SPI引脚、屏幕行列偏移等常见配置点做了明确的代码注释并预留彩色填充、字符显示等基础接口方便后续移植到其他STM32型号。目前已有1694人学习下载适合正在入门TFT LCD显示或需要快速完成屏幕驱动的开发者参考使用。 前几天整理硬盘的时候翻出一个旧工程文件名很直白“STM32G030F6P6-TFTLCD-ST7735-0.96INCH.rar”。解压出来一看是一整套用STM32G030F6P6驱动0.96寸ST7735 TFTLCD的代码正好符合我最近想复刻一个小桌面电压表的想法。这个主控加这块屏的组合在低成本彩屏方案里非常经典硬件成本加起来也就几块钱却能做出温度、电压、时间、菜单这些人机交互界面。如果你手里正好有一块0.96寸的ST7735屏又准备用STM32G030F6P6这颗便宜的小芯片去点亮它那么这套工程的思路和代码可以直接复制过来改着用。1. 项目概述小主控带小屏为什么是绝配1.1 STM32G030F6P6这颗芯片到底够不够用STM32G030F6P6是意法半导体推出的入门级Cortex-M0产品主频最高64MHz内置32KB Flash和8KB SRAM封装是20脚的TSSOP。很多人一看到只有8KB内存第一反应是“这能跑屏幕”但0.96寸的ST7735屏分辨率通常只有80x160一帧RGB565数据是80160225600字节也就是25KB光这一帧数据就超过了MCU的SRAM所以工程里根本不会用全帧缓冲而是采用“开窗口逐块刷新”的方式画点、画线、显示字符都是直接往SPI接口里写像素数据。这样8KB RAM完全够用剩下内存还能放几个浮点缓冲和菜单变量。这颗芯片虽然便宜但是外设并不含糊内部带一个SPI接口最高可以跑几十兆赫兹的时钟。ST7735的写时序摸清之后用SPI时钟8MHz刷一块80x160的小屏刷新率能到二三十帧显示数字、菜单、简单波形都绰绰余。所以我一直说用G030驱动0.96寸彩屏是真正“性价比拉满”的做法不像某些项目动不动就上F4资源浪费还不好买。1.2 这个rar压缩包里通常放了哪些东西从文件命名看这个包就是工程源码压缩包。解压之后一般会看到这样几类文件Core/Src/main.c主函数和硬件初始化入口Core/Inc/main.h寄存器映射或者用户配置宏Driver或BSP目录st7735.c和st7735.h里面是屏的初始化序列和画点填充函数Fonts目录ASCII字符字模和中文取模数组.ioc工程文件如果原作者用STM32CubeMX开发会附带这个文件用来快速恢复引脚配置我这次翻到的工程里还顺手带了一个简单的开机动画示例逻辑就是从Flash里读图片数组然后用区域填充的方式一点点画到屏幕上。当然不同卖家、不同作者放的代码风格会差很多有的把字体直接写在源文件里有的拆成了独立头文件但核心驱动文件基本就那两三个搞明白st7735.c就能hold住全部。2. 硬件连接先把引脚和电源理顺2.1 引脚分配实例STM32G030F6P6的引脚不多但SPI1外设可以映射到好几组引脚。以我手头这块板子为例我习惯把SPI1的SCK放在PA5MOSI放在PA7推挽复用输出速度设为High。CS片选、DC数据命令位、RST复位、BL背光这四根控制线用普通GPIO实现。一个比较省事的接线表如下屏幕引脚功能说明接STM32G030F6P6VCC模块电源3.3VGND地GNDSCLSPI时钟输入PA5 (SPI1_SCK)SDASPI数据输入PA7 (SPI1_MOSI)CS片选低有效PA0 (GPIO输出)DC数据/命令选择PA4 (GPIO输出)RST复位低有效PA1 (GPIO输出)BL背光控制PA2 (GPIO输出可PWM)注意ST7735不吃MISO数据SPI可以配置成“只发送主机模式”也可以直接用全双工模式但忽略接收引脚。CubeMX里选“Transmit Only Master”会让引脚定义更简洁MISO不占用IO适合引脚紧张的TSSOP20封装。如果板子上SCK和SDA用的是PA1和PA3那么只要改CubeMX里的引脚映射控制代码不需要动。2.2 电源和电平匹配的几个坑0.96寸ST7735模块市面上有两种常见版本一种板载3.3V稳压芯片可以接5V电源另一种没有稳压只能接3.3V。用STM32G030F6P6时除非你手里模块明确写了支持5V否则我建议直接统一用3.3V供电。G030的GPIO是3.3V电平模块的IO口如果被5V供电长时间使用可能因为电平不匹配导致ST7735内部逻辑闩锁轻则花屏重则芯片发烫。另外背光引脚BL如果能用PWM控制就可以实现亮度调节。如果只是当开关用GPIO拉高即可。很多模块背光串了一个三极管低电平常亮、高电平关闭不同模块逻辑不一样点亮之前先看下丝印或者卖家说明避免“上电就有背光怎么调都不灭”这种尴尬。再提一点SPI信号线尽量缩短尤其是SCL线最好控制在10cm以内。0.96寸屏的板子一般会带较长的排针飞线连接时如果线太长、又没有接地平面高频信号容易振铃导致初始化偶尔失败或者显示有条纹。实测下来杜邦线超过20cm后问题就会明显增多。3. 驱动代码拆解从初始化到中文显示3.1 SPI参数设置与发送函数ST7735使用的是标准SPI接口绝大多数模块工作在Mode 0也就是CPOL0、CPHA0时钟空闲为低第一个边沿采样数据。SPI时钟建议保守一点8MHz是一个很稳的中间值。STM32G030F6P6的系统时钟跑到64MHzSPI1挂在不同总线上分频后8MHz完全没问题。更高的时钟比如16MHz也能跑但长线飞线时容易出错没必要为了那一点速度去冒稳定性的风险。底层发送函数开发时可以直接调HAL库void ST7735_WriteCmd(uint8_t cmd) { ST7735_DC_LOW(); HAL_SPI_Transmit(hspi1, cmd, 1, 100); } void ST7735_WriteData(uint8_t data) { ST7735_DC_HIGH(); HAL_SPI_Transmit(hspi1, data, 1, 100); }初始化之前要保证CS拉低、RST释放。有些朋友上来就调用初始化命令屏幕一直白屏回头看才发现RST引脚一直保持低电平芯片始终在复位状态。GPIO初始化时RST默认输出低初始化函数里先拉低再延时后再拉高这是标准操作不要省略。3.2 初始化序列到底在做什么不同批次的ST7735屏初始化序列会有细微差别但核心流程是一致的软件复位、退出睡眠、设置像素格式、设置显存访问方向、开启显示。以常见的ST7735S模块为例最小初始化序列大概是这样ST7735_WriteCmd(0x01); // SWRESET 软件复位 HAL_Delay(150); ST7735_WriteCmd(0x11); // SLPOUT 退出睡眠模式 HAL_Delay(200); ST7735_WriteCmd(0x36); ST7735_WriteData(0x00); // MADCTL 扫描方向 ST7735_WriteCmd(0x3A); ST7735_WriteData(0x05); // COLMOD 16位RGB565 ST7735_WriteCmd(0x29); // DISPON 显示开启这几条指令可以点亮大部分屏幕但色彩可能偏红或者偏蓝因为ST7735里有一个RGB/BGR顺序控制位一般在MADCTL命令的bit3。如果你的屏颜色通道反了就在MADCTL的值上加0x08或减0x08。比如0x00变成0x08蓝和红就能互换回来。还有一部分模块显示内容会左右翻转或者上下颠倒这时候调整MADCTL即可。我的经验是先写一个纯色填充函数分别填红、绿、蓝三种颜色看模块有没有“串色”再根据串色方向修改MADCTL比直接抄网上的寄存器值更可靠。3.3 画点、区域填充和显示中文的实现思路画点函数是最基础的。ST7735不是内存映射屏你需要先告诉它要写入哪个区域再通过RAMWR命令连续写入像素。设置窗口的底层逻辑是发送CASET和RASET分别设置列地址和行地址范围。一个典型区域填充函数思路如下void ST7735_FillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) { uint8_t hi, lo; ST7735_SetWindow(x, y, x w - 1, y h - 1); ST7735_WriteCmd(0x2C); // RAMWR uint32_t pixelCount (uint32_t)w * h; for (uint32_t i 0; i pixelCount; i) { hi color 8; lo color 0xFF; ST7735_WriteData(hi); ST7735_WriteData(lo); } }这种逐点循环发送效率一般但胜在代码简单适合新手理解。如果想提高刷新速度可以用HAL_SPI_Transmit一次发一整片颜色数据或者用DMA发送G030带DMA配合SPI能释放CPU。用小屏显示静态字符时用逐点循环就能轻松跑到几十帧问题不大。说到中文显示这是很多人的痛处。网上搜“tftlcd显示中文”会得到一堆教程核心其实就两步第一步用PCtoLCD2002这类取模软件把汉字转成16x16的点阵数组第二步在屏幕上逐位扫描数组遇到1就画前景色遇到0就画背景色。取模时注意设置成“逐行式”、“顺向”、“十六进制输出”一个16x16汉字刚好32字节。显示函数里按字节读取每字节从高位到低位扫描碰到置位像素就画点否则画空。我附上一个简化版的中文绘制循环void LCD_ShowChinese(uint16_t x, uint16_t y, const uint8_t *font, uint16_t color, uint16_t bg) { for (uint8_t row 0; row 16; row) { for (uint8_t byte 0; byte 2; byte) { uint8_t data font[row * 2 byte]; for (uint8_t bit 0; bit 8; bit) { if (data 0x80) { LCD_DrawPixel(x byte * 8 bit, y row, color); } else { LCD_DrawPixel(x byte * 8 bit, y row, bg); } data 1; } } } }这里要注意取模方向必须和屏幕的扫描方向匹配尤其是从淘宝买的模组有些屏会上下颠倒有些会左右镜像。同理如果字是反的多半是取模方向或者MADCTL没配合好。4. 从CubeMX到实物移植与调试实录4.1 CubeMX工程配置要点用STM32CubeMX打开工程后首先要选择对应型号STM32G030F6P6。如果之前用的是别的型号也照样能在CubeMX里重建只要外设配置一致即可。重点检查几个地方RCC设置为外部晶振或内部时钟都行但系统时钟一定要确认跑到64MHz否则SPI分频后的实际速率可能和你预期不同。SPI1模式选“Transmit Only Master”波特率预分频按8MHz输出。PA0、PA1、PA2、PA4配置为GPIO输出初始电平和屏的规格对应。打开UART调试串口的话优先选择PA9和PA10方便打印调试信息。生成代码后不要忘了在main.c里加上初始化顺序先初始化系统时钟和GPIO再初始化SPI最后调用ST7735_Init()。如果启动后白屏第一步就是检查初始化顺序尤其不能在SPI未初始化时去拉CS、DC这些控制脚虽然一般不会烧坏但时序会很怪。4.2 常见问题与排查技巧速查调试这类屏说难不难但几个症状特别容易让人头大。我把踩过的坑整理成一张速查表方便你直接对照排障故障现象可能原因排查方向全屏白屏RST一直为低、初始化没执行、CS拉高先用万用表量RST电平再查初始化调用花屏/偏色严重窗口偏移不对、MADCTL位错误用纯色填充测试逐个调整MADCTL红蓝色对调RGB/BGR顺序反了MADCTL的bit3翻转屏上下或左右镜像扫描方向未匹配修改MADCTL的MY/MX位有背光但无内容SDA/SCL接反、SPI模式不对检查接线和CPOL/CPHA刷新有条纹SPI速率过高、电源纹波大降速到4MHz给VCC并联100nF电容显示闪烁背光PWM频率过低、全屏填色过于频繁背光PWM频率至少1kHz避免连续整屏刷新这里重点说下“纯色测试法”。你可以先写一个ST7735_FillScreen(RED)的函数把整屏刷成红色再依次测试绿色、蓝色。如果红蓝反了那就是RGB/BGR位的问题如果颜色正常但整体有雪花那就是SPI时序或供电问题。这个方法比一条条对着寄存器查要快得多。4.3 实测中让我印象深刻的几个细节我第一次点亮这个组合时屏幕显示的颜色总是偏淡像是蒙了一层灰。排查到最后发现是SPI时钟设置成了16MHz而飞线又长信号边沿塌陷严重。降到8MHz之后颜色立刻鲜艳了。所以别迷信“高速SPI”稳定压倒一切。另一个坑是0.96寸屏的坐标偏移。很多ST7735S模块的显示区域不是从(0,0)开始而是需要偏移比如列方向从2开始、行方向从1开始。设置CASET和RASET时要把偏移量带进去。原作者工程里一般会预留ST7735_XSTART和ST7735_YSTART两个宏实测下来这个值不一定是(0,0)要注意改。中文显示更是典型。我用的取模软件默认输出“列行式”数据和逐行扫描的屏幕不匹配显示出来的汉字像被打乱一样。后来我在取模设置里改成“逐行式”并确认数据位顺序是高位在前中文就正常了。所有取模工具都有预览功能调好参数后先预览再到屏幕上看能省很多时间。5. 写在最后的几点实操体会这块0.96寸的小屏驱动芯片是ST7735网上资料确实不少但很多代码都是针对M0老芯片写的寄存器操作和HAL库混在一起。能在一个精简的STM32G030F6P6工程里跑通说明代码结构还是值得借鉴的。我个人实际用下来的感觉是G030F6P6这颗芯片做小型彩屏设备非常顺手PDF里外设不复杂但SPI、I2C、定时器、ADC都有配合一块小屏做交互界面比用OLED高出一个档次因为能显示颜色和简单图形。后续想扩展也很方面比如加一个DHT12温度传感器把菜单逻辑切成带光标的状态机或者把背光改成PWM亮度调节在户外和夜里都能看清。如果时间充裕我甚至会用G030的ADC采样电压把这块屏做成一个实时电压表或电池容量显示器整个项目体积可以做到硬币大小。最后再分享一个省事技巧调试屏幕上电前先编一段纯色全屏刷新的“点亮测试”不要一上来就刷图片或者中文。只要纯色正常说明初始化、SPI和窗口设置已经通过了后面再逐步叠加其他功能遇到问题很容易定位到具体模块。这样做少走很多弯路。本文还有配套的精品资源点击获取
返回列表