久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ESP32 學(xué)習(xí)筆記(三)UART

 iamlijin 2019-08-07

UART - 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.

主要特性

  • 可編程收發(fā)波特率

  • 3 個(gè) UART 的發(fā)送 FIFO 以及接收 FIFO 共享1024 x 8-bit RAM

  • 全雙工異步通信

  • 支持輸入信號(hào)波特率自檢功能

  • 支持 5/6/7/8 位數(shù)據(jù)長(zhǎng)度

  • 支持 1/1.5/2/3/4 個(gè)停止位

  • 支持奇偶校驗(yàn)位

  • 支持 RS485 協(xié)議

  • 支持 IrDA 協(xié)議

  • 支持 DMA 高速數(shù)據(jù)通信

  • 支持 UART 喚醒模式

功能描述

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òu)圖

圖1 UART 基本架構(gòu)圖

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 控制器.
UART 共享RAM 圖

UART 共享 RAM 圖

應(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 Reference

Header File

API 使用

以下概述描述了用于在 ESP32 和某些其他 UART 設(shè)備之間建立通信的功能和數(shù)據(jù)類型. 概述反映了編程 ESP32 的UART驅(qū)動(dòng)程序時(shí)的典型工作流程,并分為以下幾個(gè)部分:

  1. 設(shè)置通信參數(shù) - 波特率,數(shù)據(jù)位,停止位等

  2. 設(shè)置通信引腳 - 連接另一個(gè) UART 的引腳

  3. 驅(qū)動(dòng)程序安裝 - 為 UART 驅(qū)動(dòng)程序分配 ESP32 的資源

  4. 運(yùn)行 UART 通信 - 發(fā)送/接收數(shù)據(jù)

  5. 使用中斷 - 觸發(fā)特定通信事件的中斷

  6. 刪除驅(qū)動(dòng)程序 - 如果不再需要 UART 通信,則釋放 ESP32 的資源

使 UART 能開始工作是完成前面的四個(gè)步驟,后兩個(gè)步驟是可選的.

驅(qū)動(dòng)程序由uart_port_t標(biāo)識(shí),它對(duì)應(yīng)于一個(gè)組 UART 控制器. 這種識(shí)別存在于以下所有函數(shù)調(diào)用中.

設(shè)置通信參數(shù)

有兩種方法可以設(shè)置 UART 的通信參數(shù). 一種是通過(guò)調(diào)用uart_param_config()uart_config_t結(jié)構(gòu)中提供配置參數(shù)來(lái)一次性完成.

另一種方法是通過(guò)調(diào)用函數(shù)單獨(dú)配置特定參數(shù):

  • 波特率 - uart_set_baudrate()

  • 傳輸?shù)奈粩?shù) - uart_set_word_length()指定uart_word_length_t的值

  • 奇偶校驗(yàn)控制 - uart_set_parity()指定uart_parity_t 的值

  • 停止位數(shù)目 - uart_set_stop_bits()指定uart_stop_bits_t的值

  • 硬件流控制模式 - uart_set_hw_flow_ctrl()指定uart_hw_flowcontrol_t 的值

  • 通信模式 - uart_set_mode()指定uart_mode_t的值

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ù) uart_set_pin()我們可以輸入宏UART_PIN_NO_CHANGE而不是 GPIO 引腳編號(hào),并且不會(huì)更改當(dāng)前分配的引腳. 如果不使用某個(gè)引腳,則應(yīng)輸入相同的宏.

// 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)用 uart_driver_install()來(lái)安裝 UART 驅(qū)動(dòng). 并分配給 UART 所需的若干資源. 資源的類型/大小被指定為函數(shù)參數(shù)并需要考慮:

  • 發(fā)送緩沖區(qū)的大小

  • 接收緩沖區(qū)的大小

  • 事件隊(duì)列句柄和大小

  • 用于分配中斷的標(biā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ù)名稱中,例如:uart_write_bytes()用于傳輸數(shù)據(jù),或uart_read_bytes()用于讀取傳入數(shù)據(jù).

使用中斷

報(bào)告了 UART 的特定狀態(tài)或檢測(cè)到的錯(cuò)誤有 19 個(gè)中斷. ESP32 技術(shù)參考手冊(cè)(PDF)中介紹了可用中斷的完整列表. 要啟用特定中斷,請(qǐng)調(diào)用uart_enable_intr_mask(),以禁用調(diào)用uart_disable_intr_mask(). 所有中斷的掩碼都以UART_INTR_MASK的形式提供. 使用uart_isr_register()完成向服務(wù)中斷注冊(cè)處理程序,使用uart_isr_free()釋放處理程序. 要在調(diào)用處理程序后清除中斷狀態(tài)位,請(qǐng)使用uart_clear_intr_status().

刪除驅(qū)動(dòng)程序

如果與uart_driver_install()建立通信一段特定時(shí)間,然后不需要,則可以通過(guò)調(diào)用uart_driver_delete()來(lái)刪除驅(qū)動(dòng)程序以釋放分配的資源.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多