聯盛德 W803-Pico 試用 - TFT 圖片顯示

發布於 2025-03-31 10:48:28

【聯盛德 W803-Pico 試用】TFT 圖片顯示

本文介紹了聯盛德 WM-IoT-SDK 2.X 工程結合 W803-Pico 板實現 TFT 屏幕驅動的項目設計,包括原理介紹、代碼解析、效果展示等。

介紹

TFT 彩色液晶屏在日常生活和工作中十分常見且應用廣泛,如便攜式顯示、車載顯示、計算機顯示(筆記本電腦、監視器)、家電和辦公室顯示(電視、互聯網絡終端)、手機、遊戲機、醫療設備等。

因此了解和學習使用 TFT 顯示屏一直是嵌入式開發中的熱點話題,同時驅動 TFT 屏也是考驗 MCU 綜合性能的極佳指標和參照。

1.8 寸 TFT 彩屏模塊

TFT_screen.jpg

原理圖

SCH_TFT.jpg

管腳定義

TFT_pins.jpg

參數規格

  • 型號:M_TFT_LCD_128X240_8P
  • 輸入電壓:2.8V 至 3.3V
  • 供電電流:>20mA
  • 顯示類型:1.8 inch TFT
  • 顯示色彩:262K
  • 分辨率:128 x RGB x 240
  • 視角:12 O'CLOCK
  • 驅動 IC: ST7735S
  • 接口類型:SPI
  • 背光模式:並聯 LED
  • 背光驅動方式:PWM
  • 結構類型:COG+DIP
  • 顯示區尺寸:35x28mm
  • 外形尺寸:55 x 34.7 x 12 mm
  • 工作溫度:-20°C ~ 70°C

參考:TFT .

硬件連接

GPIO序號 引腳編號 TFT 引腳
WM_GPIO_NUM_22 PB6 CLK (SCL)
WM_GPIO_NUM_23 PB7 MOSI (SDA)
WM_GPIO_NUM_27 PB11 CS
WM_GPIO_NUM_26 PB10 RESET
WM_GPIO_NUM_25 PB9 DC
WM_GPIO_NUM_24 PB8 BLK

參考:TFT_LCD_DMA — WinnerMicro 在線文檔

實物連線

TFT_board_connect_lines.jpg

工程測試

介紹了 WM-IoT-SDK 2.X 實現 TFT 屏驅動顯示的主要流程。

SDK 框圖

SDK_block.jpg

這裡我們使用 W803-Pico 開發板驅動 TFT 顯示屏,因此 SoC 選擇 W803,組件 - 外設驅動 - TFT LCD - st7735_spi ;

在相應的文件路徑下打開例程 wm_iot_sdk/examples/peripheral/tft_lcd/tft_lcd_dma ,右鍵 menuconfig 配置 SoC (W803)和 LCD Device (st7735_spi);

TFT-SDK-config.jpg

右鍵 build 構建工程,點擊 flash 並選擇開發板串口對應的端口號,實現固件上傳。

代碼

#include <stdio.h>
#include "wmsdk_config.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"

#include "wm_drv_tft_lcd.h"
#include "wm_drv_sdh_spi.h"
#include "picture.h"
#include "wm_utils.h"

#define LOG_TAG "lcd_example"
#include "wm_log.h"

