SOC-ESP32S3部分:31-ESP-LCD控制器庫

飛書文檔https://x509p6c8to.feishu.cn/wiki/Syy3wsqHLiIiQJkC6PucEJ7Snib

ESP 系列芯片可以支持市場上常見的 LCD(如 SPI LCD、I2C LCD、并行 LCD (Intel 8080)、RGB/SRGB LCD、MIPI DSI LCD 等)所需的各種時序。esp_lcd 控制器為上述各類 LCD 提供了一個統一的抽象驅動框架。

更多支持的接口例程可以查看:esp-idf/examples/peripherals/lcd

在開發LCD類應用時,我們可以優先選擇IDF自帶了部分驅動,例如NT35510 SSD1306 ST7789,這部分驅動位于esp-idf/components/esp_lcd中,或者,我們也可以在組件庫中查找,例如gc9a01

https://components.espressif.com/components?q=esp_lcd_gc9a01

這些驅動都是適配了esp_lcd控制器的,使用起來非常方便。

如果以上兩個方法都找不到對應驅動呢?這時候就需要我們自己寫了,有兩種辦法,

第一種是比較傳統的,是把廠家提供的驅動文件,修改為ESP32的接口,例如SPI、IO相關的函數,這部分可以參考我們SPI課程中,使用SPI適配的ST7789屏幕驅動。

第二種是推薦大家用的,把驅動按esp_lcd框架的方式封裝,找接近的芯片,更改部分參數即可,例如找不到ST7789的,我們可以找ST77916的,一般同一個廠家一系列的芯片,差異點只在初始化參數的不同。

https://components.espressif.com/components?q=esp_lcd_st

最終參考esp-idf/examples/peripherals/lcd/spi_lcd_touch實現的驅動:

步驟如下

  1. 初始化背光IO
  2. 初始化LCD的SPI配置
  3. 初始化其它顯示IO
  4. 初始化ST7789驅動
  5. 設置屏幕顯示方向顏色,打開背光
  6. 使用繪制函數繪制圖像esp_lcd_panel_draw_bitmap

初始化背光IO

