STM32F103C8T6 HAL库驱动ST7735S:4线SPI配置3个关键步骤与128x128显示实测

📅 2026/7/11 6:24:30
STM32F103C8T6 HAL库驱动ST7735S:4线SPI配置3个关键步骤与128x128显示实测
STM32F103C8T6 HAL库驱动ST7735S屏幕4线SPI配置与128x128显示实战指南在嵌入式开发中TFT-LCD显示屏的人机交互功能越来越重要。ST7735S作为一款性价比极高的显示控制器配合STM32F103C8T6的硬件SPI接口能够实现流畅的图形显示效果。本文将深入解析如何通过HAL库高效配置4线SPI接口并提供可直接应用于项目的完整驱动方案。1. 硬件准备与环境搭建核心硬件组件STM32F103C8T6最小系统板Blue PillST7735S驱动的1.44寸TFT-LCD128x128分辨率ST-Link V2调试器杜邦线若干开发环境配置安装Keil MDK-ARM 5.x开发环境下载STM32CubeMX最新版本建议v6.x以上获取中景园电子提供的ST7735驱动库基础代码注意确保所有硬件连接前已断电避免静电损坏元件。ST7735S的工作电压为2.8-3.3V直接连接STM32的3.3V电平GPIO即可。引脚对应关系表STM32引脚ST7735S引脚功能说明PA4CS片选信号PA5SCK时钟线PA7MOSI数据线PA6DC数据/命令选择PB1RES复位信号PB0BLK背光控制2. CubeMX关键配置步骤2.1 SPI1接口配置在CubeMX中完成以下关键设置模式选择全双工主模式硬件NSS信号禁用时钟极性低电平CPOL0时钟相位第一个边沿捕获CPHA0参数配置hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; hspi1.Init.CLKPhase SPI_PHASE_1EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_4; // 18MHz 72MHz主频 hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE;GPIO设置将CS、DC、RES引脚配置为GPIO输出模式初始电平CS高电平DC高电平RES高电平2.2 时钟树配置确保系统时钟配置正确HSE晶振输入8MHzPLL倍频到72MHzAPB2总线时钟72MHzSPI1所在总线3. 驱动代码移植与优化3.1 基础驱动函数实现修改原始驱动中的底层通信函数// 写命令函数 void LCD_Write_Cmd(uint8_t cmd) { LCD_CS_Clr(); LCD_DC_Clr(); HAL_SPI_Transmit(hspi1, cmd, 1, 100); LCD_CS_Set(); } // 写数据函数 void LCD_Write_Data(uint8_t dat) { LCD_CS_Clr(); LCD_DC_Set(); HAL_SPI_Transmit(hspi1, dat, 1, 100); LCD_CS_Set(); } // 批量写数据优化版本 void LCD_Write_Buffer(uint8_t *buffer, uint32_t length) { LCD_CS_Clr(); LCD_DC_Set(); HAL_SPI_Transmit(hspi1, buffer, length, 1000); LCD_CS_Set(); }3.2 初始化序列适配根据ST7735S数据手册修改初始化代码void LCD_Init(void) { LCD_RES_Clr(); HAL_Delay(120); LCD_RES_Set(); HAL_Delay(120); LCD_Write_Cmd(0x11); // Sleep out HAL_Delay(120); LCD_Write_Cmd(0xB1); // FRMCTR1 LCD_Write_Data(0x05); LCD_Write_Data(0x3C); LCD_Write_Data(0x3C); LCD_Write_Cmd(0xB2); // FRMCTR2 LCD_Write_Data(0x05); LCD_Write_Data(0x3C); LCD_Write_Data(0x3C); // ... 完整初始化序列参考数据手册 }4. 高级功能实现与性能优化4.1 显存管理策略采用部分刷新技术提升性能// 设置显示窗口函数 void LCD_SetWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { LCD_Write_Cmd(0x2A); // 列地址设置 LCD_Write_Data(x1 8); LCD_Write_Data(x1 0xFF); LCD_Write_Data(x2 8); LCD_Write_Data(x2 0xFF); LCD_Write_Cmd(0x2B); // 行地址设置 LCD_Write_Data(y1 8); LCD_Write_Data(y1 0xFF); LCD_Write_Data(y2 8); LCD_Write_Data(y2 0xFF); LCD_Write_Cmd(0x2C); // 写入显存 }4.2 DMA传输优化配置SPI DMA提升填充效率CubeMX中启用SPI1_TX的DMA通道修改传输函数void LCD_Fill_DMA(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { uint32_t size (x2-x11)*(y2-y11); static uint16_t buffer[128]; // 根据实际情况调整缓冲区大小 for(int i0; isizeof(buffer)/2; i) { buffer[i] color; } LCD_SetWindow(x1, y1, x2, y2); LCD_CS_Clr(); LCD_DC_Set(); while(size 0) { uint32_t chunk size sizeof(buffer)/2 ? sizeof(buffer)/2 : size; HAL_SPI_Transmit_DMA(hspi1, (uint8_t*)buffer, chunk*2); while(HAL_SPI_GetState(hspi1) ! HAL_SPI_STATE_READY); size - chunk; } LCD_CS_Set(); }4.3 显示测试与验证在main函数中添加测试代码int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); LCD_Init(); LCD_Fill(0, 0, LCD_WIDTH-1, LCD_HEIGHT-1, WHITE); // 显示分辨率信息 LCD_ShowString(10, 10, Resolution:, RED, WHITE, 16); char buf[20]; sprintf(buf, %dx%d, LCD_WIDTH, LCD_HEIGHT); LCD_ShowString(90, 10, buf, BLUE, WHITE, 16); // 动态变量显示 float counter 0; while(1) { LCD_ShowFloatNum(10, 30, counter, 2, RED, WHITE, 16); counter 0.1; HAL_Delay(200); } }5. 常见问题排查指南问题1屏幕无显示或花屏检查复位信号时序RES低电平至少10ms验证SPI时钟极性设置CPOL/CPHA测量背光电压通常3.3V问题2显示内容错位确认初始化序列中的扫描方向参数检查SetWindow函数的坐标计算验证显示驱动IC型号ST7735S有多个变种问题3刷新率低提高SPI时钟频率最高可达18MHz启用DMA传输减少CPU开销采用局部刷新代替全屏刷新通过以上步骤开发者可以快速建立稳定的ST7735S驱动方案。实际项目中建议将显示操作封装为独立的硬件抽象层便于后续维护和功能扩展。