天天看點

【ESP32學習筆記】#外設篇#(3)序列槽通信(UART)一、簡介二、配置和使用三、官方使用示例四、API五、報錯:

一、簡介

  • 官方文檔:UART
  • ESP32 有 3 個 UART 控制器(

    UART0

    UART1

    UART2

    ),它們具有一組相同的寄存器。
  • 每個 UART 控制器均可獨立配置參數,如波特率、資料位長度、位排序、停止位數量、奇偶校驗位等。
  • 支援異步通信(RS232 和 RS485)和 IrDA。
  • 通信速率可達到 5 Mbps。
  • 支援 CTS 和 RTS 信号的硬體管理以及軟體流控(XON 和 XOFF)。
  • 3 個接口均可被 DMA 通路或者 CPU 直接通路。
  • 全雙工異步通信
  • 支援 UART 喚醒模式
  • 支援波特率自檢測功能
  • UART 有兩個時鐘源:80-MHz

    APB_CLK

    以及參考時鐘

    REF_TICK

  • 3 個 UART 的發送 FIFO 以及接收 FIFO 共享 1024 × 8-bit RAM。

    UART 共享 RAM 圖:

    【ESP32學習筆記】#外設篇#(3)序列槽通信(UART)一、簡介二、配置和使用三、官方使用示例四、API五、報錯:

二、配置和使用

1、初始化示例:

const int uart_num = UART_NUM_0;
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,	// 硬體流控模式(cts/rts)
    // .rx_flow_ctrl_thresh = 122,	// 硬體 RTS 門檻值
    // .source_clk = ,	// 源時鐘選擇
};
/* 設定 UART 通訊參數 */
uart_param_config(uart_num, &uart_config);

/* 設定 UART 引腳 */
uart_set_pin(uart_num , GPIO_NUM_1, GPIO_NUM_3, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

/* 安裝驅動程式 */
const int uart_buffer_size = (1024 * 2);
QueueHandle_t uart_queue;
uart_driver_install(uart_num , uart_buffer_size, uart_buffer_size, 10, &uart_queue, 0));

// uart_isr_free(uart_num ); //釋放中斷服務函數
           

2、發送示例:

char* test_str = "Hello World.\n";

// 發送函數1
uart_write_bytes(uart_num, (const char*)test_str, strlen(test_str));

// 發送函數2 uart_tx_chars 函數不會在 TX FIFO 中等待足夠的空間

// 發送函數3 傳輸結束時增加一個串行中斷信号 相當于幀與幀之間增加間隔
uart_write_bytes_with_break(uart_num, "test break\n",strlen("test break\n"), 100);

// 等待發送完成
ESP_ERROR_CHECK(uart_wait_tx_done(uart_num, 100));
           

3、接收示例:

// Read data from UART.
const int uart_num = UART_NUM_0;
uint8_t data[128];
int length = 0;
ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&length));
length = uart_read_bytes(uart_num, data, length, 100);
           

4、自定義中斷示例:

const int uart_num = UART_NUM_0;
uart_isr_handle_t handle;
// 重新注冊自定義中斷服務函數,不使用内部中斷處理程式
uart_isr_register(uart_num, uart_irq_handler, &uart_num, ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM, &handle);
// 使能中斷接收 	打開 rxfifo接收滿中斷,rxfifo逾時中斷(預設逾時時間為10個byte)
uart_enable_rx_intr(uart_num ); 
uart_set_rx_timeout(uart_num, 20); //配置接收逾時中斷時間,機關為按照目前波特率傳輸1個bytes的時間

// 中斷處理
static void IRAM_ATTR uart_irq_handler(void *arg) {
	volatile uart_dev_t *uart = arg;
	uint8_t recSize=0;
	int uartRxCount = 0;
	uint8_t uartRxBuf[100];

	uart->int_clr.rxfifo_full = 1;
	uart->int_clr.frm_err = 1;
	if(uart->int_st.rxfifo_tout) //檢查是否産生逾時中斷
	{
		uart->int_clr.rxfifo_tout = 1;
		recSize = uart->status.rxfifo_cnt;
		if(recSize!=0){
			while(uart->status.rxfifo_cnt){
				uartRxBuf[uartRxCount++] = uart->fifo.rw_byte; 
			}
		} 
	} 
}
           

三、官方使用示例

peripherals/uart/

代碼示例 描述
uart_echo 配置 UART 設定、安裝 UART 驅動程式以及通過 UART1 接口讀取/寫入。
uart_events 使用模式檢測中斷報告各種通信事件。
uart_async_rxtxtasks 通過同一個 UART 在兩個獨立的 FreeRTOS 任務中發送和接收資料。
uart_select 對 UART 檔案描述符使用同步 I/O 多路複用。
uart_echo_rs485 設定 UART 驅動程式以在半雙工模式下通過 RS485 接口進行通信。此示例類似于外設/uart/uart_echo,但允許通過連接配接到 ESP32 引腳的 RS485 接口晶片進行通信。
nmea0183_parser 通過解析通過 UART 外設從 GPS 接收到的 NMEA0183 資料來擷取 GPS 資訊。

四、API

driver/uart.h

API 描述

uart_driver_install

安裝 UART 驅動程式并将 UART 設定為預設配置

uart_driver_delete

解除安裝UART驅動

uart_is_driver_installed

檢查驅動程式是否安裝

uart_set_word_length

