ESP32-S3學習筆記<3>:UART的應用

ESP32-S3學習筆記<3>:UART的應用

  • 1. 頭文件包含
  • 2. UART的配置
    • 2.1 uart_num的選擇
    • 2.2 uart_config的設定
      • 2.2.1 baud_rate/波特率設置
      • 2.2.2 data_bits/數據位數設置
      • 2.2.3 parity/奇偶校驗位設置
      • 2.2.4 stop_bits/停止位設置
      • 2.2.5 flow_ctrl/流控位設置
      • 2.2.6 rx_flow_ctrl_thresh/接收流控門限設置
      • 2.2.6 lp_source_clk/指定時鐘源
  • 3. UART使用的GPIO的配置
  • 4. UART驅動的加載
  • 5. 獲取緩沖中的數據量
  • 6. 讀取和寫入數據
  • 7. 示例

1. 頭文件包含

#include "driver/gpio.h"
#include "hal/gpio_types.h"
#include "driver/uart.h"
#include "esp_err.h"

2. UART的配置

使用如下函數配置UART:

esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config);

各個參數的含義:

2.1 uart_num的選擇

這個參數用來選擇配置哪個UART。可用的選項有:

typedef enum {UART_NUM_0,                         /*!< UART port 0 */UART_NUM_1,                         /*!< UART port 1 */
#if SOC_UART_HP_NUM > 2UART_NUM_2,                         /*!< UART port 2 */
#endif
#if SOC_UART_HP_NUM > 3UART_NUM_3,                         /*!< UART port 3 */
#endif
#if SOC_UART_HP_NUM > 4UART_NUM_4,                         /*!< UART port 4 */
#endif
#if (SOC_UART_LP_NUM >= 1)LP_UART_NUM_0,                      /*!< LP UART port 0 */
#endifUART_NUM_MAX,                       /*!< UART port max */
} uart_port_t;

對于ESP32-S3,一共有3個UART。但是 UART_NUM_0 一般給系統下載和調試用,所以一般用 UART_NUM_1UART_NUM_2

2.2 uart_config的設定

第二個參數用來配置UART的工作參數。結構體 **uart_config_t ** 的定義如下:

