您的位置:

ST7789 LCD显示屏的使用

一、概述

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的学习,能够帮助我们更好的了解嵌入式系统的开发,并能够在实际应用中得到更好的运用。