聯盛德 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

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM