一、概述
ST7789是一款广泛应用于嵌入式系统中的LCD控制器,它可以驱动240x240、240x320等不同分辨率的显示屏。ST7789支持SPI接口,可以使用硬件SPI或者软件SPI进行通讯,还支持横屏和竖屏显示等多种功能。本文将基于STM32平台,结合官方提供的ST7789驱动库,进行详细的操作说明。
二、硬件连接
在将ST7789显示屏连接到STM32上之前,我们需要查阅ST7789显示屏的数据手册,确定它的引脚分布。常见的ST7789显示屏引脚如下所示:
-------------------------- | | | ST7789显示屏 | | | | SCL ---> PB3 | | SDA ---> PB5 | | DC ---> PB4 | | RES ---> PB6 | | CS ---> PB7 | | BLK ---> GND | | | --------------------------
其中,SCL、SDA、DC、RES、CS分别对应STM32的GPIO引脚,BLK是显示屏的背光控制引脚,接地则显示屏背光常亮。
三、软件配置
1、下载ST7789驱动库
首先,我们需要从官方网站上下载ST7789的驱动库。下载地址为:https://www.st.com/content/st_com/zh/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries/stsw-stm32090.html 。下载解压后,将inc和src文件夹中的内容拷贝到工程目录下。
2、修改驱动库头文件
在下载的ST7789驱动库中,需要修改一些内容才能够正确驱动ST7789显示屏。我们需要按照以下步骤来进行修改:
[1] 打开st7789.h文件,在头文件中添加如下代码:
/* ST7789显示屏参数定义 */ #define ST7789_WIDTH 240 #define ST7789_HEIGHT 240 #define ST7789_PIXEL (ST7789_WIDTH * ST7789_HEIGHT) #define ST7789_SPI SPI2
[2] 在st7789.h文件中找到“#define ST7789_SPI_MODE SPI_MODE_3”一行代码,将其注释掉。
[3] 打开st7789.c文件,在头文件中添加如下代码:
#define ST7789_SPI_GPIO_PORT GPIOB #define ST7789_SPI_GPIO_CLK RCC_APB2Periph_GPIOB #define ST7789_SPI_SCK_PIN GPIO_Pin_3 #define ST7789_SPI_SCK_AF GPIO_AF_SPI2 #define ST7789_SPI_SCK_PIN_SOURCE GPIO_PinSource3 #define ST7789_SPI_MOSI_PIN GPIO_Pin_5 #define ST7789_SPI_MOSI_AF GPIO_AF_SPI2 #define ST7789_SPI_MOSI_PIN_SOURCE GPIO_PinSource5 #define ST7789_LCD_DC_PORT GPIOB #define ST7789_LCD_DC_PIN GPIO_Pin_4 #define ST7789_LCD_RES_PORT GPIOB #define ST7789_LCD_RES_PIN GPIO_Pin_6 #define ST7789_LCD_CS_PORT GPIOB #define ST7789_LCD_CS_PIN GPIO_Pin_7
[4] 在st7789.c文件中找到“#define ST7789_SPI_Init(...)”一行代码,将其注释掉。
3、初始化SPI
在STM32中,我们需要通过SPI接口来与ST7789进行通讯。因此,我们需要初始化SPI外设。
void SPI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; //1.打开SPI时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //2.打开SPI引脚GPIO时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //3.设置SPI引脚GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); //4.配置SPI功能引脚映射 GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI2); //5.配置SPI外设 SPI_I2S_DeInit(SPI2); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 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_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; SPI_Init(SPI2, &SPI_InitStructure); //6.开启SPI外设 SPI_Cmd(SPI2, ENABLE); }
四、驱动ST7789显示屏
首先,我们需要按照以下步骤来配置ST7789:
[1] 初始化SPI
SPI2_Init();
[2] 初始化GPIO引脚
GPIO_InitTypeDef GPIO_InitStructure; //打开GPIO时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //配置LCD_DC引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); //配置LCD_RES引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); //配置LCD_CS引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure);
[3] 初始化ST7789
//LCD引脚初始化 LCD_GPIO_Init(); //重置LCD LCD_Reset(); //初始化LCD LCD_Init();
[4] 显示图像
//清空屏幕 LCD_Clear(BLACK); //画两条直线 LCD_DrawLine(0, 0, 239, 239, RED); LCD_DrawLine(239, 0, 0, 239, GREEN); //显示一张图片 LCD_ShowImage(Image);
其中,LCD_GPIO_Init()函数用于初始化ST7789的GPIO引脚,LCD_Reset()函数用于将ST7789进行复位操作,LCD_Init()函数用于初始化ST7789,LCD_Clear()函数用于清空显示屏,LCD_DrawLine()函数用于画直线,LCD_ShowImage()函数用于显示图片。
五、总结
本文详细介绍了ST7789的硬件连接、软件配置、以及如何驱动ST7789显示屏。通过对ST7789的学习,能够帮助我们更好的了解嵌入式系统的开发,并能够在实际应用中得到更好的运用。