电子商务网站规划与建设试题,微商怎么做网站,seo需要会什么,html毕业设计题目大全ESP32-S3 IDF USART详解
USART简介
USART是一种串行通信协议#xff0c;广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式#xff0c;因此它可以在没有时钟信号的情况下#xff08;异步模式#xff09;或有时钟信号的情况下#xff08;同步模式#xff…ESP32-S3 IDF USART详解
USART简介
USART是一种串行通信协议广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式因此它可以在没有时钟信号的情况下异步模式或有时钟信号的情况下同步模式进行通信。
ESP32-S3的USART
ESP32-S3有两个全功能的USART通道USART0和USART1USART2支持异步通信RS232 和 RS485和 IrDA通信速率可达到 5 Mbps。
UART 基本架构图 UART 模块工作在两个时钟域APB_CLK 时钟域和 Core 时钟域。UART Core 有三个时钟源80-MHz APB_CLK、RC_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接收RXUART0IO43IO44UART1IO17 / 任意IOIO18 / 任意IOUART2任意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.hvoid 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_1UART端口号// uart_config指向uart_config_t结构体的指针uart_param_config(UART_NUM_1, uart_config);// --------------3. 安装驱动程序------------------------// UART_NUM_1UART端口号// 1024 * 2接收缓冲区大小// 0发送缓冲区大小// 0队列长度// NULL队列句柄如果不使用队列可以设置为NULL// 0中断分配标志通常设置为0uart_driver_install(UART_NUM_1, 1024 * 2, 0, 0, NULL, 0);// 4.---------------4. 发送数据--------------------------// UART_NUM_1UART端口号// Hello, world!要发送的数据// 13要发送的数据的长度uart_write_bytes(UART_NUM_1, Hello, world!, 13);// ------------------5. 读取数据-----------------------uint8_t data[128]; // 数据缓冲区int length 0; // 读取的数据长度// UART_NUM_1UART端口号// 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.hvoid app_main(void)
{// 设置UART1的TX引脚为GPIO10RX引脚为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 宁子希 (1589326497qq.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#endifUSART.cpp
/*** file USART.cpp* author 宁子希 (1589326497qq.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 宁子希 (1589326497qq.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 官方手册