STM32驱动1.3寸LCD屏幕:从SPI配置到ST7789初始化详解

张开发
2026/4/16 14:04:55 15 分钟阅读

分享文章

STM32驱动1.3寸LCD屏幕:从SPI配置到ST7789初始化详解
1. 硬件准备与连接指南第一次接触1.3寸LCD屏幕时我完全被那些密密麻麻的引脚搞懵了。后来才发现只要理清SPI通信的基本原理连接起来其实特别简单。我们这次用的中景园1.3寸屏幕采用ST7789驱动芯片分辨率240×240四线SPI接口实测在STM32F103系列上跑起来非常流畅。屏幕背面通常会有清晰的引脚标注重点关注的几个关键引脚是SPI_CLK时钟线连接MCU的SPI时钟引脚SPI_MOSI主设备输出从设备输入传输数据用LCD_CS片选信号低电平有效LCD_DC数据/命令选择线高低电平区分数据与命令LCD_RES复位引脚低电平触发复位我在实际项目中使用的连接方案是这样的PA0 - LCD_TE // 撕裂效应控制可暂不连接 PA1 - LCD_BLK // 背光控制 PA2 - LCD_RES // 复位 PA3 - LCD_DC // 数据/命令选择 PA4 - LCD_CS // 片选 PA5 - SPI_CLK // SPI时钟 PA7 - SPI_MOSI // SPI数据输出提示背光控制可以用普通GPIO如果想实现亮度调节则需要连接PWM引脚。我用的是PA1TIM2_CH2或TIM5_CH2不过初期调试建议先用固定高电平点亮背光。有个容易踩的坑是SPI的速率设置。ST7789最高支持62.5MHz的SPI时钟但实际使用时建议先从低速开始。我在标准库中通常这样设置分频系数SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_4; // 18MHz 72MHz系统时钟2. SPI接口深度配置SPI配置是驱动成功的关键。ST7789的SPI时序比较特殊需要仔细对照数据手册。在调试第一个屏幕时我因为没注意相位设置折腾了一整天都没显示。必须关注的SPI参数时钟极性(CPOL)设置为高电平空闲SPI_CPOL_High时钟相位(CPHA)数据在第一个边沿捕获SPI_CPHA_1Edge数据大小8位传输SPI_DataSize_8bMSB先行SPI_FirstBit_MSB标准库中的完整配置如下SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction SPI_Direction_1Line_Tx; // 单线发送模式 SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_High; // 时钟空闲时为高 SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; // 第一个边沿捕获数据 SPI_InitStructure.SPI_NSS SPI_NSS_Soft; // 软件控制片选 SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial 7; SPI_Init(SPI1, SPI_InitStructure);为了提升写入速度我通常会直接操作寄存器来发送数据void SPI1_WriteByte(uint8_t data) { while((SPI1-SR SPI_SR_TXE) RESET); // 等待发送缓冲区空 SPI1-DR data; // 直接写入数据寄存器 while((SPI1-SR SPI_SR_BSY) SET); // 等待传输完成 }3. ST7789初始化全解析屏幕初始化是一系列寄存器配置的过程。第一次看中景园提供的例程时那些魔法数字让我一头雾水后来对照数据手册才明白每个参数的意义。必须掌握的初始化步骤硬件复位拉低RES引脚至少10msvoid LCD_Reset(void) { LCD_RES_0; // 复位引脚拉低 delay_ms(50); LCD_RES_1; // 恢复正常 delay_ms(50); }屏幕方向设置0x36命令// 0:竖屏正常 1:竖屏翻转 2:横屏正常 3:横屏翻转 LCD_WR_Cmd(0x36); #if USE_HORIZONTAL 0 LCD_WR_Data8(0x00); #elif USE_HORIZONTAL 1 LCD_WR_Data8(0xC0); #elif USE_HORIZONTAL 2 LCD_WR_Data8(0x70); #elif USE_HORIZONTAL 3 LCD_WR_Data8(0xA0); #endif颜色格式设置0x3A命令LCD_WR_Cmd(0x3A); LCD_WR_Data8(0x05); // RGB565格式伽马校正影响色彩显示效果LCD_WR_Cmd(0xE0); // 正伽马 LCD_WR_Data8(0xD0); LCD_WR_Data8(0x04); // 15个参数... LCD_WR_Cmd(0xE1); // 负伽马 LCD_WR_Data8(0xD0); LCD_WR_Data8(0x04); // 15个参数...退出睡眠模式LCD_WR_Cmd(0x11); // 退出睡眠 delay_ms(120); // 必须的等待时间 LCD_WR_Cmd(0x29); // 开启显示注意不同厂商的屏幕可能需要不同的初始化序列。中景园的屏幕在竖屏模式下需要Y轴偏移80像素这是ST7789驱动240x240屏幕的特殊设计。4. 屏幕显示实战技巧成功初始化后真正的乐趣才开始。显示内容主要分为两个步骤设置显示窗口和写入像素数据。设置显示区域函数void LCD_SetRegion(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { #if USE_HORIZONTAL 1 y0 80; y1 80; // 竖屏翻转模式的Y偏移 #elif USE_HORIZONTAL 3 x0 80; x1 80; // 横屏翻转模式的X偏移 #endif LCD_WR_Cmd(0x2A); // 列地址设置 LCD_WR_Data16(x0); LCD_WR_Data16(x1); LCD_WR_Cmd(0x2B); // 行地址设置 LCD_WR_Data16(y0); LCD_WR_Data16(y1); LCD_WR_Cmd(0x2C); // 存储器写入 }全屏填充颜色void LCD_Fill(uint16_t color) { uint32_t total_pixels LCD_WIDTH * LCD_HEIGHT; LCD_SetRegion(0, 0, LCD_WIDTH-1, LCD_HEIGHT-1); for(uint32_t i0; itotal_pixels; i) { LCD_WR_Data16(color); // 持续发送颜色数据 } }我常用的颜色定义RGB565格式#define WHITE 0xFFFF #define BLACK 0x0000 #define RED 0xF800 #define GREEN 0x07E0 #define BLUE 0x001F #define YELLOW 0xFFE0显示位图的关键技巧使用Img2Lcd等工具将图片转为C数组确保选择RGB565格式显示函数示例void LCD_ShowBMP(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *bmp) { LCD_SetRegion(x, y, xwidth-1, yheight-1); uint32_t size width * height; for(uint32_t i0; isize; i) { uint16_t color (bmp[i*2]8) | bmp[i*21]; LCD_WR_Data16(color); } }调试时如果遇到花屏问题建议按以下步骤排查检查SPI时序参数CPOL/CPHA确认复位时序是否满足要求检查电源稳定性3.3V供电要干净用逻辑分析仪抓取SPI波形对比数据手册

更多文章