typedef struct {int baud_rate;                      /*!< UART baud rate*/uart_word_length_t data_bits;       /*!< UART byte size*/uart_parity_t parity;               /*!< UART parity mode*/uart_stop_bits_t stop_bits;         /*!< UART stop bits*/uart_hw_flowcontrol_t flow_ctrl;    /*!< UART HW flow control mode (cts/rts)*/uint8_t rx_flow_ctrl_thresh;        /*!< UART HW RTS threshold*/union {uart_sclk_t source_clk;             /*!< UART source clock selection */
#if (SOC_UART_LP_NUM >= 1)lp_uart_sclk_t lp_source_clk;       /*!< LP_UART source clock selection */
#endif};struct {uint32_t backup_before_sleep: 1;    /*!< If set, the driver will backup/restore the HP UART registers before entering/after exiting sleep mode.By this approach, the system can power off HP UART's power domain.This can save power, but at the expense of more RAM being consumed */} flags;                                /*!< Configuration flags */
} uart_config_t;

2.2.1 baud_rate/波特率設置

用于設定UART的波特率。直接填入數據即可。例如115200。但是最大不超過5000000。

2.2.2 data_bits/數據位數設置

設定數據位。可用的選項有:

typedef enum {UART_DATA_5_BITS   = 0x0,    /*!< word length: 5bits*/UART_DATA_6_BITS   = 0x1,    /*!< word length: 6bits*/UART_DATA_7_BITS   = 0x2,    /*!< word length: 7bits*/UART_DATA_8_BITS   = 0x3,    /*!< word length: 8bits*/UART_DATA_BITS_MAX = 0x4,
} uart_word_length_t;

最常見是8bit傳輸,即 UART_DATA_8_BITS

2.2.3 parity/奇偶校驗位設置

設定奇偶校驗位。可用的選項有:

typedef enum {UART_PARITY_DISABLE  = 0x0,  /*!< Disable UART parity*/UART_PARITY_EVEN     = 0x2,  /*!< Enable UART even parity*/UART_PARITY_ODD      = 0x3   /*!< Enable UART odd parity*/
} uart_parity_t;

大多數時候都設置為 UART_PARITY_DISABLE ,即不使用奇偶校驗位。不過根據實際使用要求選擇。

2.2.4 stop_bits/停止位設置

設定停止位長度。可用的選項有:

typedef enum {UART_STOP_BITS_1   = 0x1,  /*!< stop bit: 1bit*/UART_STOP_BITS_1_5 = 0x2,  /*!< stop bit: 1.5bits*/UART_STOP_BITS_2   = 0x3,  /*!< stop bit: 2bits*/UART_STOP_BITS_MAX = 0x4,
} uart_stop_bits_t;

停止位可以是1位、1.5位、2位。常見的是使用1位。

2.2.5 flow_ctrl/流控位設置

設定是否使用硬件流控。可用的選項有:

typedef enum {UART_HW_FLOWCTRL_DISABLE = 0x0,   /*!< disable hardware flow control*/UART_HW_FLOWCTRL_RTS     = 0x1,   /*!< enable RX hardware flow control (rts)*/UART_HW_FLOWCTRL_CTS     = 0x2,   /*!< enable TX hardware flow control (cts)*/UART_HW_FLOWCTRL_CTS_RTS = 0x3,   /*!< enable hardware flow control*/UART_HW_FLOWCTRL_MAX     = 0x4,
} uart_hw_flowcontrol_t;

根據需要選擇。一般2線UART應用,設置為 UART_HW_FLOWCTRL_DISABLE

2.2.6 rx_flow_ctrl_thresh/接收流控門限設置

ESP32-S3有3個UART,同時內置1KB的FIFO。這個FIFO由所有的3個UART分享。由于3個UART有6個通道(3發3收),所以默認情況下,每個UART分得128B的FIFO空間(需要注意,這個FIFO空間是可調的,但是一般情況下無需調整)。
在這里插入圖片描述
rx_flow_ctrl_thresh 用于設置接收流控門限。因為接收緩存默認128B,rx_flow_ctrl_thresh 設置為比128B略小的數據即可,比如120。也就是接收FIFO內容超過120字節,產生接收流控。
這個僅在使能了硬件流控(flow_ctrl = UART_HW_FLOWCTRL_RTS 或者flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS)時候有效。

2.2.6 lp_source_clk/指定時鐘源

該參數指定UART時鐘源。有如下選項:

typedef enum {UART_SCLK_APB = SOC_MOD_CLK_APB,     /*!< UART source clock is APB CLK */UART_SCLK_RTC = SOC_MOD_CLK_RC_FAST, /*!< UART source clock is RC_FAST */UART_SCLK_XTAL = SOC_MOD_CLK_XTAL,   /*!< UART source clock is XTAL */UART_SCLK_DEFAULT = SOC_MOD_CLK_APB, /*!< UART source clock default choice is APB */
} soc_periph_uart_clk_src_legacy_t;

缺省使用 SOC_MOD_CLK_APB 即可。

3. UART使用的GPIO的配置

esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num);
  1. uart_num:同上,指定哪一個UART。
  2. tx_io_num:指定UART-TX GPIO。
  3. rx_io_num:指定UART-RX GPIO。
  4. rts_io_num:指定UART-RTS GPIO。
  5. cts_io_num:指定UART-CTS GPIO。
    一般情況下,使用2線UART,則不需要使用CTS引腳和RTS引腳。則后兩個參數設置為 UART_PIN_NO_CHANGE 。還有一些場合,只需要使用接收或發送,則另一個不用的發送或接收引腳也設置為 UART_PIN_NO_CHANGE

4. UART驅動的加載

使用如下函數加載驅動。

esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t* uart_queue, int intr_alloc_flags);
  1. uart_num:指定使用哪一個UART外設。
  2. rx_buffer_size:指定接收緩存大小。
  3. tx_buffer_size:指定發送緩存大小。這兩個緩存大小,不是指UART外設中FIFO的大小,而是由驅動開辟的位于內存中的緩存大小。接收緩沖大小 rx_buffer_size 必需大于分配給UART外設的接收FIFO的大小(例如,當接收FIFO是默認值128時,則設置為大于128的值)。發送緩沖大小 tx_buffer_size 必需大于分配給UART外設的發送FIFO的大小,或者設置為0。如果設置為0,則發送是阻塞的,發送函數會在數據完全發送后返回(個人理解應該是發送數據全部填入到發送FIFO后就返回)。
  4. queue_size:事件隊列大小。所謂事件隊列,是UART操作(如發送或接收)觸發了某個事件,如發送完成或接收到數據、超時之類的,則產生一個事件,給用戶處理。不需要,則設置為0。
  5. uart_queue:這是一個出參,不使用消息隊列時,設置為NULL即可。
  6. intr_alloc_flags:指定一些標記,如中斷優先級等。定義在 esp_intr_alloc.h 文件中。注意不可使用 ESP_INTR_FLAG_IRAM ,因為驅動的ISR程序沒有定義在內部指令RAM中。

