1. 配置属性参数
UART0:
U0TXD: pin26(U0TXD)
U0RXD: pin25(U0RXD)
U0CTS: pin12(MTCK)
U0RTS: pin13(MTDO)
UART1:
U1TXD: pin14(GPIO2)
发送FIFO的基本工作过程:
只要有数据填充到发送 FIFO 里,就会立即启动发送过程。由于发送本身相对缓慢的过程,因此在发送的同
时其他需要发送的数据还可以继续填充到发送FIFO里。当发送 FIFO 被填满时就不能再继续填充了,否则会造成
数据丢失,此时只能等待。发送FIFO会按照填入数据的先后顺序把数据一个个发送出去,直到发送 FIFO 全空时
为止。已发送完毕的数据会被自动清除,在发送 FIFO 里同时会多出一个空位。
接收FIFO的基本工作过程:
当硬件逻辑接收到数据时,就会往接收 FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取
走也是在接收 FIFO 里被自动删除的过程,因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数
据未被及时取走而造成接收 FIFO 已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。
应用场景:
USART0 作为数据通信接口,UART1作为debug信息的打印。
UART0 默认情况会在上电booting期间输出一些打印,此器件打印内容的波特率与所用的外部晶振频率有关。使用
40MHz晶振时,该段打印波特率为115200。使用26MHz晶振时,该段打印波特率为74880。
2. 配置属性参数
UART0 和 UART1 各有一个长度为 128Byte 的硬件 FIFO,读写 FIFO 都在同一个地址操作。
两个 UART 模块的硬件寄存器相同,通过 UART0/UART1 的宏定义来区分。
3. 参数配置
UART属性参数都在UART_CONF0定义的寄存器中,可以在uart_register.h中找到。修改该寄存器下的不同对应
位,可以配置UART属性。
3.1 波特率
ESP8266 的串口波特率范围从300到115200*40都可以支持。
接口:void UART_SetBaudrate(uint8 uart_no, uint32 baud_rate);
3.2 校验位
#define UART_PARITY_EN (BIT(1)) 校验使能:1:enable; 0:diable
#define UART_PARITY (BIT(0)) 校验类型设置 1:奇校验;0:偶校验
接口:void UART_SetParity(uint8 uart_no, UartParityMode Parity_mode);
3.3 数据位
#define UART_BIT_NUM 0x00000003 //数据位长度占用两个bit
设置这两个bit可以配置数据长度0:5bit; 1:6bit;2:7bit;3:8bit
#define UART_BIT_NUM_S 2 //寄存器偏移为2(第2bit开始)
接口:void UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len);
3.4 停止位
#define UART_STOP_BIT_NUM 0x00000003 //数据位长度占用两个bit
设置这两个bit可以配置停止位长度 1:1bit;2:1.5bit;3:2bit
#define UART_STOP_BIT_NUM_S 4 // 寄存器偏移为4(第4bit开始)
接口: void UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num);
3.5 反相
UART 各个信号输入与输出信号,可在内部进行反向配置
#define UART_DTR_INV (BIT(24))
#define UART_RTS_INV (BIT(23))
#define UART_TXD_INV (BIT(22))
#define UART_DSR_INV (BIT(21))
#define UART_CTS_INV (BIT(20))
#define UART_RXD_INV (BIT(19))
将对应寄存器置位,可以将对应信号线反向输出/输入。
接口:void UART_SetLineInverse(uint8 uart_no, UART_LineLevelInverse inverse_mask);
3.6 切换打印函数输出端口
默认情况下,系统打印函数 os_printf 从 uart0 口输出内容,通过以下接口可以设置从 uart0 或者
uart1 口输出打印。
void UART_SetPrintPort(uint8 uartz_no);
3.7 读取 tx/rx 队列内当前剩余的字节数
Tx fifo length:
(READ_PERI_REG(UART_STATUS(uart_no))>>UART_TXFIFO_CNT_S) & UART_TXFIFO_CNT;
接口:TX_FIFO_LEN(uart_no);
Rx fifo length:
(READ_PERI_REG(UART_STATUS(UART0))>>UART_RXDFIFO_CNT_S) & UART_RXFIFO_CNT;
接口:RF_FIFO_LEN(uart_no)
3.8 回环操作(loop-back)
在 UART_CONF0 寄存器中,配置后,uart tx/rx 在内部短接。
#define UART_LOOPBACK (BIT(14)) // 回环使能位, 1:enable; 0:diable
ENABLE:SET_PERI_REG_MASK(UART_CONF0(UART0), UART_LOOPBACK);
接口: ENABLE_LOOP_BACK(uart_no)
DIABLE: CLEAR_PERI_REG_MASK(UART_CONF0(UART0), UART_LOOPBACK);
接口:DIABLE_LOOP_BACK(uart_no)
3.9 线中止信号
要产生线上中止信号,可以将UART_TXD_BRK置1,这样在uart发送队列发送完成后,输出一个break信号
(tx输出低电平),需要停止输出将该位置0.
#define UART_TXD_BRK (BIT(8)) // 线中止信号,1:enable; 0:disable
3.10 流量控制
配置过程:
a. 先配置uart0的pin12,pin13脚复用为U0CTS,和U0RTS功能。
#define FUNC_U0RTS 4
#define FUNC_U0CTS 4
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_U0CTS);
b. 接收方向的硬件流控可以配置阀值,当 rx fifo 中的长度大于所设的阀值, U0RTS脚就会拉高,阻
止对方发送。
配置接收流控制阀:
阀值相关的配置一般都在UART_CONF1定义的寄存器中
#define UART_RX_FLOW_EN (BIT(23)) // 第23bit使能接收流控: 0:disable; 1:enable
#define UART_RX_FLOW_THRHD 0x0000007F // 门限值,占用7bit,范围0~127
#define UART_RX_FLOW_THRHD_S 16 // 寄存器偏移为16 (第16bit开始)
c. 发送方向的流控只需配置使能,该寄存器在UART_CONF0中:
#define UART_TX_FLOW_EN (BIT(15)) // 使能发送流控: 0:diable; 1:enable
d. 接口
void UART_SetFlowCtrl(uint8 uart_no, UART_HwFlowCtrl flow_ctrl, uint8 rx_thresh);
e. demo 板硬件连接:
需要将 J68 (U0CTS) 与 J63 (U0RTS) 的跳线接上。
3.11 其他接口
TX_FIFO_LEN(uart_no) // 宏定义,发送队列当前长度
RX_FIFO-len(uart_no) // 宏定义,接收队列当前长度
4. 配置中断
由于所有中断事件在发送到中断控制器之前会一起进行”或运算“操作,所以任意时刻 UART 只能向中断产生一个
中断请求。通过查询中断状态函数 UART_INT_ST(uart_no),软件可以在同一个中断服务函数里处理多个中断事件
(多个并列的if语句)。
4.1 中断寄存器
Uart 的中断寄存器有:
UART_INT_RAW 中断原始状态寄存器
UART_INT_ENA 中断使能寄存器:表示当前使能的uart中断
UART_INT_ST 中断状态寄存器:表示当前有效的中断状态
UART_INT_CLR 清除中断寄存器:置对应位来清除中断状态寄存器
4.2 接口
打开中断使能:UART_ENABLE_INTR_MASK(uart_no, ena_mask);
关闭中断使能:UART_DISABLE_INTR_MASK(uart_no, disable_mask);
清除中断状态:UART_CLR_INTR_STATUS_MASK(uart_no, clr_mask);
获取中断状态:UART_GET_INTR_STATUS(uart_no);
4.3 中断类型
1. 接收full中断
中断状态位:UART_RXFIFO_FULL_INT_ST
定义:当配置阀值并使能中断后,当 rx fifo 中的数据长度大于阀值后,触发该中断
应用:比较多用于处理uart接收的数据,配合流量控制,直接处理或者post出消息,或者转存入buffer。
比如,配置阀值为100,并使能full中断,当串口收到100字节后,会触发full中断。
配置阀值:
full中断阀值(或门限值)
在UART_CONF1寄存器
#define UART_RXFIFO_FULL_THRHD 0x0000007F // 门限值mask,7bit长,范围0-127
#define UART_RXFIFO_FULL_THRHD_S 0 // 寄存器偏移为0 (第0bit开始)
设置中断使能:
在 UART_INT_ENA 寄存器
#define UART_RXFIFO_FULL_INT_ENA (BIT(0)) // full中断使能位,1:enable; 0:disable
清除中断状态:
对于full中断比较特殊,需要先将接收fifo中的数据全部读空,然后写清楚中断状态寄存器。否则推出后
中断状态位还是会被置上。
2. 接收溢出中断
中断状态位:UART_RXFIFO_OVF_INT_ST
定义:当使能接收溢出中断后,当接收队列的长度大于队列总长度(128bytes)时,会触发该中断信号。
触发场景:一般只在没有设置流控的情况下,因为有流量控制时候不会发生溢出。区别于full中断,full
中断是人为设置阀值并且数据不会丢失。溢出中断触发则一般都会存在数据丢失。可用于程序调试与验错。
设置中断使能:
在UART_INT_ENA寄存器
#define UART_RXFIFO_OVF_INT_ENA (BIT(4)) // 溢出中断使能位:1:enable; 0:disable
清除中断状态:
读取队列值,使队列长度小于128,然后置清除中断状态寄存器即可。
3. 接收超时中断tout
中断状态位:UART_RXFIFO_TOUT_INT_ST
定义:当配置tout阀值并使能中断后,当uart开始接收数据后,停止传输的时间超过所设定的门限值,就
会触发tout中断。
应用: 较多用于处理串口指令或者数据,直接处理数据或者post出消息,或者转存入buffer。
配置阀值与功能使能:
tout中断阀值(或门限值)在UART_CONF1寄存器中。
Tout阀值的单位为8个uart数据比特的时间(近似一个byte)
#define UART_RX_TOUT_EN (BIT(31)) // 超时功能使能位:1:enable;0:disable
#define UART_RX_TOUT_THRHD 0x0000007F // 超时阀值配置位,共7位,范围0-127
#define UART_RX_TOUT_THRHD_S 24 // 寄存器偏移为24 (第24bit开始)
设置中断使能:
在UART_INT_ENA寄存器
#define UART_RXFIFO_TOUT_INT_ENA (BIT(8)) tout // 中断使能位,1:enable;0:disable
清除中断状态:
与full中断类似,tout中断也需要先将接收fifo中的数据全部读空,然后写清除中断状态寄存器,否则退出后中断状态还是会被置上。