当前位置: 首页 > news >正文

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解

USART简介

USART是一种串行通信协议,广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式,因此它可以在没有时钟信号的情况下(异步模式)或有时钟信号的情况下(同步模式)进行通信。

ESP32-S3的USART

ESP32-S3有两个全功能的USART通道,USART0和USART1,USART2,支持异步通信(RS232 和 RS485)和 IrDA,通信速率可达到 5 Mbps。

UART 基本架构图
在这里插入图片描述
UART 模块工作在两个时钟域:APB_CLK 时钟域和 Core 时钟域。UART Core 有三个时钟源:80-MHz APB_CLKRC_FAST_CLK 以及晶振时钟 XTAL_CLK ,可以通过配置 UART_SCLK_SEL 来选择时钟源。分频器用于对时钟源进行分频,然后产生时钟信号来驱动 UARTCore 模块。

更加详细的介绍,可以去看看官方的文档:
ESP32S3官方文档

需要注意一点
ESP32-S3的USART引脚映射是可配置的,这是因为ESP32-S3使用了一个称为GPIO矩阵的特性。GPIO矩阵是ESP32-S3硬件的一部分,它允许将内部信号路由到任何GPIO引脚。这意味着,我们可以将USART的发送(TX)和接收(RX)信号连接到你选择的任何可用GPIO引脚。

ESP32-S3 UART的默认引脚

发送(TX)接收(RX)
UART0IO43IO44
UART1IO17 / 任意IOIO18 / 任意IO
UART2任意IO任意IO

printf()函数

在ESP-IDF中,printf()函数默认使用的是USART0。这是因为在ESP32-S3的启动代码中,USART0被初始化为默认的调试控制台。因此,当我们在代码中使用printf()函数来打印信息时,这些信息将会被发送到USART0,并且可以通过串行接口(如USB转串口适配器)在计算机的串行监视器上看到。

使用ESP-IDF配置USART

在ESP32-S3上使用USART的基本步骤:

  • 设置 UART 参数、分配引脚(可选,不配置则使用默认引脚)
  • 初始化UART
  • 安装 UART 驱动
  • 收发数据
  • 使用中断
  • 卸载 UART 中断驱动,释放资源(当 UART 不再使用时)
