1. 程式人生 > 其它 >聯盛德 HLK-W806 (九): 軟體SPI和硬體SPI驅動ST7789V液晶LCD

聯盛德 HLK-W806 (九): 軟體SPI和硬體SPI驅動ST7789V液晶LCD

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介紹

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

參考