SPI驱动ST7789屏的资料很多,但是用DMA驱动的却很少,我用到LVGL库,用spi进行数据传输时,屏幕刷新非常慢,需改为DMA,但是按网传的一些配置方法去做时,用DMA发送数据一直遇到屏幕显色不对的问题。几经折腾才发现原因,得到可行的方案,特此记录。
引脚配置
LCD_BL控制背光,高电平有效,低电平黑屏。
SPI配置
半双工模式:收发一条数据线,匹配屏幕的半双工接口
硬件控制CS,当然也可以自己软件控制,看个人喜好
波特率不超过60M,为了刷屏快,尽可能高
数据位8或16均可,原因后面讲(大坑)
DMA数据按16位。即half word
驱动文件
st7789.c
#include "st7789.h"
#include "spi.h"
// ST7789命令定义
#define ST7789_NOP 0x00
#define ST7789_SWRESET 0x01
#define ST7789_SLPIN 0x10
#define ST7789_SLPOUT 0x11
#define ST7789_INVOFF 0x20
#define ST7789_INVON 0x21
#define ST7789_DISPOFF 0x28
#define ST7789_DISPON 0x29
#define ST7789_CASET 0x2A
#define ST7789_RASET 0x2B
#define ST7789_RAMWR 0x2C
#define ST7789_MADCTL 0x36
// MADCTL参数
#define ST7789_MADCTL_MY 0x80
#define ST7789_MADCTL_MX 0x40
#define ST7789_MADCTL_MV 0x20
#define ST7789_MADCTL_ML 0x10
#define ST7789_MADCTL_MH 0x04
#define ST7789_MADCTL_RGB 0x00
#define ST7789_MADCTL_BGR 0x08
#define ST7789_SPI_INSTANCE hspi1
#define SPI_DC_LOW() HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET)
#define SPI_DC_HIGH() HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET)
#define SPI_RST_LOW() HAL_GPIO_WritePin(LCD_RES_GPIO_Port, LCD_RES_Pin, GPIO_PIN_RESET);
#define SPI_RST_HIGH() HAL_GPIO_WritePin(LCD_RES_GPIO_Port, LCD_RES_Pin, GPIO_PIN_SET);
//#define SPI_WriteByte(cmd) HAL_SPI_Transmit(&ST7789_SPI_INSTANCE, &cmd, 1, HAL_MAX_DELAY)
#define SPI_WriteByte(cmd) HAL_SPI_Transmit_DMA(&ST7789_SPI_INSTANCE, &cmd, 1)
// 设置SPI数据大小为8位
void SPI_SetDataSize_8bit(SPI_HandleTypeDef *hspi) {
hspi->Init.DataSize = SPI_DATASIZE_8BIT;
if (HAL_SPI_Init(hspi) != HAL_OK) {