#include "driver/uart.h"void app_main(void)
{// -------------1. 配置USART选项-----------------------uart_config_t uart_config = {.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 // 流控};// --------------2. 初始化USART------------------------// UART_NUM_1:UART端口号// &uart_config:指向uart_config_t结构体的指针uart_param_config(UART_NUM_1, &uart_config);// --------------3. 安装驱动程序------------------------// UART_NUM_1:UART端口号// 1024 * 2:接收缓冲区大小// 0:发送缓冲区大小// 0:队列长度// NULL:队列句柄(如果不使用队列,可以设置为NULL)// 0:中断分配标志(通常设置为0)uart_driver_install(UART_NUM_1, 1024 * 2, 0, 0, NULL, 0);// 4.---------------4. 发送数据--------------------------// UART_NUM_1:UART端口号// "Hello, world!":要发送的数据// 13:要发送的数据的长度uart_write_bytes(UART_NUM_1, "Hello, world!", 13);// ------------------5. 读取数据-----------------------uint8_t data[128]; // 数据缓冲区int length = 0; // 读取的数据长度// UART_NUM_1:UART端口号// data:数据缓冲区// sizeof(data):要读取的最大数据长度// 1000 / portTICK_RATE_MS:读取超时时间(以RTOS tick为单位)length = uart_read_bytes(UART_NUM_1, data, sizeof(data), 1000 / portTICK_RATE_MS);if (length > 0) {// 如果读取到数据,处理数据// ...}}

前面提到过ESP32-S3的USART引脚映射是可配置的,所以我们可以使用uart_set_pin()来自定义TX和RX

#include "driver/uart.h"void app_main(void)
{// 设置UART1的TX引脚为GPIO10,RX引脚为GPIO9uart_set_pin(UART_NUM_1, 10, 9, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}

这里uart_set_pin()函数的最后两个参数是RTS(请求发送)和CTS(清除发送),我没有使用所以将它们设置为UART_PIN_NO_CHANGE

USART实验

在这里插入图片描述
串口UART_NUM_1接收数据,并分别在串口UART_NUM_0和串口UART_NUM_1返回

这次我们依旧使用面向对象的方法来编写驱动,驱动API接口参考Arduino的格式

USART.h

/*** @file USART.h* @author 宁子希 (1589326497@qq.com)* @brief   串口初始化类* @version 0.1* @date 2024-03-12* * @copyright Copyright (c) 2024* */#ifndef _USART_H_
#define _USART_H_#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/uart_select.h"
#include "driver/gpio.h"#ifdef __cplusplusextern "C" {
#endifclass Uart {
public:// 构造函数,接收UART端口号和TX、RX引脚作为参数Uart(uart_port_t uart_num, int tx_pin, int rx_pin);// 发送数据,接收一个字符数组和长度作为参数void write(const char* data, int len);// 接收数据,接收一个字符数组和长度作为参数,返回实际接收的长度int read(uint8_t* buf, int len);private:uart_port_t _uart_num; // UART端口号int _tx_pin; // TX引脚int _rx_pin; // RX引脚
};#ifdef __cplusplus}
#endif#endif

USART.cpp

/*** @file USART.cpp* @author 宁子希 (1589326497@qq.com)* @brief   串口初始化类* @version 0.1* @date 2024-03-12* * @copyright Copyright (c) 2024* */
#include "USART.h"// 构造函数
Uart::Uart(uart_port_t uart_num, int tx_pin, int rx_pin): _uart_num(uart_num), _tx_pin(tx_pin), _rx_pin(rx_pin) {// 配置UART参数uart_config_t uart_config = {.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, // 流控制};// 配置UART参数uart_param_config(uart_num, &uart_config);// 设置UART引脚// 设置UART的TX和RX引脚uart_set_pin(uart_num, tx_pin, rx_pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);// 安装UART驱动程序// 安装UART驱动程序uart_driver_install(uart_num, 1024 * 2, 0, 0, NULL, 0);
}// 发送数据
void Uart::write(const char* data, int len) {// 调用ESP-IDF库函数来发送数据uart_write_bytes(_uart_num, data, len);
}// 接收数据
int Uart::read(uint8_t* buf, int len) {// 调用ESP-IDF库函数来接收数据return uart_read_bytes(_uart_num, buf, len, 1000 / portTICK_PERIOD_MS);
}

main.cpp

/*** @file main.cpp* @author 宁子希 (1589326497@qq.com)* @brief   串口通信实验* @version 0.1* @date 2024-03-13* * @copyright Copyright (c) 2024* */#include <iostream>
#include <string>
#include "USART.h"
using namespace std;extern "C" void app_main(void){// 创建一个Uart对象使用UART_NUM_1 TX:8 RX:9Uart uart1(UART_NUM_1, 8, 9);// 发送数据uart1.write("Hello, ESP32!", 13);while(true){// 接收数据uint8_t buf[128];int len = uart1.read(buf, sizeof(buf));// 处理接收到的数据if (len > 0) {// 假设我们只是简单地将接收到的数据打印出来for (int i = 0; i < len; i++) {printf("%c", buf[i]);}printf("\n");// 然后我们可以再次发送处理后的数据uart1.write((const char*)buf, len);}}
}

总结

更加详细的内容可以去看看官方的资料:
ESP32S3 USART 官方手册

相关文章:

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议&#xff0c;广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式&#xff0c;因此它可以在没有时钟信号的情况下&#xff08;异步模式&#xff09;或有时钟信号的情况下&#xff08;同步模式&#xff…...

安塔利斯升级php8

1、includes/classes/class.Database.php 255行 multi_query方法加返回类型 :bool query方法加返回类型&#xff1a;: mysqli_result|bool 2、includes/classes/class.Session.php on line 91 Optional parameter $planetID declared before required parameter $dpath is…...

Clickhouse MergeTree 原理(一)

作者&#xff1a;俊达 MergeTree是Clickhouse里最核心的存储引擎。Clickhouse里有一系列以MergeTree为基础的引擎&#xff08;见下图&#xff09;&#xff0c;理解了基础MergeTree&#xff0c;就能理解整个系列的MergeTree引擎的核心原理。 本文对MergeTree的基本原理进行介绍…...

【C语言】字符串函数上

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是字符串函数上篇&#xff0c;主要是关于长度不受限制的字符串函数&#xff08;strlen,strcpy,strcat,strcm…...

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口&#xff0c;定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理&#xff0c;还添加了面向位置的操作。 实际上有两种list&#xff1a;一种是基本的ArrayList&#xff0c;其优点在于随机访问元素&#xff0c;另一种是更强大的L…...

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量&#xff0c;或将一个普通变量导出为环境变量&#xff0c;并且在这个过程中&#xff0c;可以给该环境变量赋值。 下面…...

案例--某站视频爬取

众所周知&#xff0c;某站的视频是&#xff1a; 由视频和音频分开的。 所以我们进行获取&#xff0c;需要分别获得它的音频和视频数据&#xff0c;然后进行音视频合并。 这么多年了&#xff0c;某站还是老样子&#xff0c;只要加个防盗链就能绕过。&#xff08;防止403&#xf…...

清华把大模型用于城市规划,回龙观和大红门地区成研究对象

引言&#xff1a;参与式城市规划的新篇章 随着城市化的不断推进&#xff0c;传统的城市规划方法面临着越来越多的挑战。这些方法往往需要大量的时间和人力&#xff0c;且严重依赖于经验丰富的城市规划师。为了应对这些挑战&#xff0c;参与式城市规划应运而生&#xff0c;它强…...

Vue+SpringBoot打造创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…...

Web框架开发-Django简介

一、MVC和MTV模型 MVC 所谓MVC就是把web应用分为模型&#xff08;M&#xff09;&#xff0c;控制器&#xff08;C&#xff09;和视图&#xff08;V&#xff09;三层&#xff0c;他们之间以一种插件式的&#xff0c;松耦合的方式连接在一起&#xff0c;模型负责业务对象与数据库…...

VB播放器(动态服务器获取歌词)-183-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword183 VBASP vb动态从服务器读取歌词 VB asp交互 程序, 模式不一样, 与普通的MP3播放器不一样, 这个是可以实现歌词从服务器上查询功能的. 看好了在咨询 我可以給您演示 目  录 前  言 1 1 . 简述 2 1.1 开发…...

java-可变参数

可变参数是什么&#xff1f; 可变参数就是指传入的参数个数是可变的&#xff0c;不是固定的 为什么要可变参数&#xff1f; 当我们要传入大量的形参时&#xff0c;我们就可以用到可变参数了 定义格式 数据类型...变量名; 例如int ...a; 可变参数的细节&#xff1a; &…...

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…...

嵌入式学习39-程序创建数据库及查找

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …...

科研三维模型高精度三维扫描服务3d逆向测绘建模工业产品抄数设计

三维抄数技术在科研三维模型的应用已经日益广泛&#xff0c;其高精度、高效率的特点使得科研工作者能够更快速、更准确地获取和分析数据。这一技术的核心在于通过专业的三维扫描仪对实物进行高精度测量&#xff0c;再将这些数据转化为三维数字模型&#xff0c;为后续的研究提供…...

【LeetCode热题100】141. 环形链表(链表)

一.题目要求 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…...

express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、安装sequelize和mysql2二、修改config/db.js三、修改models/user.js&#xff0c;models/shop.js&#xff0c;models/goods.js四、新建dao/user.js&#xff0c;dao/shop.js&#xff0c;dao/goods.js五、修…...

霹雳学习笔记——6.1 ResNet网络结构、BN以及迁移学习

一、ResNet结构 ResNet是一个突破一千层的网络架构。主要是卷积层Conv和池化层的堆叠。但是普通的堆叠会使得错误率更高&#xff0c;如下图所述&#xff0c;这是因为会产生梯度消失/梯度爆炸等。&#xff08;梯度就是增量&#xff0c;有大小有方向&#xff09; 解决方法&#…...

Gitee的注册和代码提交(附有下载链接)

目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…...

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…...

告别手写UI!用NXP GUI Guider拖拽设计LVGL界面,5分钟搞定音乐播放器Demo

嵌入式UI开发革命&#xff1a;5分钟用GUI Guider构建LVGL音乐播放器在嵌入式系统开发中&#xff0c;用户界面(UI)设计曾长期是工程师的痛点——既要考虑资源受限的硬件环境&#xff0c;又要实现流畅美观的交互体验。传统手动编写UI代码的方式不仅效率低下&#xff0c;调试过程更…...

雪球网md5__1038参数逆向解析与Node.js复现

1. 这不是“破解”&#xff0c;而是对前端加密逻辑的常规逆向还原你打开雪球网任意一只股票详情页&#xff0c;F12 打开开发者工具&#xff0c;切到 Network 面板&#xff0c;刷新页面——很快就能在 XHR 请求里捕获到类似这样的接口&#xff1a;https://xueqiu.com/stock/cube…...

【MySQL数据库 | 第一篇】 概述

数据库相关概念&#xff1a; 数据库(Database)&#xff1a;数据库是指一组有组织的数据的集合&#xff0c;通过计算机程序进行管理和访问。数据库管理系统&#xff1a;操纵和管理数据库的大型软件SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数…...

【紧急预警】Lindy衰减临界点已提前至第8.3个月!2024最新《营销自动化寿命健康度白皮书》限时开放前500份

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Lindy衰减临界点的理论重构与实证突破 Lindy效应传统上描述“越老越长寿”的非线性生存规律&#xff0c;但其在现代软件系统、开源生态与协议层技术栈中的适用边界正遭遇结构性挑战。本文首次将Lindy模型从静…...

CANoe诊断测试没CDD文件怎么办?手把手教你用Fault Memory窗口和CAPL脚本读取解析DTC故障码

CANoe诊断测试无CDD文件的实战解决方案&#xff1a;从Fault Memory到CAPL脚本全解析当CDD文件缺失或定义不清晰时&#xff0c;诊断测试工程师常常陷入困境。本文将深入探讨如何利用Fault Memory窗口的基础功能&#xff0c;并通过CAPL脚本实现更灵活、更强大的故障码读取与解析方…...

LeagueAkari:英雄联盟终极自动化助手革命性指南

LeagueAkari&#xff1a;英雄联盟终极自动化助手革命性指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否在英雄联盟游戏中反复经历这…...

别再手动维护接口文档了!用Spring Boot 3和Swagger 3实现代码与文档的自动同步

Spring Boot 3与Swagger 3&#xff1a;构建零维护成本的API文档工作流 每次接口变更都要手动更新文档&#xff1f;团队成员总是抱怨文档与实际接口不一致&#xff1f;在敏捷开发时代&#xff0c;传统文档维护方式已成为拖累工程效率的典型痛点。本文将揭示如何通过Spring Boot …...

Claude Code用户告别封号与Token焦虑,无缝切换至Taotoken平台

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Claude Code用户告别封号与Token焦虑&#xff0c;无缝切换至Taotoken平台 对于依赖Claude Code进行编程辅助的开发者而言&#xff…...

Python-for-Android 完整指南:5分钟将Python应用打包为Android APK

Python-for-Android 完整指南&#xff1a;5分钟将Python应用打包为Android APK 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python-for-Android&#xff0…...

终极崩坏星穹铁道自动化指南:3分钟掌握解放双手的智能游戏伴侣

终极崩坏星穹铁道自动化指南&#xff1a;3分钟掌握解放双手的智能游戏伴侣 【免费下载链接】StarRailAssistant 崩坏&#xff1a;星穹铁道自动化 | 崩坏&#xff1a;星穹铁道自动锄大地 | 崩坏&#xff1a;星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: https://git…...