static void wm_lcd_demo(void *arg)
{
    int ret = WM_ERR_FAILED;
    int id  = 0;

    wm_device_t *dev    = NULL;
    image_attr_t img    = { 0 };
    uint8_t *app_buf    = NULL;
    uint32_t block_size = 0;
    uint16_t width = 0, high = 0;
    wm_lcd_capabilitys_t cap = { 0 };

    lcd_demo_sem = xSemaphoreCreateCounting(1, 1);

    /*TODO: add more initial methods for other interfaces(like RGB/MIPI...) in future on new chip*/
    /*use sdio(spi mode) for lcd demo as it's support high speed */
    dev = wm_drv_sdh_spi_init(LCD_SPI_CONTROLLER_DEVICE_NAME);
    if (dev == NULL) {
        wm_log_error("init sdspi fail.");
    }

    /* initial the lcd device, and use the same device name which defined in device table*/
    dev = wm_drv_tft_lcd_init(LCD_DEVICE_NAME);
    if (dev == NULL) {
        wm_log_info("init lcd fail.");
    }

    /* turn on the backlight*/
    ret = wm_drv_tft_lcd_set_backlight(dev, true);
    if (ret != WM_ERR_SUCCESS) {
        wm_log_info("lcd bl set fail.");
    }

    /* show LCD capability */
    wm_drv_tft_lcd_get_capability(dev, &cap);
    wm_log_info("LCD x_resolution = %d", cap.x_resolution);
    wm_log_info("LCD y_resolution = %d", cap.y_resolution);
    wm_log_info("LCD rotation = %d\n", cap.rotation);

    //NOTE: when color mode change , the byte width could be adjusted too.
    /* malloc an application buffer to refresh the screen*/
    width = cap.x_resolution;
    high  = cap.y_resolution;

    block_size = (LCD_DATA_DRAW_LINE_UNIT * width * WM_CFG_TFT_LCD_PIXEL_WIDTH);
    wm_log_info("DEMO:block_size=%d", block_size);

    app_buf = malloc(block_size);
    if (app_buf == NULL) {
        wm_log_error("mem err\n");
    }

    /* set image and the image width, height depend on selected LCD device */
#if CONFIG_COMPONENT_DRIVER_LCD_NV3041A_SPI
    img.image_buf   = image_bluesky_480x272;
    img.image_width = 480;
    img.image_high  = 272;
#else
    img.image_buf   = gImage_pic_winner_micro_logo_93x93;
    img.image_width = 93;
    img.image_high  = 93;
#endif

    if (img.image_width > width || img.image_high > high) {
        wm_log_error("image unmatch");
    }

    /* Registers a callback function that gets triggered after the transmission of a bitmap is complete */
    ret = wm_drv_tft_lcd_register_tx_callback(dev, lcd_demo_tx_cb, NULL);
    if (ret != WM_ERR_SUCCESS) {
        wm_log_info("register tx callback error(%d)", ret);
    }

    while (1) {
        /* demo scenario 1 - show blue screen by dma*/
        wm_log_info("wm_lcd_demo show blue background");

        ret = lcd_demo_clean_screen_with_dma(dev, app_buf, block_size, LCD_RGB565_BLUE);
        if (ret != WM_ERR_SUCCESS) {
            wm_log_info("wm_lcd_demo_show_image ret=%d", ret);
        }
        vTaskDelay(pdMS_TO_TICKS(2000));

        /* demo scenario 2 - rotation the image once lcd_demo_show_image() be invoked*/
        if (id++ % 2) {
            ret = wm_drv_tft_lcd_set_rotation(dev, LCD_ROTATION_NONE);
        } else {
            ret = wm_drv_tft_lcd_set_rotation(dev, LCD_ROTATION_180_DEGREE);
        }

        /* demo scenario 3 - show image by dma*/
        wm_log_info("wm_lcd_demo show image(w=%d, h=%d)", img.image_width, img.image_high);

        ret = lcd_demo_show_image_with_dma(dev, app_buf, block_size, img);
        if (ret != WM_ERR_SUCCESS) {
            wm_log_info("wm_lcd_demo_show_image ret=%d", ret);
        }
        vTaskDelay(pdMS_TO_TICKS(2000));
    }

    free(app_buf);

    vSemaphoreDelete((QueueHandle_t)lcd_demo_sem);

    vTaskDelete(NULL);
}

int main(void)
{
    xTaskCreate(wm_lcd_demo, "wm_lcd_demo_task", WM_LCD_TFT_DEMO_TASK_STACK, NULL, WM_LCD_TFT_DEMO_TASK_PRIO, NULL);

    return 0;
}

效果

TFT_ST7735S_DMA.jpg

動態

TFT_ST7735S_DMA.gif

自定義圖片

這裡介紹修改工程,添加並實現自定義圖片的 TFT 顯示。

圖片制作

這裡使用 PowerPoint 繪制圖文,另存為 BMP 格式圖片;

ad-WM.bmp

取模

打開 Image2LCD 軟件,導入目標圖片,配置相關參數(注意勾選 高位在前 選項),輸出 .h 格式文件;

TFT_model_output.jpg

調試

將取模文件存放至主函數同一文件夾,在 picture.h 中增加取模文件 #include "pic_wm.h"

修改 void wm_lcd_demo 函數中關於圖片數組的調用信息

img.image_buf   = gImage_wm; // target picture array name
img.image_width = 93;
img.image_high  = 93;

保存文件,編譯工程,上傳固件。

效果

ad_show_TFT.jpg

動態

ad_show_TFT.gif

總結

本文介紹了聯盛德 WM-IoT-SDK 2.X 工程 Demo 結合 W803-Pico 板實現 TFT 屏幕驅動的項目設計,包括原理介紹、硬件連接、工程測試、代碼調試、自定義效果展示等,采用 DMA 硬件 SPI 驅動顯示屏,刷新速度快、延遲低、顯示質量佳,為相關驅動開發和顯示屏的應用提供了參考。

0 條評論

發布
問題