STM32F103驱动ST7735S彩屏:从硬件SPI切换到软件SPI的实战避坑指南

发布时间:2026/6/8 5:42:37

STM32F103驱动ST7735S彩屏:从硬件SPI切换到软件SPI的实战避坑指南 STM32F103驱动ST7735S彩屏硬件SPI与软件SPI的深度切换实战当硬件SPI引脚被其他外设占用或者项目需要更灵活的引脚配置时切换到软件模拟SPI成为驱动ST7735S彩屏的可行方案。本文将深入探讨两种实现方式的差异并提供完整的切换方法与调试技巧。1. 硬件SPI与软件SPI的核心差异硬件SPI利用芯片内置的专用通信模块而软件SPI则通过GPIO模拟时序。两者在性能和应用场景上存在显著区别特性硬件SPI软件SPI通信速度最高18MHz (STM32F103)通常1MHzCPU占用率极低100%发送时占用引脚灵活性固定SCK/MOSI引脚任意GPIO均可时序精度硬件保证受中断和代码影响适用场景高速数据传输引脚受限或低速需求提示当屏幕刷新率要求不高如仪表盘、参数显示时软件SPI的视觉差异几乎不可察觉。2. CubeMX配置的关键调整从硬件SPI切换到软件SPI时CubeMX配置需要做以下调整取消硬件SPI初始化在Pinout视图取消SPI外设的使能移除SPI初始化代码MX_SPIx_Init()GPIO配置要点将SCK、MOSI、CS、DC、RST引脚设为GPIO输出模式建议选择同一GPIO组的引脚如全部使用GPIOB以优化代码效率输出模式配置为推挽输出、高速模式、无上下拉// 软件SPI引脚定义示例 #define LCD_SCK_PIN GPIO_PIN_13 #define LCD_SCK_PORT GPIOB #define LCD_MOSI_PIN GPIO_PIN_15 #define LCD_MOSI_PORT GPIOB3. 软件SPI时序实现细节软件SPI的核心是精确模拟时钟和数据时序。以下是关键操作函数void SoftSPI_WriteByte(uint8_t data) { for(uint8_t i0; i8; i) { // 下降沿准备数据 HAL_GPIO_WritePin(LCD_SCK_PORT, LCD_SCK_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LCD_MOSI_PORT, LCD_MOSI_PIN, (data 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET); data 1; // 上升沿锁存数据 HAL_GPIO_WritePin(LCD_SCK_PORT, LCD_SCK_PIN, GPIO_PIN_SET); __NOP(); __NOP(); // 短暂延时保证时序 } }时钟极性与相位调整 ST7735S通常需要模式3CPOL1CPHA1空闲时SCK保持高电平数据在SCK下降沿变化上升沿采样注意错误的时钟极性会导致屏幕无法识别命令表现为白屏或乱码。4. 常见问题与调试技巧4.1 通信失败排查步骤基础检查确认电源电压稳定3.3V检查所有连接线是否牢固测量背光控制信号是否正常信号测量用逻辑分析仪捕获SPI波形确认CS信号在传输期间保持低电平检查DC信号在命令/数据时的电平变化软件调试先尝试写入简单命令如软复位0x01逐步增加显示操作复杂度4.2 性能优化技巧批量写入优化void LCD_WriteDataBulk(uint8_t *data, uint32_t len) { LCD_DC_Data(); LCD_CS_Enable(); while(len--) { SoftSPI_WriteByte(*data); } LCD_CS_Disable(); }GPIO操作加速 直接操作寄存器比HAL库函数快3-5倍#define LCD_SCK_HIGH() (LCD_SCK_PORT-BSRR LCD_SCK_PIN) #define LCD_SCK_LOW() (LCD_SCK_PORT-BRR LCD_SCK_PIN)5. 完整引脚重映射案例以下是将硬件SPI从PB3/PB4/PB5迁移到任意引脚的完整示例CubeMX配置禁用SPI1外设配置PB13(SCK)、PB15(MOSI)、PB12(CS)、PB14(DC)、PC9(RST)为GPIO输出代码适配void LCD_WriteCommand(uint8_t cmd) { LCD_DC_Command(); LCD_CS_Enable(); SoftSPI_WriteByte(cmd); LCD_CS_Disable(); } void LCD_Init(void) { // 复位序列 HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_RESET); HAL_Delay(120); HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_SET); HAL_Delay(120); // 初始化命令序列 LCD_WriteCommand(0x11); // Sleep out HAL_Delay(120); LCD_WriteCommand(0x3A); // 颜色模式设置 LCD_WriteData(0x05); // 16位RGB // ...其他初始化命令 }显示测试void Test_Pattern(void) { // 绘制渐变色条 for(uint16_t y0; y128; y) { for(uint16_t x0; x128; x) { uint16_t color ((x/16)11) | ((y/8)5) | (x/16); LCD_DrawPixel(x, y, color); } } }在实际项目中切换到软件SPI后刷新率从硬件SPI的45FPS降至约8FPS但对于大多数信息显示应用已经足够。通过直接寄存器操作和批量写入优化可进一步提升至12-15FPS。

相关新闻