5. 獲取緩沖中的數據量

在從驅動讀取數據之前,一般要先獲取緩沖中有多少數據可讀;在向驅動寫入數據之前,一般要先獲取緩沖中有多少空閑空間可寫。如下兩個函數可實現這兩項功能。

esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t *size) ;esp_err_t uart_get_tx_buffer_free_size(uart_port_t uart_num, size_t *size) ;

6. 讀取和寫入數據

int uart_read_bytes(uart_port_t uart_num, void *buf, uint32_t length, TickType_t ticks_to_wait) ;int uart_write_bytes(uart_port_t uart_num, const void *src, size_t size) ;

對于讀取數據,可以通過參數 ticks_to_wait 指定等待超時時間,以FreeRTOS中的systick計數為單位。

7. 示例

以下程序示例中,配置一個UART接口,然后安裝驅動,循環從驅動中讀取數據并發送回去,從而實現上位機發送數據的loopback。
test_uart.h文件:

#define TEST_UART_UART_GPIO_TX        (GPIO_NUM_4)
#define TEST_UART_UART_GPIO_RX        (GPIO_NUM_5)
#define TEST_UART_UART_NUM            (UART_NUM_1)void TEST_UART_UARTConfig(void) ;
void TEST_UART_UARTRecv2Send(void) ;

test_uart.c文件:

#include "driver/gpio.h"
#include "hal/gpio_types.h"
#include "driver/uart.h"
#include "esp_err.h"#include "test_uart.h"void TEST_UART_UARTConfig(void)
{esp_err_t iRetVal ;const uart_config_t stUARTConfig ={.baud_rate           = 115200 ,.data_bits           = UART_DATA_8_BITS ,.parity              = UART_PARITY_DISABLE ,.stop_bits           = UART_STOP_BITS_1 ,.flow_ctrl           = UART_HW_FLOWCTRL_DISABLE ,.rx_flow_ctrl_thresh = 64 ,.source_clk          = UART_SCLK_APB } ;/* config UART */iRetVal = uart_param_config(TEST_UART_UART_NUM, &stUARTConfig) ;ESP_ERROR_CHECK(iRetVal) ;/* set UART TX & RX GPIO */iRetVal = uart_set_pin(TEST_UART_UART_NUM, TEST_UART_UART_GPIO_TX, TEST_UART_UART_GPIO_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE) ;ESP_ERROR_CHECK(iRetVal) ;/* install driver */iRetVal = uart_driver_install(TEST_UART_UART_NUM, 128 * 4, 128 * 4, 0, NULL, 0);ESP_ERROR_CHECK(iRetVal) ;return ;
}void TEST_UART_UARTRecv2Send(void)
{size_t        szSize = 0 ;unsigned char ucBuffer[128] ;esp_err_t     iRetVal ;int           iReadSize ;/* get rx data size */iRetVal = uart_get_buffered_data_len(TEST_UART_UART_NUM, &szSize) ;ESP_ERROR_CHECK(iRetVal) ;if(0 != szSize){iReadSize = uart_read_bytes(TEST_UART_UART_NUM, (void *)ucBuffer, (szSize > sizeof(ucBuffer)) ? sizeof(ucBuffer) : szSize, 10) ;if(0 < iReadSize){uart_write_bytes(TEST_UART_UART_NUM, (void *)ucBuffer, iReadSize) ;}}
}

main.c文件:

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"#include "test_uart.h"void app_main(void)
{TEST_UART_UARTConfig() ;while (true){TEST_UART_UARTRecv2Send() ;vTaskDelay(50) ;}
}

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

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

相關文章

【Vue3】加載高德地圖案例