設定 UART 資料位

uart_get_word_length

擷取 UART 資料位配置

uart_set_stop_bits

設定 UART 停止位

uart_get_stop_bits

擷取 UART 停止位配置

uart_set_parity

設定 UART 奇偶校驗模式

uart_get_parity

擷取 UART 奇偶校驗模式配置

uart_set_baudrate

設定 UART 波特率

uart_get_baudrate

擷取 UART 波特率配置

uart_set_line_inverse

設定 UART 線路反轉模式

uart_set_hw_flow_ctrl

設定硬體流控制

uart_set_sw_flow_ctrl

設定軟體流控制

uart_clear_intr_status

清除 UART 中斷狀态

uart_enable_intr_mask

設定 UART 中斷使能

uart_disable_intr_mask

清除 UART 中斷使能位

uart_enable_rx_intr

啟用 UART RX 中斷 (RX_FULL & RX_TIMEOUT INTERRUPT)

uart_disable_rx_intr

禁用 UART RX 中斷 (RX_FULL & RX_TIMEOUT INTERRUPT)

uart_disable_tx_intr

禁用 UART TX 中斷 (TX_FULL & TX_TIMEOUT INTERRUPT)

uart_enable_tx_intr

啟用 UART TX 中斷 (TX_FULL & TX_TIMEOUT INTERRUPT)

uart_isr_register

注冊 UART 中斷處理程式 (ISR)

uart_isr_free

釋放由 uart_isr_register 注冊的 UART 中斷處理程式

uart_set_pin

設定 UART 引腳編号

uart_set_rts

手動設定 UART RTS 引腳電平

uart_set_dtr

手動設定 UART DTR 引腳電平

uart_set_tx_idle_num

在 tx FIFO 為空後設定 UART 空閑間隔

uart_param_config

設定 UART 配置參數

uart_intr_config

配置 UART 中斷

uart_wait_tx_done

等到 UART TX FIFO 為空

uart_tx_chars

從給定的緩沖區和長度将資料發送到 UART 端口

uart_write_bytes

從給定的緩沖區和長度向 UART 端口發送資料

uart_write_bytes_with_break

從給定的緩沖區和長度向 UART 端口發送資料

uart_read_bytes

UART 從 UART 緩沖區讀取位元組

uart_flush

uart_flush_input 的别名。UART 環形緩沖區重新整理。會删除 UART RX 緩沖區中的所有資料。

uart_flush_input

清除輸入緩沖區,删除環形緩沖區中的所有資料。

uart_get_buffered_data_len

UART 擷取 RX 環形緩沖區緩存的資料長度

uart_disable_pattern_det_intr

UART 禁用模式檢測功能。專為“AT 指令”等應用而設計。當硬體檢測到一系列相同的字元時,就會觸發中斷。

uart_enable_pattern_det_intr

UART 使能模式檢測功能。專為“AT 指令”等應用而設計。當硬體檢測到一系列相同的字元時,就會觸發中斷。

uart_enable_pattern_det_baud_intr

UART 使能模式檢測功能。專為“AT 指令”等應用而設計。當硬體檢測到一系列相同的字元時,就會觸發中斷。

uart_pattern_pop_pos

傳回緩沖區中最近檢測到的模式位置

uart_pattern_get_pos

傳回緩沖區中最近檢測到的模式位置。

uart_pattern_queue_reset

配置設定一個給定長度的新記憶體來儲存記錄在 rx 緩沖區中檢測到的模式位置

uart_set_mode

UART 設定通信模式

uart_set_rx_full_threshold

設定 RX fifo full 的 UART 門檻值

uart_set_tx_empty_threshold

為 TX fifo 為空設定 UART 門檻值

uart_set_rx_timeout

UART 設定 TOUT 功能的門檻值逾時

uart_get_collision_flag

傳回 RS485 模式的碰撞檢測标志 函數将碰撞檢測标志傳回到由碰撞标志指向的變量中。

uart_set_wakeup_threshold

設定淺睡眠喚醒的 RX 引腳信号邊沿數

uart_get_wakeup_threshold

擷取淺睡眠喚醒的 RX 引腳信号邊沿數

uart_wait_tx_idle_polling

等到 UART tx 記憶體為空并且最後一個字元發送正常(輪詢模式)

uart_set_loop_back

配置TX信号環回RX子產品,僅供測試使用

uart_set_always_rx_timeout

配置 UART RX 逾時中斷的行為

五、報錯:

問題一:

uart: uart_read_bytes(1156): uart driver error
           

解決:

沒有初始化該序列槽,初始化一下

問題二:

解決:

發送緩沖區太小。應

>128 or 0

注:Rx_buffer_size 應該大于 UART_FIFO_LEN。Tx_buffer_size 應為零或大于 UART_FIFO_LEN

問題三:

Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled
           

uart_driver_install

函數:

#define UART_FULL_THRESH_DEFAULT        (120)

uart_intr_config_t uart_intr = {
    .intr_enable_mask = UART_INTR_CONFIG_FLAG,
    .rxfifo_full_thresh = UART_FULL_THRESH_DEFAULT,
    .rx_timeout_thresh = UART_TOUT_THRESH_DEFAULT,
    .txfifo_empty_intr_thresh = UART_EMPTY_THRESH_DEFAULT,
};
           

預設值 120,隻能接收到120個位元組就中斷。

繼續閱讀