在
uart_driver_install
函数中,参数
RX_BUF_SIZE * 2
指定了接收缓冲区(RX buffer)的大小。这个参数对于 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 *rx_queue, int intr_alloc_flags);
uart_port_t uart_num
:
-
指定要安装驱动程序的 UART 端口号,如
UART_NUM_0
,
UART_NUM_1
, 或
UART_NUM_2
。
int rx_buffer_size
:
-
接收缓冲区的大小(以字节为单位)。这是你提到的
RX_BUF_SIZE * 2
参数。它定义了接收数据的最大容量。当接收的数据量超过此大小时,可能会发生溢出,导致数据丢失。
-
RX_BUF_SIZE * 2
表示接收缓冲区的大小是
RX_BUF_SIZE
的两倍。这可能是为了确保有足够大的缓冲区来处理预期中的最大数据量,或者是为了提供额外的空间以减少数据丢失的风险。
int tx_buffer_size
:
-
发送缓冲区的大小(以字节为单位)。在这个例子中,值为
0
,表示不使用发送缓冲区或由系统默认管理发送缓冲区。
int queue_size
:
-
接收事件队列的长度。它指定了可以排队等待处理的接收事件数量。如果设置为
0
,则不会创建接收事件队列。
QueueHandle_t *rx_queue
:
-
一个指向 FreeRTOS 队列句柄的指针,用于接收事件通知。如果不需要接收事件通知,则可以传递
NULL
。
int intr_alloc_flags
:
-
中断分配标志,用于指定中断分配的行为。通常可以设置为
0
,表示使用默认行为,也可以根据需要设置特定的标志位。
RX_BUF_SIZE * 2
的意义
缓冲区大小加倍
:通过将接收缓冲区大小设置为
RX_BUF_SIZE * 2
,你可以确保有足够的空间来容纳更多的接收数据,从而减少了因缓冲区满而导致的数据丢失风险。这对于需要处理大量连续数据的应用特别有用,例如日志记录、文件传输或其他高带宽通信场景。
优化性能
:较大的接收缓冲区可以在一定程度上提高系统的响应速度和吞吐量,因为应用程序不需要频繁地从缓冲区读取数据以防止溢出。不过,这也意味着会占用更多的内存资源,因此需要在缓冲区大小和系统资源之间找到一个平衡点。
intr_alloc_flags
参数用于指定在安装 UART 驱动时如何分配和配置中断资源。这个参数对于控制中断的行为非常重要,尤其是在多核系统或对实时性有严格要求的应用中。以下是
intr_alloc_flags
的详细解释及其可能的取值:
esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t *rx_queue, int intr_alloc_flags);
intr_alloc_flags
参数的意义
-
中断分配标志
:该参数是一个位掩码(bitmask),可以通过组合多个标志来定制中断行为。这些标志定义了中断是如何分配给 CPU 核心、优先级设置等。
常见的
intr_alloc_flags
选项
0
(默认)
:
-
使用默认的中断分配行为。ESP-IDF 框架会根据内部逻辑选择一个合适的 CPU 核心,并为中断分配一个适当的优先级。
ESP_INTR_FLAG_SHARED
:
-
允许多个中断源共享同一个中断处理程序。这可以节省资源,但在某些情况下可能会降低性能,因为共享中断处理程序需要额外的时间来确定哪个设备触发了中断。
ESP_INTR_FLAG_IRAM
:
-
强制将中断处理程序代码放置在内部 RAM (IRAM) 中。这对于确保在闪存处于忙状态(如正在进行擦除或写入操作)时仍能及时响应中断是非常重要的。
ESP_INTR_FLAG_LEVEL1
到
ESP_INTR_FLAG_LEVEL7
:
-
设置中断的优先级级别。较高的数字表示更高的优先级。例如,
ESP_INTR_FLAG_LEVEL1
表示最低优先级,而
ESP_INTR_FLAG_LEVEL7
表示最高优先级。
ESP_INTR_FLAG_EDGE
:
-
将中断配置为边缘触发模式。这意味着只有当信号从低到高或从高到低变化时才会触发中断。
ESP_INTR_FLAG_HIGHLEVEL
:
-
将中断配置为高电平触发模式。只要信号保持高电平,就会持续触发中断。
ESP_INTR_FLAG_LOWMED
和
ESP_INTR_FLAG_MEDLOW
:
-
这些标志允许进一步细化中断优先级,但它们的具体效果取决于平台和支持情况。
ESP_INTR_FLAG_CPU0
和
ESP_INTR_FLAG_CPU1
:
-
在双核或多核系统中,可以选择将中断分配给特定的 CPU 核心。例如,在 ESP32 上,
ESP_INTR_FLAG_CPU0
表示中断仅由核心 0 处理,而
ESP_INTR_FLAG_CPU1
表示仅由核心 1 处理。
示例代码
假设你希望将 UART 中断分配给 CPU 核心 0,并且设置中断优先级为 5,同时确保中断处理程序位于 IRAM 中,你可以这样配置
intr_alloc_flags
:
#include "driver/uart.h"
#include "esp_intr_alloc.h"
#define RX_BUF_SIZE 1024
void install_uart_driver_with_custom_interrupt_flags() {
const uart_port_t uart_num = UART_NUM_1;
const int intr_flags = ESP_INTR_FLAG_IRAM | ESP_INTR_FLAG_LEVEL5 | ESP_INTR_FLAG_CPU0;
// 安装 UART 驱动,接收缓冲区大小为 RX_BUF_SIZE * 2,不使用发送缓冲区,
// 不创建接收事件队列,不接收事件通知,自定义中断分配标志
esp_err_t err = uart_driver_install(uart_num, RX_BUF_SIZE * 2, 0, 0, NULL, intr_flags);
if (err != ESP_OK) {
printf("Failed to install UART driver: %s\n", esp_err_to_name(err));
} else {
printf("UART driver installed successfully with custom interrupt flags.\n");
-
中断优先级
:合理设置中断优先级可以避免高优先级任务被低优先级任务打断,从而影响系统的实时性和稳定性。
-
CPU 核心选择
:在多核系统中,正确选择中断分配给哪个 CPU 核心可以帮助优化任务调度和减少上下文切换开销。
-
内存位置
:对于时间敏感的应用,确保中断处理程序位于快速访问的内存区域(如 IRAM)是至关重要的。
官网esp-idf参考代码:D:\esp-idf\examples\peripherals\
uart
\
uart
_events
开发
环境:Source Insight + esp-idf
esp32
模块:
ESP32
-WROOM-32
实现功能:使用
ESP32
的3个
UART
全部实现收发,要求3个
UART
同时接收每条数据长度25间隔时间为100ms。
初期看了一下官网的
uart
例程代码...
在ESP-IDF
开发
框架中,
UART
(通用异步收发传输器)是嵌入式系统
开发
中常用的外设接口之一。正确使用
UART
驱动
安装
函数
对于确保串口通信的稳定性至关重要。本文将详细解析
uart
_
driver
_
install
()
函数
的
参数
顺序及其实际
意义
。
##
函数
原型分析
uart
_
driver
_
install
()
函数
的完整原型如下:
esp_err_t
uart
_
driver
_instal...
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
s
嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (
UART
) 即可以满足这些要求,它能够灵活地与外部设备进行全双工数据交换。
ESP32
芯片中有3个
UART
控制器可供使用,并且兼容不同的
UART
设备。另外,
UART
还可以用作红外数据交换 (IrDA) 或 RS-485 调制解调器。
支持3路
UART
,发送与接收FIFO共享RAM
支持5/6/7/8位数据长度
支持RS485、IrDA协议
支持DMA高速通信
支持
UART
唤醒模式
UART
架构
通用异步接收/发送器(
UART
)
通用异步接收器/发送器(
UART
)是用于处理各种广泛适应的协议(RS232,RS485,RS422,…)的时序要求的组件。
UART
提供了一种广泛采用和廉价的方法来实现不同设备之间的全双工数据交换。
ESP32
芯片上有三个
UART
控制器。它们与来自不同制造商的支持
UART
的设备兼容。集成在
ESP32
中的所有
UART
控制器都具有相同的寄存器组,便于编程和灵活性。在本文档中,这些控制器被称为
UART
0,
UART
1和
UART
2。
每个
UART
控制器都可以独立配置
参数
,如波特率