赞
踩
提示:这里可以添加本文要记录的大概内容:
嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART) 即可以满足这些要求,它能够灵活地与外部设备进行全双工数据交换。
通用异步接收器/发送器 (UART) 是一种硬件功能,它使用广泛采用的异步串行通信接口(例如 RS232、RS422、RS485)来处理通信(即时序要求和数据帧)。
ESP32 芯片具有三个 UART 控制器(UART0、UART1 和 UART2),每个控制器都具有一组相同的寄存器,以简化编程并提高灵活性。每个 UART 控制器可独立配置波特率、数据位长度、位顺序、停止位数量、奇偶校验位等参数。
UART 是一种以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。
一个典型的 UART 帧开始于一个起始位,紧接着是有效数据,然后是奇偶校验位(可有可无),最后是停止位。
ESP32 上的 UART 控制器支持多种字符长度和停止位。另外,控制器还支持软硬件流控和 DMA,可以实现无缝高速的数据传输。开发者可以使用多个 UART 端口,同时又能保证很少的软件开销。
主要特性:
• 可编程收发波特率
• 3 个 UART 的发送 FIFO 以及接收 FIFO 共享 1024 × 8-bit RAM
• 全双工异步通信
• 支持输入信号波特率自检功能
• 支持 5/6/7/8 位数据长度
• 支持 1/1.5/2/3 个停止位
• 支持奇偶校验位
• 支持 RS485 协议
• 支持 IrDA 协议
• 支持 DMA 高速数据通信
• 支持 UART 唤醒模式
• 支持软件流控和硬件流控
上图为 UART 基本架构图。UART 有两个时钟源:80-MHz APB_CLK 以及参考时钟 REF_TICK 。可以通过配置 UART_TICK_REF_ALWAYS_ON 来选择时钟源。时钟中的分频器用于对时钟源进行分频,然后产生时钟信号来驱动 UART 模块。UART_CLKDIV_REG 将分频系数分成两个部分:
UART_CLKDIV 用于配置整数部分,UART_CLKDIV_FRAG 用于配置小数部分。
UART 控制器可以分为两个功能块:发送块和接收块。
发送块包含一个发送 FIFO 用于缓存待发送的数据。软件可以通过 APB 总线写 Tx_FIFO,也可以通过 DMA 将数据搬入 Tx_FIFO。Tx_FIFO_Ctrl 用于控制 Tx_FIFO 的读写过程,当 Tx_FIFO 非空时,Tx_FSM 通过 Tx_FIFO_Ctrl
读取数据,并将数据按照配置的帧格式转化成比特流。比特流输出信号 txd_out 可以通过配置 UART_TXD_INV寄存器实现取反功能。
接收块包含一个接收 FIFO 用于缓存待处理的数据。输入比特流 rxd_in 可以输入到 UART 控制器。可以通过UART_RXD_INV 寄存器实现取反。Baudrate_Detect 通过检测最小比特流输入信号的脉宽来测量输入信号的波
特率。Start_Detect 用于检测数据的 START 位,当检测到 START 位之后,RX_FSM 通过 Rx_FIFO_Ctrl 将帧解析后的数据存入 Rx_FIFO 中。
上图为串口的RAM
由上图可以看到三个串口共用一个1024*8的RAM
UART0 的 Tx_FIFO 和 Rx_FIFO 可以通过置位 UART_TXFIFO_RST 和 UART_RXFIFO_RST 来复位。
UART1 的Tx_FIFO 和 Rx_FIFO 可以通过置位 UART1_TXFIFO_RST 和 UART1_RXFIFO_RST 来复位。
UART2没有相应的寄存器来进行复位。
UART1的TX以及RX会受到UART2的影响,UART1只能在UART2没有数据传输的时候使用。
UART 控制器有两种数据流控方式:硬件流控和软件流控。硬件流控主要通过输出信号 rtsn_out 以及输入信号dsrn_in 进行数据流控制。软件流控主要通过在发送数据流中插入特殊字符以及在接收数据流中检测特殊字符来实现数据流控功能。
1、设置通讯参数- 设置波特率、数据位、停止位等。
2、设置通信引脚- 分配用于连接到设备的引脚。
3、驱动程序安装- 为 UART 驱动程序分配 ESP32 的资源。
4、运行 UART 通信- 发送/接收数据
5、使用中断- 触发特定通信事件的中断
6、删除驱动程序- 如果不再需要 UART 通信,则释放分配的资源
注意:UART 驱动程序的函数使用uart_port_t. 所有函数调用都需要此标识。
设置串口配置参数:
esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config);
参数1:串口数
参数2:串口配置参数uart_config_t
返回:ESP_OK 配置成功
ESP_FAIL 配置失败
uart_config_t这个结构体内就是对串口参数的配置,从上到下依次是:
串口波特率
串口字节长度
设置奇偶校验位
设置停止位
设置串口硬件流控制模式RTS/CTS
UART 硬件 RTS 阈值
选择时钟源
选择是否使用ref_tick是时钟源(不推荐)
设置引脚
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。