官方API:展示地圖-入門教程-地圖 JS API 2.0 | 高德地圖API 1、獲取高德Key 參考&#xff1a;準備-地圖 JS API 2.0 | 高德地圖API 2、創建工程 npm create vitelatest 3、下載依賴集運行項目 npm install npm i amap/amap-jsapi-loader --save npm run dev 4、編寫核心…

【工具】Pycharm隱藏側邊燈泡提示

問題描述 在Pycharm中&#xff0c;每行前面很容易出現一個小燈泡&#xff0c;有時候很影響操作&#xff0c;需要將其取消掉設置方法打開設置 按 CtrlAltS 打開設置對話框或者通過菜單 File → Settings&#xff08;在 macOS 上是 PyCharm → Preferences&#xff09;導航到外觀…

XSS相關理解

由于本人對一小部分dom型xss、原型鏈污染和存儲型xss理解不夠透徹&#xff0c;因此在本篇文章中原型鏈污染和存儲型xss偏重進行概念理解或簡單的代碼理解&#xff0c;隨后會慢慢補充 文章目錄1 XSS概述1.1 什么是XSS&#xff1f;1.2 XSS主要分三種類型2 XSS基礎2.1 XSS基礎練習…

Odoo:免費開源的金屬制品行業ERP管理軟件

引言開源智造Odoo數字化解決方案專家團隊意識到&#xff0c;在當今全球市場中&#xff0c;將盈利能力和競爭力最大化的機會促使許多金屬制品制造商投資于推進業務發展的新技術。金屬制品會計軟件是企業用來處理他們業務和增加利潤的解決方案。某金屬制品加工工藝流程圖&#xf…

Ubuntu22.04配置GTest測試框架

前言 鴻蒙系統的代碼倉庫使用GTest作為單元測試的工具。特性開發時&#xff0c;需要寫demo以驗證開發思路。因此有必要搭建GTest開發環境配合鴻蒙特性開發做開發demo。 我測試環境是wsl2 Ubuntu22.04 LTS。 搭建過程 安裝必備C組件 sudo apt install -y unzip g gcc cmake …

學習日志15 python

1 filter() 函數filter(function, iterable)filter函數是python中的高階函數, 第一個參數是一個篩選函數, 第二個參數是一個可迭代對象, 返回的是一個生成器類型, 可以通過next獲取值。filter() 函數是 Python 內置的高階函數&#xff0c;其主要功能是對可迭代對象中的每個元素…

Linux 環境下安裝 MySQL 8.0.34 二進制 詳細教程 附docker+k8s啟動

文章目錄Linux 環境下安裝 MySQL 8.0&#xff08;二進制&#xff09;詳細教程準備工作安裝依賴包下載并解壓 MySQL下載 MySQL 二進制包解壓 MySQL移動目錄并創建 MySQL 用戶配置 MySQL配置數據目錄與日志目錄編輯配置文件 /etc/my.cnf初始化 MySQL 數據庫配置啟動腳本與環境變量…

HTML ISO-8859-1: 完全解析

HTML ISO-8859-1: 完全解析 引言 ISO-8859-1,又稱為 Latin-1,是一種廣泛使用的字符編碼標準,特別是在HTML文檔中。本文將詳細介紹ISO-8859-1編碼的特點、應用場景以及如何在使用HTML時正確地使用ISO-8859-1編碼。 ISO-8859-1編碼概述 定義 ISO-8859-1編碼是一種單字節編…

c++學習第3篇編輯器——centos7.9.2009系統離線安裝clion軟件并成功調試c++程序

遠程linux服務器安裝clion0 前提2個&#xff1a;1 下載CLion-2021.1.1.tar.gz安裝包2 上傳到linux系統并解壓3 修改linux系統里的/etc/ssh/sshd_config文件中的X11UseLocalhost 注釋去掉并設為no4 安裝xauth5 安裝MobaXterm軟件并使用ssh組件打開clion5.1 如果打不開clion,報錯…

20250722解決在Ubuntu 24.04.2下編譯RD-RK3588開發板的Android13出現找不到lz4的問題

20250722解決在Ubuntu 24.04.2下編譯RD-RK3588開發板的Android13出現找不到lz4的問題 2025/7/22 15:21緣起&#xff1a;在Ubuntu 24.04.2下編譯RD-RK3588開發板的Android13。 報錯&#xff1a;/bin/sh: 1: lz4: not found為了簡單起見&#xff0c;直接在 榮品的技術支持QQ群的 …

