聯盛德 HLK-W806 (九): 軟體SPI和硬體SPI驅動ST7789V液晶LCD
目錄
- 聯盛德 HLK-W806 (一): Ubuntu20.04下的開發環境配置, 編譯和燒錄說明
- 聯盛德 HLK-W806 (二): Win10下的開發環境配置, 編譯和燒錄說明
- 聯盛德 HLK-W806 (三): 免按鍵自動下載和復位
- 聯盛德 HLK-W806 (四): 軟體SPI和硬體SPI驅動ST7735液晶LCD
- 聯盛德 HLK-W806 (五): W801開發板上手報告
- 聯盛德 HLK-W806 (六): I2C驅動SSD1306 128x64 OLED液晶屏
- 聯盛德 HLK-W806 (七): 相容開發板 LuatOS Air103
- 聯盛德 HLK-W806 (八): 4線SPI驅動SSD1306/SSD1315 128x64 OLED液晶屏
- 聯盛德 HLK-W806 (九): 軟體SPI和硬體SPI驅動ST7789V液晶LCD
ST7789介紹
ST7789/ST7789V/ST7789H2, 用於單片驅動262K色影象TFT-LCD, 包含 720(240*3色) x 320 線輸出, 可以直接以SPI協議, 或者8位/9位/16位/18位並行連線外部控制器. 顯示資料儲存在片內 240x320x18 bits記憶體中, 顯示記憶體的讀寫不需要外部時鐘驅動.
ST7789有 ST7789, ST7789V, ST7789H2等型號, 解析度有240x204, 240x240, 240x320等多種型別, 驅動方式都是一樣的.
接線
ST7789的接線有7針/8針和相容並口的40針, 會比ST7735多一些, 一部分是用於背光LED, 因為顯示面積更大, 所以背光LED數量更多, 另一部分是用於模式控制. 主要的部分接線和ST7735是一樣的, 具體要檢視顯示屏的使用手冊. 對應本測試的連線方式為
- B10 -> RES, RESET
- B11 -> DC, CD
- B14 -> CS, Chip Select
- B15 -> SCK, SCL, CLK, Clock
- B16 -> BL(或LEDx), 有可能有多個接線LEDA, LEDK, LEDK1, LEDK2, 根據顯示屏接線說明接高電平, 低電平, 或接GPIO控制.
- B17 -> MOSI, SDA
- GND -> GND
- 3.3V -> VCC
使用本示例, 需要確認ST7789是工作在4線SPI模式. ST7789的控制部分和ST7735是完全一樣的
演示程式碼的使用
演示程式碼位於 wm-sdk-w806/tree/main/demo/spi/st77xx_lcd, 檔案結構為
.
├── ascii_fonts.c # 英文字型檔案
├── ascii_fonts.h # 英文字型標頭檔案
├── main.c # 程式入口
├── st7735.c # ST7735的初始化方法
├── st7735.h # ST7735的標頭檔案
├── st7789.c # ST7789的初始化方法
├── st7789.h # ST7789的標頭檔案
├── st77xx.c # ST7735和ST7789的公共方法
├── st77xx.h # ST7735和ST7789的公共方法標頭檔案
├── testimg.h # 測試圖片, 尺寸為128x128
├── wm_hal_msp.c # 外設初始化方法
└── wm_it.c # 中斷處理方法
將專案 app/src 目錄下的檔案除了Makefile全部刪除, 將演示程式碼複製到 app/src
根據裝置配置選項
演示程式碼預設使用的是ST7735, 需要對ST7789作一些修改
st77xx.h
在這裡設定
- ST77XX_BUF_SIZE 緩衝的大小, 單位為位元組
- ST77XX_HARDWARE_SPI 是否使用硬體SPI, 0:否, 1:是
- ST77XX__PORT 和 ST77XX__PIN 各pin腳的選擇
可以保持預設不修改
#define ST77XX_BUF_SIZE 1024
#define ST77XX_HARDWARE_SPI 1
// CS: B4, B14
#define ST77XX_CS_PORT GPIOB
#define ST77XX_CS_PIN GPIO_PIN_14
// SCK: B1, B2, B15, B24
#define ST77XX_SCK_PORT GPIOB
#define ST77XX_SCK_PIN GPIO_PIN_15
// MOSI: B5, B17, B26, PA7
#define ST77XX_MOSI_PORT GPIOB
#define ST77XX_MOSI_PIN GPIO_PIN_17
// MISO: B0, B3, B16, B25
#define ST77XX_RES_PORT GPIOB
#define ST77XX_RES_PIN GPIO_PIN_10
#define ST77XX_DC_PORT GPIOB
#define ST77XX_DC_PIN GPIO_PIN_11
#define ST77XX_BL_PORT GPIOB
#define ST77XX_BL_PIN GPIO_PIN_16
在下面的液晶屏尺寸和顯示方向色彩格式中選擇適合自己螢幕的配置, 並取消註釋, 將預設的註釋掉, 注意不要重複定義, 如果沒有合適的就需要自己定義
對於240x320的ST7789 TFT LCD, 可以使用
#define ST77XX_WIDTH 240
#define ST77XX_HEIGHT 320
#define ST77XX_XSTART 0
#define ST77XX_YSTART 0
#define ST77XX_ROTATION (ST77XX_MADCTL_MX | ST77XX_MADCTL_MY | ST77XX_MADCTL_RGB)
main.c
在main.c中將"st7735.h"修改為"st7789.h"
#include "st7789.h"
#include "testimg.h"
修改main()方法中初始化方法為 ST7789_Init();
void main(void)
{
//...
ST77XX_GPIO_Init();
SPI_Init();
ST7789_Init();
//...
}
然後就可以編譯寫入W806了
圖形方法可以參考ST7735這篇的說明
W806 SPI驅動ST7789的重新整理率
在ST7789V 240x320 LCD中, 通過以下程式碼在主程序中測試兩幅240x320圖片無間斷迴圈重新整理
for (uint16_t i = 0; i < 1000; i++)
{
ST77XX_DrawImage(0, 0, 128, 160, (uint16_t *)testimage1);
ST77XX_DrawImage(0, 0, 128, 160, (uint16_t *)testimage2);
}
printf("done");
實測400次重新整理大約29.2秒, 約13.69FPS, ST7789配置的重新整理率是60Hz, 不是ST7789的瓶頸.
視訊演示
視訊演示: https://www.bilibili.com/video/BV1bL4y1J7X5