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中的數據全部讀空,然後寫清除中斷狀態寄存器,否則退出後中斷狀態還是會被置上。