加載用戶設置時遇到錯誤找到一個帶有無效“icon“的配置文件。將該配置文件默認為無圖標。確保設置“icon“時,該值是圖像的有效文件路徑“

"C:\Users\Yourname\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json 修改所有icon字段位none 如&#xff1a;{"guid": "{bf61c995-08cc-4a56-b781-5dba411ef19c}","hidden": false,"icon&…

如何提升連帶消費?從新零售“人-貨-場”模型拆解

目錄 一、分析背景 二、新零售分析思路和分析方法 1.具體分析思路 2.分析方法 三、新零售“人-貨-場”分析的實操步驟 1.數據收集 2.數據處理 3.圖表制作 四、總結 想讓線上引來的顧客&#xff0c;在店里多買幾件&#xff1f; 連帶消費可是實體店賺錢的“秘密武器”&a…

Java異常處理核心原理與最佳實踐

Java異常處理核心原理與最佳實踐 場景&#xff1a; 你開發的文件處理工具在讀取用戶上傳的文件時突然崩潰&#xff0c;控制臺拋出FileNotFoundException。用戶的操作被中斷&#xff0c;數據丟失。這種糟糕的體驗正是異常處理機制要解決的核心問題——如何在程序出錯時優雅地恢復…

Ubuntu 安裝 Odoo 17 詳細教程

Ubuntu 安裝 Odoo 17 詳細教程 本教程將指導您在 Ubuntu 系統上從源代碼安裝 Odoo 17。Odoo 是一款功能強大的開源 ERP 和 CRM 軟件套件。本教程適用于希望自行配置和管理 Odoo 環境的用戶&#xff0c;尤其適合開發者和系統管理員。 教程概述 本教程將涵蓋以下步驟&#xff…

鯤鵬·卓識系列2.45G傳感器型有源標簽:以國產化技術重塑安全監測與人員管理新標準

標題&#xff1a;鯤鵬卓識系列2.45G傳感器型有源標簽&#xff1a;以國產化技術重塑安全監測與人員管理新標準 隨著工業4.0和智慧城市建設的加速推進&#xff0c;安全生產、環境監測和人員管理成為各行業的核心需求。在軍事、工業、倉儲、能源等領域&#xff0c;溫濕度、煙霧、油…

騰訊云推出CodeBuddy:革新AI全棧開發體驗

文章目錄一、前言二、安裝流程三、CodeBuddy 核心功能3.1 AI輔助開發3.2 Coding Design Chat 三大模式3.3 Boost Prompt3.4 Figma 集成3.5 Componen 控件庫3.6 Config MCP3.7 Upload Images 圖片上傳和管理3.8 Preview功能3.9 Deploy 一鍵部署3.10 項目展示 | MCP生成小紅書卡片…

龍虎榜——20250723

上證指數放量收上影線&#xff0c;未站上3600點&#xff0c;個股下跌明顯多于上漲&#xff0c;指數有調整需求&#xff0c;注意短線風險。深證指數較昨日縮量收陰線&#xff0c;依然在5日均線上方運行&#xff0c;打到前期平臺高點有震蕩調整需求&#xff0c;注意風險。2025年7…

SpringBoot06-@ConfigurationProperties注解

ConfigurationProperties注解用于將配置文件&#xff08;application.properties 或 application.yml&#xff09;中的配置值&#xff0c;自動綁定到 Java Bean 對象上。1-1、基本用途比如我們在 application.yml 中有這樣一段配置&#xff1a;app:name: myAppversion: 1.0.0au…

oracle里面concat函數用法,oracle wm_concat函數用法-

wmsys.wm_concat函數&#xff0c;它的作用是以’,’鏈接字符 例子如下&#xff1a; SQL> create table idtable (id number,name varchar2(30)); Table created SQL> insert into idtable values(10,’ab’); 1 row inserted SQL> insert into idtable values(10,’bc…

C++中的list(2)簡單復現list中的關鍵邏輯

C中的list&#xff08;2&#xff09;//簡單復現list中的關鍵邏輯 前言 這一節的主要內容就是&#xff1a;簡單復現list中的關鍵邏輯。同樣的&#xff0c;我們這一節也是先粗略的看一眼源碼&#xff0c;結合源碼&#xff0c;邊理解邊復現。源碼我已經上傳到gitee&#xff0c;網…