?? gpio_config_t bk_gpio_config = {.mode = GPIO_MODE_OUTPUT, // 設置GPIO模式為輸出.pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT // 設置背光控制引腳};ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); // 配置GPIO

初始化LCD的SPI配置

?? spi_bus_config_t buscfg = {.sclk_io_num = EXAMPLE_PIN_NUM_SCLK, // SCLK引腳編號.mosi_io_num = EXAMPLE_PIN_NUM_MOSI, // MOSI引腳編號.miso_io_num = GPIO_NUM_NC,????????? // MISO引腳編號.quadwp_io_num = GPIO_NUM_NC,??????? // QUADWP引腳編號(未使用).quadhd_io_num = GPIO_NUM_NC,??????? // QUADHD引腳編號(未使用).max_transfer_sz = EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES * sizeof(uint16_t), // 最大傳輸大小};ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); // 初始化SPI總線

初始化其它顯示IO

?? ESP_LOGI(TAG, "Install panel IO");esp_lcd_panel_io_handle_t io_handle = NULL;esp_lcd_panel_io_spi_config_t io_config = {.dc_gpio_num = EXAMPLE_PIN_NUM_LCD_DC, // 數據/命令控制引腳編號.cs_gpio_num = EXAMPLE_PIN_NUM_LCD_CS, // 片選引腳編號.pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ, // 像素時鐘頻率.lcd_cmd_bits = EXAMPLE_LCD_CMD_BITS, // 命令位數.lcd_param_bits = EXAMPLE_LCD_PARAM_BITS, // 參數位數.spi_mode = 3, // SPI模式.trans_queue_depth = 10, // 傳輸隊列深度};// 將LCD連接到SPI總線ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle));

初始化ST7789驅動

?? // 安裝st7789面板驅動esp_lcd_panel_handle_t panel_handle = NULL;esp_lcd_panel_dev_config_t panel_config = {.reset_gpio_num = EXAMPLE_PIN_NUM_LCD_RST,? // 復位引腳編號.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, // RGB元素順序.bits_per_pixel = 16,?????????????????????? // 每像素位數.data_endian = LCD_RGB_DATA_ENDIAN_BIG,???? // MSB};ESP_LOGI(TAG, "Install st7789 panel driver");ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle));

設置屏幕顯示方向顏色,打開背光

?? // 復位和初始化面板ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); // 復位面板ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); // 初始化面板ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_handle, true)); // 反轉顏色ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel_handle, true, false)); // 鏡像顯示(水平鏡像)// 用戶可以在點亮屏幕或背光之前刷新預定義的圖案到屏幕上ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); // 打開屏幕顯示// 打開LCD背光ESP_LOGI(TAG, "Turn on LCD backlight");gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL); // 設置背光引腳電平

使用繪制函數繪制圖像esp_lcd_panel_draw_bitmap

// 設置液晶屏顏色
void lcd_set_color(uint16_t color)
{// 分配內存 這里分配了液晶屏一行數據需要的大小uint16_t *buffer = (uint16_t *)heap_caps_malloc(EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES * sizeof(uint16_t), MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);if (NULL == buffer){ESP_LOGE(TAG, "Memory for bitmap is not enough");}else{for (size_t i = 0; i < EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES; i++) // 給緩存中放入顏色數據{buffer[i] = color;}esp_lcd_panel_draw_bitmap(panel_handle, 0 + X_OFFSET, 0, EXAMPLE_LCD_H_RES + X_OFFSET, EXAMPLE_LCD_V_RES, buffer);free(buffer); // 釋放內存}
}

SPI屏幕

SPI屏幕使用的驅動芯片是ST7789,這個驅動芯片支持的分辨率是240*320,據廠家手冊說明可知,由于是異形屏幕,屏幕的分辨率是172*320,所以驅動芯片左右兩邊分別有34列((240-172)/2) = 34是沒有接到屏幕的,所以我們設置顯示地址是,要偏移34列,屏幕接線部分如下:

從原理圖可知:

SPI SCLK為GPIO_NUM_16
SPI MOSI為GPIO_NUM_17
SPI MISO不需要
LCD_DC為GPIO_NUM_21
LCD_RST為GPIO_NUM_18
LCD_CS為GPIO_NUM_15
背光IO為GPIO_NUM_2,背光有效電平為低電平

具體代碼如下

#include <stdio.h>
#include <unistd.h>
#include <sys/lock.h>
#include <sys/param.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_vendor.h"
#include "esp_lcd_panel_ops.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_err.h"
#include "esp_log.h"static const char *TAG = "example";// Using SPI2 in the example
#define LCD_HOST? SPI2_HOSTPlease update the following configuration according to your LCD spec //#define EXAMPLE_LCD_PIXEL_CLOCK_HZ???? (20 * 1000 * 1000)
#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL? 0
#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL#define EXAMPLE_PIN_NUM_SCLK?????????? GPIO_NUM_16
#define EXAMPLE_PIN_NUM_MOSI?????????? GPIO_NUM_17
#define EXAMPLE_PIN_NUM_MISO?????????? GPIO_NUM_NC
#define EXAMPLE_PIN_NUM_LCD_DC ????????GPIO_NUM_21
#define EXAMPLE_PIN_NUM_LCD_RST??????? GPIO_NUM_18
#define EXAMPLE_PIN_NUM_LCD_CS???????? GPIO_NUM_15
#define EXAMPLE_PIN_NUM_BK_LIGHT?????? GPIO_NUM_2// The pixel number in horizontal and vertical
#define EXAMPLE_LCD_H_RES????????????? 172
// Bit number used to represent command and parameter
#define EXAMPLE_LCD_V_RES????????????? 320
#define EXAMPLE_LCD_CMD_BITS?????????? 8
#define EXAMPLE_LCD_PARAM_BITS???????? 8// 列地址偏移示例(假設X起始偏移為0,Y起始偏移為40)
#define X_OFFSET 34
#define Y_OFFSET 0
#define Y_OFFSET_NUM 0esp_lcd_panel_handle_t panel_handle = NULL;typedef struct {int cmd;??????????????? /*<! The specific LCD command */const void *data;?????? /*<! Buffer that holds the command specific data */size_t data_bytes;????? /*<! Size of `data` in memory, in bytes */unsigned int delay_ms;? /*<! Delay in milliseconds after this command */
} st7789_lcd_init_cmd_t;typedef struct {const st7789_lcd_init_cmd_t *init_cmds;???uint16_t init_cmds_size;??? /*<! Number of commands in above array */struct {unsigned int use_qspi_interface: 1;???? /*<! Set to 1 if use QSPI interface, default is SPI interface */} flags;
} st7789_vendor_config_t;static const st7789_lcd_init_cmd_t lcd_init_cmds [] ={/* {cmd, { data }, data_size, delay_ms} "*/// {0x2A, (uint8_t []){0x00, X_OFFSET, 0x00, 0xEF - X_OFFSET}, 4, 0}, // 列地址 0~171 (0xAB = 171)// {0x2B, (uint8_t []){0x00, Y_OFFSET, 0x01, 0x3F - Y_OFFSET}, 4, 0}, // 行地址 0~319{0x11, (uint8_t []){0x00}, 0, 0},{0x36, (uint8_t []){0x00}, 1, 0},{0x3A, (uint8_t []){0x05}, 1, 0},{0xB2, (uint8_t []){0x0C, 0x0C, 0x00, 0x33, 0x33}, 5, 0},{0xB7, (uint8_t []){0x35}, 1, 0},{0xBB, (uint8_t []){0x35}, 1, 0},{0xC0, (uint8_t []){0x2C}, 1, 0},{0xC2, (uint8_t []){0x01}, 1, 0},{0xC3, (uint8_t []){0x13}, 1, 0},{0xC4, (uint8_t []){0x20}, 1, 0},{0xC6, (uint8_t []){0x0F}, 1, 0},{0xD0, (uint8_t []){0xA4, 0xA1}, 2, 0},{0xD6, (uint8_t []){0xA1}, 1, 0},{0xE0, (uint8_t []){0xF0, 0x00, 0x04, 0x04, 0x04, 0x05, 0x29, 0x33, 0x3e, 0x38, 0x12, 0x12, 0x28, 0x30}, 14, 0},{0xE1, (uint8_t []){0xF0, 0x07, 0x0A, 0x0D, 0x0b, 0x07, 0x28, 0x33, 0x3e, 0x36, 0x14, 0x14, 0x29, 0x32}, 14, 0},{0x21, (uint8_t []){0x00}, 0, 0},{0x11, (uint8_t []){0x00}, 0, 120},{0x29, (uint8_t []){0x00}, 0, 0},
};// 設置液晶屏顏色
void lcd_set_color(uint16_t color)
{// 分配內存 這里分配了液晶屏一行數據需要的大小uint16_t *buffer = (uint16_t *)heap_caps_malloc(EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES * sizeof(uint16_t), MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);if (NULL == buffer){ESP_LOGE(TAG, "Memory for bitmap is not enough");}else{for (size_t i = 0; i < EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES; i++) // 給緩存中放入顏色數據{buffer[i] = color;}esp_lcd_panel_draw_bitmap(panel_handle, 0 + X_OFFSET, 0, EXAMPLE_LCD_H_RES + X_OFFSET, EXAMPLE_LCD_V_RES, buffer);free(buffer); // 釋放內存}
}void app_main(void)
{// 關閉LCD背光ESP_LOGI(TAG, "Turn off LCD backlight");gpio_config_t bk_gpio_config = {.mode = GPIO_MODE_OUTPUT, // 設置GPIO模式為輸出.pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT // 設置背光控制引腳};ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); // 配置GPIO// 初始化SPI總線ESP_LOGI(TAG, "Initialize SPI bus");spi_bus_config_t buscfg = {.sclk_io_num = EXAMPLE_PIN_NUM_SCLK, // SCLK引腳編號.mosi_io_num = EXAMPLE_PIN_NUM_MOSI, // MOSI引腳編號.miso_io_num = GPIO_NUM_NC,????????? // MISO引腳編號.quadwp_io_num = GPIO_NUM_NC,??????? // QUADWP引腳編號(未使用).quadhd_io_num = GPIO_NUM_NC,??????? // QUADHD引腳編號(未使用).max_transfer_sz = EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES * sizeof(uint16_t), // 最大傳輸大小};ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); // 初始化SPI總線// 安裝面板IOESP_LOGI(TAG, "Install panel IO");esp_lcd_panel_io_handle_t io_handle = NULL;esp_lcd_panel_io_spi_config_t io_config = {.dc_gpio_num = EXAMPLE_PIN_NUM_LCD_DC, // 數據/命令控制引腳編號.cs_gpio_num = EXAMPLE_PIN_NUM_LCD_CS, // 片選引腳編號.pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ, // 像素時鐘頻率.lcd_cmd_bits = EXAMPLE_LCD_CMD_BITS, // 命令位數.lcd_param_bits = EXAMPLE_LCD_PARAM_BITS, // 參數位數.spi_mode = 3, // SPI模式.trans_queue_depth = 10, // 傳輸隊列深度};// 將LCD連接到SPI總線ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle));st7789_vendor_config_t vendor_config = {? // 用于替換驅動組件中的初始化命令及參數.init_cmds = lcd_init_cmds,.init_cmds_size = sizeof(lcd_init_cmds) / sizeof(st7789_lcd_init_cmd_t),};esp_lcd_panel_dev_config_t panel_config = {.reset_gpio_num = EXAMPLE_PIN_NUM_LCD_RST,? // 復位引腳編號.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, // RGB元素順序.bits_per_pixel = 16,?????????????????????? // 每像素位數.data_endian = LCD_RGB_DATA_ENDIAN_BIG,???? // MSB.vendor_config = &vendor_config,?????????? // 用于替換驅動組件中的初始化命令及參數};ESP_LOGI(TAG, "Install ST7789 panel driver");ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle));// 復位和初始化面板ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); // 復位面板ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); // 初始化面板ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_handle, true)); // 反轉顏色ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel_handle, false, false)); // 鏡像顯示(水平鏡像)// 用戶可以在點亮屏幕或背光之前刷新預定義的圖案到屏幕上ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); // 打開屏幕顯示// 打開LCD背光ESP_LOGI(TAG, "Turn on LCD backlight");gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL); // 設置背光引腳電平while(1){lcd_set_color(0xFFFF);vTaskDelay(1000 / portTICK_PERIOD_MS);ESP_LOGI(TAG, "lcd_set_color switch");lcd_set_color(0x001F);vTaskDelay(1000 / portTICK_PERIOD_MS);ESP_LOGI(TAG, "lcd_set_color switch");}
}

如果編譯報錯fatal error: esp_lcd_panel_io.h: No such file or directory

需要在main/CMakeLists.txt中添加esp_lcd組件

idf_component_register(SRCS "main.c"PRIV_REQUIRES esp_lcdINCLUDE_DIRS "")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908435.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蘋果電腦深度清理,讓老舊Mac重煥新生

在日常使用蘋果電腦的過程中&#xff0c;隨著時間推移&#xff0c;系統內會積累大量冗余數據&#xff0c;導致電腦運行速度變慢、磁盤空間緊張。想要讓設備恢復流暢&#xff0c;蘋果電腦深度清理必不可少。那么&#xff0c;如何進行蘋果電腦深度清理呢&#xff1f;接下來為你詳…

如何處理React中表單的雙向數據綁定?

在前端開發中&#xff0c;雙向數據綁定&#xff08;Two-way Data Binding&#xff09;是指視圖&#xff08;View&#xff09;與數據模型&#xff08;Model&#xff09;之間保持同步&#xff1a;當模型發生變化時&#xff0c;視圖會自動更新&#xff1b;當視圖&#xff08;用戶輸…

手機上網可以固定ip地址嗎?詳細解析

在移動互聯網時代&#xff0c;手機已成為人們日常上網的主要設備之一。無論是工作、學習還是娛樂&#xff0c;穩定的網絡連接都至關重要。許多用戶對IP地址的概念有所了解&#xff0c;尤其是固定IP地址的需求。那么&#xff0c;手機上網能否固定IP地址&#xff1f;又該如何實現…

Spring Boot + Prometheus 實現應用監控(基于 Actuator 和 Micrometer)

文章目錄 Spring Boot Prometheus 實現應用監控&#xff08;基于 Actuator 和 Micrometer&#xff09;環境準備示例結構啟動和驗證驗證 Spring Boot 應用Prometheus 抓取配置&#xff08;靜態方式&#xff09;Grafana 面板配置總結 Spring Boot Prometheus 實現應用監控&…

rk3588 上運行smolvlm-realtime-webcam,將視頻轉為文字描述

smolvlm-realtime-webcam 是一個開源項目&#xff0c;結合了輕量級多模態模型 SmolVLM 和本地推理引擎 llama.cpp&#xff0c;能夠在本地實時處理攝像頭視頻流&#xff0c;生成自然語言描述&#xff0c; 開源項目地址 https://github.com/ngxson/smolvlm-realtime-webcamhttps…

原生js操作元素類名(classList,classList.add...)

1、classList classList屬性是一個只讀屬性&#xff0c;返回元素的類名&#xff0c;作為一個DOMTokenList集合(用于在元素中添加&#xff0c;移除及切換css類) length:返回類列表中類的數量&#xff0c;該屬性是只讀的 <style> .lis { width: 200px; …

九.C++ 對引用的學習

一.基本概念 引用即內存的別名 int a 10; int& b a; 引用本身不占用內存&#xff0c;并非實體&#xff0c;對引用的所有操作都是在對目標內存進行操作 引用必須初始化&#xff0c;且不能更換對象 int c 5; b c; // 僅僅是在對引用的目標內存進行賦值 #include <ios…

7.2.1_順序查找

知識總覽&#xff1a; 順序查找&#xff1a; 算法思想&#xff1a; 從頭到腳挨個找或者從腳到頭挨個找適用于線性表(順序存儲和鏈式存儲都適用)&#xff0c;又叫線性查找 實現&#xff1a; 1個數組elem指向數組的起始位置&#xff0c;索引從0開始遍歷數組直到找到目標值返回…

視覺SLAM基礎補盲

3D Gaussian Splatting for Real-Time Radiance Field Rendering SOTA方法3DGS contribution傳統重建基于點的渲染NeRF 基礎知識補盲光柵化SFM三角化極線幾何標準的雙目立體視覺立體匹配理論與方法立體匹配的基本流程李群和李代數 李群和李代數的映射李代數的求導李代數解決求導…

如何利用 Redis 實現跨多個無狀態服務實例的會話共享?

使用 Redis 實現跨多個無狀態服務實例的會話共享是一種非常常見且有效的方案。無狀態服務本身不存儲會話信息&#xff0c;而是將用戶的會話數據集中存儲在外部存儲中&#xff08;如 Redis&#xff09;&#xff0c;這樣任何一個服務實例都可以通過查詢外部存儲來獲取和更新用戶的…

《chipyard》docker使用

一、啟動/重啟服務 二、登入/退出 容器對象查看 sudo docker ps -a # 查看容器列表 登入已例化的容器 sudo docker exec -it -u root 737ed3ddd5ff bash # 737ed3ddd5ff<容器名稱/ID> 三、容器編輯 刪除單個容器 sudo docker stop <容器ID> #停止容器 s…

瀏覽器工作原理06 [#]渲染流程(下):HTML、CSS和JavaScript是如何變成頁面的

引用 瀏覽器工作原理與實踐 簡單回顧下上節前三個階段的主要內容&#xff1a;在HTML頁面內容被提交給渲染引擎之后&#xff0c;渲染引擎首先將HTML解析為瀏覽器可以理解的DOM&#xff1b;然后根據CSS樣式表&#xff0c;計算出DOM樹所有節點的樣式&#xff1b;接著又計算每個元素…

AI書簽管理工具開發全記錄(十三):TUI基本框架搭建

文章目錄 AI書簽管理工具開發全記錄&#xff08;十三&#xff09;&#xff1a;TUI基本框架搭建前言 &#x1f4dd;1.TUI介紹 &#x1f50d;2. 框架選擇 ??3. 功能梳理 &#x1f3af;4. 基礎框架搭建??4.1 安裝4.2 參數設計4.3 繪制ui4.3.1 設計結構體4.3.2 創建頭部4.3.3 創…

CC7利用鏈深度解析

CommonsCollections7&#xff08;CC7&#xff09;是CC反序列化利用鏈中的重要成員&#xff0c;由Matthias Kaiser在2016年發現。本文將從底層原理到實戰利用&#xff0c;全面剖析這條獨特而強大的利用鏈。 一、CC7鏈技術定位 1.1 核心價值 無第三方依賴&#xff1a;僅需JDK原…

openvino使用教程

OpenVINO使用教程 本專欄內容支持平臺章節計劃 本專欄內容 OpenVINO 是一款開源工具包&#xff0c;用于在云端、本地和邊緣部署高性能 AI 解決方案。我們可以使用來自最熱門模型框架的生成式和傳統 AI 模型來開發應用程序。充分利用英特爾 硬件的潛力&#xff0c;使用openvino…

ESP8266(NodeMcu)+GPS模塊+TFT屏幕實現GPS碼表

前言 去年寫過一篇關于使用esp8266(nodemcu)gps模塊oled屏幕diy的gps定位器的文章.點擊回顧 .無奈OLED屏幕太小了,最近剛好有時間又折騰使用TFT屏幕diy了一款gps碼表 效果如圖 材料準備 依舊是請出我們的兩位老演員 nocdmcu一塊. GPS定位模塊(我買的大夏龍雀的DX-GP10-GP…

解決獲取視頻第一幀黑屏問題

文章目錄 解決獲取視頻第一幀黑屏問題核心代碼 解決獲取視頻第一幀黑屏問題 廢話不多說&#xff0c;直接上代碼&#xff1a; <script setup> const status ref(請點擊“添加視頻”按鈕添加視頻) const videoElement ref(document.createElement(video)) const curren…

通過BUG(prvIdleTask、pxTasksWaitingTerminatio不斷跳轉問題)了解空閑函數(prvIdleTask)和TCB

一、前言與問題 在基于 FreeRTOS 的嵌入式系統中&#xff0c;我使用 STM32F1 開發一個 MQTT 客戶端應用&#xff0c;涉及兩個主要任務&#xff1a; ATRecvParser&#xff1a;負責解析 Wi-Fi 模塊的 AT 命令響應&#xff08;如 OK、ERROR 和 IPD 數據&#xff09;。MQTT_Clien…

繼MySQL之后的技術-JDBC-從淺到深-02

目錄 概念 編程六部曲 SQL注入和statement 工具類的封裝 JDBC事務 模糊查詢 批處理 數據庫連接池 Apache-DBUtils BasicDao 概念 JDBC為訪問不同的數據庫提供了統一的接口&#xff0c;為使用者屏蔽了細節問題。 Java程序員使用JDBC&#xff0c;可以連接任何提供了JD…

【配置 YOLOX 用于按目錄分類的圖片數據集】

現在的圖標點選越來越多&#xff0c;如何一步解決&#xff0c;采用 YOLOX 目標檢測模式則可以輕松解決 要在 YOLOX 中使用按目錄分類的圖片數據集&#xff08;每個目錄代表一個類別&#xff0c;目錄下是該類別的所有圖片&#xff09;&#xff0c;你需要進行以下配置步驟&#x…