UART - Universal Asynchronous Receiver/TransmitterUART - Universal Asynchronous Receiver/Transmitter概述嵌入式應(yīng)用通常要求一個(gè)簡(jiǎn)單的并且占用系統(tǒng)資源少的方法來(lái)傳輸數(shù)據(jù).通用異步收發(fā)傳輸器(UART) 即可以滿足這些要求,它能夠靈活地與外部設(shè)備進(jìn)行全雙工數(shù)據(jù)交換.ESP32 芯片中有 3 個(gè)UART 控制器可供使用,并且兼容不同的 UART 設(shè)備.另外,UART 還可以用作紅外數(shù)據(jù)交換(IrDA) 或 RS-485 調(diào)制解調(diào)器. 3 個(gè) UART 控制器有一組功能相同的寄存器.本文以 UARTn 指代 3 個(gè) UART 控制器,n 為0,、1,、2. 主要特性
功能描述UART 是一種以字符為導(dǎo)向的通用數(shù)據(jù)鏈,可以實(shí)現(xiàn)設(shè)備間的通信.異步傳輸?shù)囊馑际遣恍枰诎l(fā)送數(shù)據(jù)上添加時(shí)鐘信息.這也要求發(fā)送端和接收端的速率,、停止位,、奇偶校驗(yàn)位等都要相同,通信才能成功. 一個(gè)典型的 UART 幀開始于一個(gè)起始位,緊接著是有效數(shù)據(jù),然后是奇偶校驗(yàn)位(可有可無(wú)),最后是停止位.ESP32 上的 UART 控制器支持多種字符長(zhǎng)度和停止位.另外,控制器還支持軟硬件流控和 DMA,可以實(shí)現(xiàn)無(wú)縫高速的數(shù)據(jù)傳輸.開發(fā)者可以使用多個(gè) UART 端口,同時(shí)又能保證很少的軟件開銷. UART 有兩個(gè)時(shí)鐘源:80-MHz APB_CLK 以及參考時(shí)鐘 REF_TICK (詳情請(qǐng)參考章節(jié)復(fù)位和時(shí)鐘).可以通過(guò)配置 UART_TICK_REF_ALWAYS_ON 來(lái)選擇時(shí)鐘源.時(shí)鐘中的分頻器用于對(duì)時(shí)鐘源進(jìn)行分頻,然后產(chǎn)生時(shí)鐘信號(hào)來(lái)驅(qū)動(dòng) UART 模塊.ART_CLKDIV_REG 將分頻系數(shù)分成兩個(gè)部分:UART_CLKDIV 用于配置整數(shù)部分,UART_CLKDIV_FRAG 用于配置小數(shù)部分. UART 控制器可以分為兩個(gè)功能塊:發(fā)送塊和接收塊. 發(fā)送塊包含一個(gè)發(fā)送 FIFO 用于緩存待發(fā)送的數(shù)據(jù).軟件可以通過(guò) APB 總線寫 Tx_FIFO,也可以通過(guò) DMA 將數(shù)據(jù)搬入 Tx_FIFO.Tx_FIFO_Ctrl 用于控制 Tx_FIFO 的讀寫過(guò)程,當(dāng) Tx_FIFO 非空時(shí),Tx_FSM 通過(guò) Tx_FIFO_Ctrl讀取數(shù)據(jù),并將數(shù)據(jù)按照配置的幀格式轉(zhuǎn)化成比特流.比特流輸出信號(hào) txd_out 可以通過(guò)配置 UART_TXD_INV 寄存器實(shí)現(xiàn)取反功能. 接收塊包含一個(gè)接收 FIFO 用于緩存待處理的數(shù)據(jù).輸入比特流 rxd_in 可以輸入到 UART 控制器.可以通過(guò) UART_RXD_INV 寄存器實(shí)現(xiàn)取反.Baudrate_Detect 通過(guò)檢測(cè)最小比特流輸入信號(hào)的脈寬來(lái)測(cè)量輸入信號(hào)的波特率.Start_Detect 用于檢測(cè)數(shù)據(jù)的 START 位,當(dāng)檢測(cè)到 START 位之后,RX_FSM 通過(guò) Rx_FIFO_Ctrl 將幀解析后的數(shù)據(jù)存入 Rx_FIFO 中. 軟件可以通過(guò) APB 總線讀取 Rx_FIFO 中的數(shù)據(jù).為了提高數(shù)據(jù)傳輸效率,可以使用 DMA 方式進(jìn)行數(shù)據(jù)發(fā)送或接收. HW_Flow_Ctrl 通過(guò)標(biāo)準(zhǔn) UART RTS 和 CTS(rtsn_out 和 ctsn_in)流控信號(hào)來(lái)控制 rxd_in 和 txd_out 的數(shù)據(jù)流.SW_Flow_Ctrl 通過(guò)在發(fā)送數(shù)據(jù)流中插入特殊字符以及在接收數(shù)據(jù)流中檢測(cè)特殊字符來(lái)進(jìn)行數(shù)據(jù)流的控制.當(dāng) UART 處于 Light-sleep(詳情請(qǐng)參考章節(jié)低功耗管理)狀態(tài)時(shí),Wakeup_Ctrl 開始計(jì)算 rxd_in 的脈沖個(gè)數(shù),當(dāng)脈沖個(gè)數(shù)大于 UART_ACTIVE_THRESHOLD 時(shí)產(chǎn)生 wake_up 信號(hào)給 RTC 模塊,由 RTC 來(lái)喚醒 UART 控制器. 應(yīng)用示例配置 UART 設(shè)置并使用 UART1 接口安裝 UART 驅(qū)動(dòng)程序進(jìn)行讀/寫:peripherals/uart_echo. 演示如何報(bào)告各種通信事件以及如何使用模式檢測(cè)中斷:peripherals/uart_events. 在兩個(gè)獨(dú)立的 FreeRTOS 任務(wù)中使用相同的 UART 進(jìn)行發(fā)送和接收:peripherals/uart_async_rxtxtasks. 對(duì) UART 文件描述符使用同步 I/O 多路復(fù)用:peripherals/uart_select. 設(shè)置 UART 驅(qū)動(dòng)程序以半雙工模式通過(guò) RS485 接口進(jìn)行通信:peripherals/uart_echo_rs485. 此示例類似于 uart_echo,但通過(guò)連接到 ESP32 引腳的 RS485 接口芯片提供通信. API ReferenceHeader FileAPI 使用以下概述描述了用于在 ESP32 和某些其他 UART 設(shè)備之間建立通信的功能和數(shù)據(jù)類型. 概述反映了編程 ESP32 的UART驅(qū)動(dòng)程序時(shí)的典型工作流程,并分為以下幾個(gè)部分:
使 UART 能開始工作是完成前面的四個(gè)步驟,后兩個(gè)步驟是可選的. 驅(qū)動(dòng)程序由 設(shè)置通信參數(shù)有兩種方法可以設(shè)置 UART 的通信參數(shù). 一種是通過(guò)調(diào)用 另一種方法是通過(guò)調(diào)用函數(shù)單獨(dú)配置特定參數(shù):
const int uart_num = UART_NUM_2; uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS, .rx_flow_ctrl_thresh = 122, }; // Configure UART parameters ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config)); 設(shè)置通信引腳通過(guò)調(diào)用函數(shù) // Set UART pins(TX: IO16 (UART2 default), RX: IO17 (UART2 default), RTS: IO18, CTS: IO19) ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, 18, 19)); 驅(qū)動(dòng)程序安裝完成驅(qū)動(dòng)程序配置后,我們可以通過(guò)調(diào)用
// Setup UART buffered IO with event queue const int uart_buffer_size = (1024 * 2); QueueHandle_t uart_queue; // Install UART driver using an event queue here ESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, uart_buffer_size, uart_buffer_size, 10, &uart_queue, 0)); 如果上述所有步驟均已完成,我們就可以連接其他 UART 設(shè)備并開始通信. 運(yùn)行 UART 通信串行通信的過(guò)程受 UART 硬件 FSM 的控制. 要發(fā)送的數(shù)據(jù)應(yīng)放入 Tx FIFO 緩沖區(qū), FSM 將序列化并發(fā)送出去. 完成類似的過(guò)程,但是以相反的順序,接收數(shù)據(jù). 傳入的串行流由 FSM 處理并移至 Rx FIFO 緩沖區(qū). 因此, API 的通信功能的任務(wù)僅限于向/從相應(yīng)緩沖區(qū)寫入和讀取數(shù)據(jù). 這反映在一些函數(shù)名稱中,例如: 使用中斷報(bào)告了 UART 的特定狀態(tài)或檢測(cè)到的錯(cuò)誤有 19 個(gè)中斷. ESP32 技術(shù)參考手冊(cè)(PDF)中介紹了可用中斷的完整列表. 要啟用特定中斷,請(qǐng)調(diào)用 刪除驅(qū)動(dòng)程序如果與 |
|