一、概述
ST7789是一款廣泛應用於嵌入式系統中的LCD控制器,它可以驅動240×240、240×320等不同分辨率的顯示屏。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的學習,能夠幫助我們更好的了解嵌入式系統的開發,並能夠在實際應用中得到更好的運用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/200871.html