STM32驱动ST7789V2 TFT屏:从SPI初始到DMA加速的实战解析

张开发
2026/4/18 16:24:09 15 分钟阅读

分享文章

STM32驱动ST7789V2 TFT屏:从SPI初始到DMA加速的实战解析
1. 硬件连接与基础配置第一次拿到ST7789V2屏幕时我盯着那排纤细的引脚有点发懵。这块1.54寸240x240的TFT屏虽然只有SPI接口但实际用起来比想象中简单得多。先说说硬件连接这是整个项目的物理基础SCK接STM32的SPI时钟线我用的PB13SDA/MOSI数据线必须接对我用的PB15DC这个引脚特别重要高低电平决定传输的是命令还是数据CS片选信号低电平有效RES复位引脚初始化时需要拉低再拉高BLK背光控制直接接3.3V常亮最省事硬件SPI和软件模拟SPI的选择让我纠结了很久。实测发现使用STM32F103C8T6的硬件SPI2时刷新率能达到软件模拟的3倍以上。配置时钟分频时要注意我最初设的SPI_BaudRatePrescaler_8导致屏幕闪烁改成SPI_BaudRatePrescaler_2后稳定在30fps。// SPI2初始化代码片段 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); SPI_InitStructure.SPI_Direction SPI_Direction_1Line_Tx; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_2; SPI_Init(SPI2, SPI_InitStructure);2. 屏幕初始化关键步骤屏幕初始化就像给新手机做首次设置卖家提供的初始化代码往往包含隐藏的优化参数。我对比了三个不同厂家的驱动代码发现ST7789V2的初始化序列主要有这几个关键点睡眠模式退出必须发送0x11命令后延迟120ms颜色格式设置0x3A命令对应RGB565格式显示方向控制0x36命令的MY/MX/MV参数影响旋转方向伽马校正不同批次屏幕可能需要调整0x26命令的值最坑的是电源控制参数有次屏幕始终花屏最后发现是卖家代码里漏了0xC5命令VCOM电压设置。建议把初始化代码拆分成多个函数比如void LCD_InitSequence(void) { LCD_Write_Cmd(0x11); // Sleep out Delay(120); LCD_Write_Cmd(0x3A); // Color mode LCD_Write_Data(0x55); // RGB565 // 其他初始化命令... }3. DMA加速实战技巧当第一次看到DMA配置参数时我仿佛在看天书。后来发现DMA1_Channel5对应SPI2_TX是STM32F1系列的固定搭配这个知识点手册里藏得很深。DMA加速的核心在于三点双缓冲机制准备下一帧数据时DMA传输当前帧传输完成中断配合TC标志位实现无撕裂刷新内存对齐数据地址必须是4字节对齐实测数据显示240x240全屏刷新时无DMA约280ms有DMA约90msDMA双缓冲约65ms// DMA配置关键参数 DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)SPI2-DR; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)frameBuffer; DMA_InitStructure.DMA_BufferSize SCREEN_WIDTH * SCREEN_HEIGHT * 2; DMA_Init(DMA1_Channel5, DMA_InitStructure);4. 性能优化进阶方案为了把帧率提到更高我尝试了几种进阶方案。首先是SPI时钟超频将预分频从2改成1时屏幕开始出现噪点但通过调整VCOM电压可以缓解。其次是局部刷新技术只更新屏幕变化区域void LCD_UpdateRegion(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { LCD_Address_Set(x, y, xw-1, yh-1); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); DMA_SetCurrDataCounter(DMA1_Channel5, w*h*2); DMA_Cmd(DMA1_Channel5, ENABLE); }内存管理也很关键。使用__attribute__((aligned(4)))确保缓冲区对齐后DMA传输效率提升约15%。如果使用STM32CubeMX配置记得在DMA设置里勾选Memory Data Size为Half Word。5. 常见问题排查指南调试期间我踩过不少坑这里分享几个典型问题的解决方法屏幕白屏检查RESET时序是否正确上电后需要至少10ms低电平颜色错乱确认0x3A命令参数与代码中的颜色格式一致DMA传输卡死检查DMA通道是否使能NVIC中断SPI时钟异常测量SCK引脚波形确认没有其他外设冲突有个隐蔽的bug花了我两天时间当SPI时钟超过36MHz时必须降低GPIO引脚的输出速度GPIO_Speed_50MHz改为GPIO_Speed_10MHz否则会出现数据丢失。

更多文章