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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;网…