ESP8266 UART 使用說明

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章