拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32驱动1.44寸TFT屏:ST7735S初始化与SPI显示

简介这是一份基于意法半导体STM32F103RCT6微控制器驱动1.44英寸彩色液晶屏的完整工程适合嵌入式入门开发者学习串行外设接口通信、液晶底层驱动与图形界面显示。工程采用标准外设库编写涵盖引脚定义、时钟配置、数据发送、屏幕初始化序列、显存缓冲区刷新等关键环节同时附带动画和图形绘制演示代码注释完整可在集成开发环境中直接打开并编译烧录快速验证彩色显示效果还能按项目需求进行裁剪和移植。压缩包共86个文件以38个头文件与32个C语言源文件为主体另有启动文件、工程配置、十六进制固件、一键清理脚本、调试配置及说明文档整体大小仅289KB目录划分清晰。已有4044人学习下载对需要为设备添加小尺寸彩色屏幕的开发者来说这是一份可直接运行并二次开发的参考设计。 这个项目听起来很基础——STM32F103RCT6加一块1.44寸TFT彩屏点亮屏幕显示点什么东西。但真把它从零跑通你会发现里面藏着不少值得掰扯的细节芯片选型、引脚分配、ST7735S初始化序列、SPI时序任何一个环节卡住屏幕要么白屏要么花屏要么颜色鬼畜。这篇文章我就按自己做项目时的思路把这套东西完整拆一遍包括硬件接线、驱动代码逻辑、常见坑位全程都是能直接抄作业的内容。这个配置最常见的用处就是做桌面小仪表、信号发生器、温湿度计、迷你游戏机这类设备屏幕虽然只有128x128但显示数值、波形、菜单绰绰有余。适合刚学完STM32基础外设、想上一个带屏幕项目的朋友也适合手里正好有这块屏幕和板子、不知道从哪里下手的同学。1. 项目拆解为什么是STM32F103RCT6配1.44寸TFT1.1 STM32F103RCT6这颗芯片的底气STM32F103RCT6是Cortex-M3内核主频最高72MHzFlash有256KBSRAM有48KB。带一块128x128的TFT屏画点、刷全屏、跑简单界面性能绰绰有余。很多人拿它和更常见的F103C8T6对比C8T6只有64KB Flash和20KB SRAM带屏也能跑但内存确实吃紧。RCT6的48KB SRAM刚好能宽松应对屏幕的数据缓冲需求。另外一个关键点是IO数量。RCT6是LQFP64封装有51个可用IO接屏幕那8个引脚之后还能剩一大堆GPIO接按键、传感器、编码器、蜂鸣器。这也是为什么很多小项目喜欢把它当“带屏主控”——以后想扩展功能IO不会成为瓶颈。1.2 1.44寸TFT与ST7735S的对应关系1.44寸TFT模块分辨率固定是128x128 RGB绝大多数内置ST7735S控制器。ST7735S内部有一块完整的128x128x16bit GRAM你通过SPI把像素颜色写进去它自己负责把GRAM内容刷新到液晶面板上。这里要区分两个概念屏幕模块和驱动IC。网上买到的通常是一个带转接板的模块板上焊着ST7735S芯片、稳压电路和背光电路引出一排排母引脚常见的就是VCC、GND、CS、RESET、DC、SDA、SCK、BL这8个。如果是裸屏那就只有玻璃面板和排线驱动要做在COF软排线上不适合新手直接玩。关于屏幕类型这个尺寸的TFT模块大部分是TN屏可视角度一般侧面看会变暗或偏色。想改善可以选IPS屏但1.44寸的IPS模块很少价格也高。区分方法很简单TN屏从侧面看很快变暗或颜色反转IPS屏侧面保持颜色大体一致对比度更稳定。选屏的时候注意看商品标注或者直接问卖家收到货之后从侧面看一眼就能判断。1.3 这个项目背后真正要练的基本功点亮屏幕只是结果过程里涉及的知识才是这个项目的核心价值SPI通信模式、命令/数据切换、RGB565颜色编码、时序延时、显存管理。这些基础跟驱动其他显示屏是完全通用的OLED、1.3寸TFT、2.4寸大彩屏底层逻辑都是同一套东西。把这套跑通之后后面做信号发生器只是把ADC采样数据画成曲线做仪表只是把数值映射成文本显示做菜单只是多几个状态切换。本质上都是基于那几个底层函数在叠功能。所以这个项目特别适合作为从“单片机裸机”到“带显示界面系统”的跳板。2. 硬件接线方案8个引脚怎么分配不踩坑2.1 屏幕引脚逐一解读先把这8个引脚的作用说清楚接线就不会晕VCC模块电源一般接3.3V。有些模块板载AMS1117-3.3稳压芯片可以接5V没有就别乱接后面会细说。GND地线必须和STM32共地。CS片选低电平有效。只有一根SPI总线上挂多个设备时才需要分时操作单屏可以直接拉低固定但程序里一般还是会控制它。RESET复位引脚低电平复位。MCU上电后要给一个至少20ms的低脉冲再释放否则初始化会乱。DC/RS数据/命令选择。DC低电平表示传输的是命令高电平表示传输的是像素或参数数据。这根线是驱动逻辑的关键。SDASPI的MOSI数据线数据从STM32发往屏幕。注意这种屏幕一般没有MISO因为数据方向是单向的。SCKSPI时钟线。BL背光控制。接高电平背光亮接PWM可以调亮度不接的话可能背光不亮但显示正常。2.2 我采用的接线方案软件SPI与硬件SPI怎么选两种方案都行各有取舍。软件SPI就是拿几个普通GPIO手动翻转电平模拟时序优点是引脚随便挑不用去查芯片的复用功能表出问题方便换线排查缺点是刷新速度受GPIO翻转速率限制全屏填充会慢一些。硬件SPI用芯片内部的SPI外设速度快且稳定但引脚通常是固定的比如SPI1的SCK固定在PA5、MOSI在PA7得先查数据手册确认复用关系。我的建议是第一次点亮屏幕、只想跑通显示逻辑优先用软件SPI代码直观排查方便后续要做动画、波形刷新这类对速度有要求的场景再切到硬件SPI。下面给出一套软件SPI接线方案引脚都放在PB口方便直接照着接屏幕引脚STM32引脚VCC3.3VGNDGNDCSPB12RESETPB11DCPB10SDAPB15SCKPB13BL3.3V为什么选这几个引脚因为都是普通GPIO不占用SWD下载接口PA13/PA14和串口PA9/PA10以后调试串口或下载程序不会冲突。实际你完全可以换成其他空闲引脚只要在代码里同步修改宏定义就行。2.3 供电与电平匹配的细节这一块是我踩过坑的地方。1.44寸TFT模块的逻辑电平是3.3VSTM32的GPIO配置成推挽输出输出3.3V电平驱动模块一般没问题。真正的坑在供电有些模块板载了3.3V稳压IC常见AMS1117-3.3VCC接5V没问题模块自己会转成3.3V有些简化版模块没有稳压VCC直接进ST7735S接5V就烧。稳妥的判断方法是看模块背面有没有稳压芯片有就可以接5V没有就老老实实接3.3V。背光也要注意BL直接接3.3V通常OK模块上一般串了限流电阻。如果发现背光特别亮、模块发热可以串一个几十欧的电阻或者用PWM降低占空比。另外有的模块没有电平转换电路STM32那几个号称5V容忍的引脚可以接5V逻辑但没有转换电路时不要用5V逻辑去驱动屏幕会损坏ST7735S。3. ST7735S初始化与底层驱动屏幕点亮的灵魂3.1 SPI时序与命令/数据切换ST7735S的SPI工作模式一般是模式0也就是CPOL0、CPHA0SCK空闲为低电平数据在上升沿被采样。一个字节8个bit先发高位再发低位。软件SPI写一个字节的代码特别简单void TFT_WriteByte(uint8_t dat) { for (int i 0; i 8; i) { if (dat 0x80) { TFT_SDA_H; } else { TFT_SDA_L; } TFT_SCK_H; // 上升沿屏幕采样 dat 1; TFT_SCK_L; } }命令和数据要靠DC引脚区分void TFT_WriteCmd(uint8_t cmd) { TFT_DC_L; TFT_CS_L; TFT_WriteByte(cmd); TFT_CS_H; } void TFT_WriteData(uint8_t dat) { TFT_DC_H; TFT_CS_L; TFT_WriteByte(dat); TFT_CS_H; }如果后面换成硬件SPI只需要把TFT_WriteByte内部替换成SPI外设的发送函数上层调用完全不用改。这种分层思路在后面扩展时非常省事。3.2 初始化序列到底在初始化什么很多人第一次接触ST7735S看到那一大串寄存器和参数就头疼。其实初始化序列可以分成几组来理解复位相关SWRESET软复位、SLPOUT退出睡眠模式这两条命令后都必须延时等待内部稳定。显示方向与色深MADCTL设置扫描方向和RGB/BGR顺序COLMOD设置颜色格式为16bit。电源和伽马PWCTR1/2、VMCTR1/2、FRMCTRL、伽马曲线等负责内部电压、画面亮度和对比度。这些参数厂商一般提供了推荐值直接抄模块商或常见驱动库的即可。边界设置CASET/RASET设定写入区域对应屏幕128x128像素的横向和纵向范围。开显示NORON进入正常显示模式、DISPON打开显示。以1.44寸模块为例我常用的最小可用初始化核心片段如下TFT_WriteCmd(0x01); delay_ms(150); // SWRESET TFT_WriteCmd(0x11); delay_ms(120); // SLPOUT TFT_WriteCmd(0xB1); TFT_WriteData(0x05); TFT_WriteData(0x3C); TFT_WriteData(0x3C); TFT_WriteCmd(0x3A); TFT_WriteData(0x05); // RGB565 TFT_WriteCmd(0x36); TFT_WriteData(0x00); // MADCTL如果颜色反了则试0x08或0xC8 TFT_WriteCmd(0x2A); TFT_WriteData(0x00); TFT_WriteData(0x02); TFT_WriteData(0x00); TFT_WriteData(0x81); TFT_WriteCmd(0x2B); TFT_WriteData(0x00); TFT_WriteData(0x02); TFT_WriteData(0x00); TFT_WriteData(0x81); TFT_WriteCmd(0x29); // DISPON这段是从多个ST7735S驱动中提炼出的精简序列。其中CASET/RASET里的02和81很关键很多1.44寸面板的实际可视区域并不从内部坐标0开始而是从(2,2)偏移开始所以列地址范围写0x02到0x81正好覆盖128个像素。如果你的屏幕显示内容偏移了几个像素八成是这里的边界没对上。3.3 驱动代码的组织方式我会把显示相关代码拆成两个文件底层tft_driver.c只负责写命令、写数据、设置窗口、填充颜色不关心业务逻辑上层显示模块负责画点、画线、画字符、显示图片。以后换更大尺寸的屏幕只改底层上层不动。画点是最基础的操作。RGB565颜色在SPI传输时的字节序是先高8位后低8位void TFT_DrawPixel(uint16_t x, uint16_t y, uint16_t color) { TFT_WriteCmd(0x2A); TFT_WriteData(x 8); TFT_WriteData(x 0xFF); TFT_WriteData(x 8); TFT_WriteData(x 0xFF); TFT_WriteCmd(0x2B); TFT_WriteData(y 8); TFT_WriteData(y 0xFF); TFT_WriteData(y 8); TFT_WriteData(y 0xFF); TFT_WriteCmd(0x2C); TFT_WriteData(color 8); TFT_WriteData(color 0xFF); }单点操作每次都要设置列地址和行地址效率低。所以填充区域时应该先把CASET/RASET设置一次然后连续写入所有像素。全屏填充就是设置完窗口后连续发送128x128x2字节的数据。4. 显示功能实现从画点、字符到图片显示4.1 填充与清屏先把显示区域用起来先写一个矩形填充函数它能帮你快速调试屏幕是否有偏移、颜色是否正确void TFT_FillRect(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) { uint8_t hi color 8, lo color 0xFF; TFT_WriteCmd(0x2A); TFT_WriteData(x0 8); TFT_WriteData(x0 0xFF); TFT_WriteData(x1 8); TFT_WriteData(x1 0xFF); TFT_WriteCmd(0x2B); TFT_WriteData(y0 8); TFT_WriteData(y0 0xFF); TFT_WriteData(y1 8); TFT_WriteData(y1 0xFF); TFT_WriteCmd(0x2C); TFT_DC_H; for (uint32_t i 0; i (x1 - x0 1) * (y1 - y0 1); i) { TFT_WriteByte(hi); TFT_WriteByte(lo); } }烧录后调用TFT_FillRect(0, 0, 127, 127, 0xF800)应该看到全屏红色。如果看到蓝色或绿色说明MADCTL的BGR位需要调整。常用颜色值记住这几个红色0xF800、绿色0x07E0、蓝色0x001F、白色0xFFFF、黑色0x0000调试时很常用。4.2 字符显示与字模取模细节显示字符的本质是把每个字符拆成点阵数据逐点画上去。最省事的方式是用取模软件生成字模比如PCtoLCD2002。以8x16的ASCII码为例每个字符占16字节一行一个字节位为1就画前景色位为0就画背景色或跳过。取模方向要选对取模软件里英文一般用“逐行式”格式选“十六进制”。如果发现字符左右颠倒或上下颠倒多半是取模方向选成了“逐列式”或者“逆向”。显示一个英文字符的函数框架void TFT_ShowChar(uint16_t x, uint16_t y, char ch, uint16_t fg, uint16_t bg) { const uint8_t *data ASCII_8x16[(ch - 32) * 16]; for (uint8_t i 0; i 16; i) { for (uint8_t j 0; j 8; j) { if (data[i] (0x80 j)) TFT_DrawPixel(x j, y i, fg); else TFT_DrawPixel(x j, y i, bg); } } }中文16x16点阵就是一个字占32字节显示逻辑相同只是行数和列数翻倍。逐点画字符在72MHz主频下也能跑但刷一屏文字会比较慢对静态界面完全够用。4.3 图片显示与Flash空间权衡彩色图片取模一般用Image2Lcd软件输出格式选C数组颜色格式选RGB565扫描方式选水平扫描输出宽度和高度设成128。生成的数组大小是128x128x232768字节约32KB。这个大小在RCT6的256KB Flash面前不算什么放两三张全屏图没问题但别指望放几十张。放图之前注意图片宽高要和屏幕一致否则会出现截断或滚动效果。另一种常见需求是曲线和波形显示信号发生器场景就是典型每个ADC采样点映射成屏幕Y坐标画点时用前景色画当前点顺手用背景色擦除上一帧同位置的旧点这样就能做到局部刷新不用全屏重绘。全屏刷新率方面软件SPI大概只有每秒两三帧肉眼能感到明显闪烁切换到硬件SPI并打开到18MHz左右全屏刷新可以到十几帧以上波形动画才够顺滑。我的建议是要做动画先切硬件SPI同时只更新变化区域能省则省。5. 常见问题与排查技巧实录5.1 白屏、黑屏、花屏分别怎么处理白屏通常说明屏幕初始化没生效系统根本没进入正常显示状态。优先检查三件事RESET引脚有没有给到低脉冲、初始化函数有没有被调用、DC引脚是否接对。黑屏但背光亮说明电源正常但显示数据没进去重点查SCK和SDA接线以及SPI模式是否配置成CPOL0、CPHA0。花屏多半是初始化序列被截断或延时不足把每条命令后的延时稍微加长特别是SWRESET和SLPOUT后面。下面列一个快速排查表症状大概率原因排查动作白屏初始化未执行或RESET异常确认复位脉冲检查初始化函数是否调用黑屏但背光亮SPI数据未写入检查SDA/SCK接线确认CPOL/CPHA花屏初始化不完整或供电不稳补全初始化序列量电源纹波颜色红蓝互换MADCTL的BGR位反了修改MADCTL值0x00和0x08互换显示内容偏移CASET/RASET边界不对调整0x02和0x81参数5.2 颜色不对、偏色、对比度异常颜色只有红蓝互换的话改MADCTL的RB位即可0x00和0x08之间切换。但偏色或对比度异常更多是伽马和电源寄存器的问题。ST7735S驱动库里的伽马设置0xE0、0xE1两组参数对色彩影响很大如果屏幕发灰或偏色明显不要自己乱调直接换成常见驱动库的标准伽马参数。另一个容易被忽略的是背光电压。背光太暗会让人觉得屏幕偏色这时候先排除供电问题再考虑调寄存器。5.3 用逻辑分析仪抓SPI时序排查SPI问题我最推荐逻辑分析仪。接上SCK和SDA两根线抓一次初始化过程能直接看到发出去的命令是不是0x01、0x11、0xB1这些也能看清数据波形里有没有毛刺。如果波形正常但屏幕不亮问题大概率在屏幕本身或供电如果波形根本不对就去查GPIO配置或引脚映射。实测下来这个工具比瞎猜高效太多也比示波器容易上手。我自己做这个项目时的习惯是先把最简初始化跑通确认能全屏填色再加字符、图片。每加一个功能就烧一次程序验证而不是一轮写到底。屏幕驱动这种东西问题往往不出在单个函数而出在函数之间的配合和时序上分阶段验证能帮你快速定位问题在底层还是上层。最后再分享一点实际体会1.44寸TFT属于小屏做产品界面时信息密度别拉太高显示大号数字或状态图标比塞一堆小字实用得多。如果后续要接电阻触摸屏可以在这个基础上增加ADC触摸采样和四点校准逻辑要扩展成信号发生器就用ADC采集波形并用画线函数绘制曲线。核心还是把这一套显示链路吃透后面都是换汤不换药的事情。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门