官方參考文件裡有關串列埠中斷的描述
esp8266_rtos_sdk 預設使⽤ uart0 列印除錯資訊,預設波特率為 74880。使用者可以在 user_init 中⾃定義初始化 uart,參考 uart_init_new 實現。uart 驅動示例: \esp8266_rtos_sdk\driver_lib\driver\uart.c
以初始化 uart0 為例。定義 uart 引數:
uart_configtypedef uart_config;
uart_config.baud_rate = bit_rate_74880;
uart_config.data_bits = uart_wordlength_8b;
uart_config.parity = usart_parity_none;
uart_config.stop_bits = usart_stopbits_1;
uart_config.flow_ctrl = usart_hardwareflowcontrol_none;
uart_config.uart_rxflowthresh = 120
;uart_config.uart_inversemask = uart_none_inverse;
uart_paramconfig(uart0, &uart_config);
註冊 uart 中斷處理函式,使能 uart 中斷:
uart_intrconftypedef uart_intr;
程式設計示例
uart_intr.uart_intrenmask = uart_rxfifo_tout_int_ena | uart_frm_err_int_ena | uart_rxfifo_full_int_ena | uart_txfifo_empty_int_ena;
uart_intr.uart_rx_fifofullintrthresh = 10
;uart_intr.uart_rx_timeoutintrthresh = 2
;uart_intr.uart_tx_fifoemptyintrthresh = 20
;uart_intrconfig(uart0, &uart_intr);
uart_setprintport(uart0);
uart_intr_handler_register(uart0_rx_intr_handler);
ets_uart_intr_enable();
然後就沒有更多的解釋了!
從這篇部落格裡看到:
要達到上述三點要求,其實現思路大致如下:
uart_intrconftypedef uart_intr;
uart_intr.uart_intrenmask = uart_frm_err_int_ena | uart_rxfifo_full_int_ena | uart_rxfifo_tout_int_ena;
uart_intr.uart_rx_fifofullintrthresh = 63
;uart_intr.uart_rx_timeoutintrthresh = 20
;uart_intr.uart_tx_fifoemptyintrthresh = 20
;uart_intrconfig(uart0, &uart_intr);
它的思想就是:
- 首先註冊中斷服務函式,並註冊完成之後馬上初始化乙個佇列(便於將資料在任務之間傳遞)和開始乙個串列埠任務
- 編寫中斷服務函式,在中斷服務函式中判斷條件,可以設定為串列埠資料溢位時就把資料傳送到佇列
- 在串列埠任務中只要一檢測到佇列中有資料傳送就馬上用串列埠列印出來。
user_main.c(刪除了一些不必要的**)
#include "freertos/freertos.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_common.h"
#include "esp_wifi.h"
#include "uart.h"
#include "iot_export.h"
#include "aliyun_port.h"
#include "aliyun_config.h"
#include "ota.h"
#include "mqtt.h"
int got_ip_flag = 0;
ota_info_t *p_ota_info = null;
enum ;
typedef struct _os_event_ os_event_t;
xtaskhandle xuarttaskhandle;
xqueuehandle xqueueuart;
local status
uart_tx_one_char(uint8 uart, uint8 txchar)
}write_peri_reg(uart_fifo(uart) , txchar);
return ok;
}// 串列埠處理任務 步驟:3
local void
user_uart_task(void *pvparameters)}}
vtaskdelete(null);
}// 串列埠中斷服務函式 步驟:2
local void
user_uart0_rx_intr_handler(void *para)
; uint32 uart_intr_status = read_peri_reg(uart_int_st(uart_no)) ;
while (uart_intr_status != 0x0) else if (uart_rxfifo_full_int_st == (uart_intr_status & uart_rxfifo_full_int_st)) */
rcvchar = read_peri_reg(uart_fifo(uart_no)) & 0xff; // 將乙個字元拷貝過去
write_peri_reg(uart_int_clr(uart0), uart_rxfifo_full_int_clr);
// 設定為串列埠接收溢位時就將資料傳到佇列
e.event = uart_event_rx_char;
e.param = rcvchar;
xqueuesendfromisr(xqueueuart, (void *)&e, &xhigherprioritytaskwoken); // 將資料傳送到佇列一次只有一次字元
portend_switching_isr(xhigherprioritytaskwoken);
} uart_intr_status = read_peri_reg(uart_int_st(uart_no)) ;
}}// 串列埠中斷初始化 步驟:1
void
user_uart_init(void)
void user_init(void)
esp8266 esp8266 wiki記憶體對映
本文主要講述了esp8266 晶元系列的實際記憶體布局。復位向量是40000080h,對映到內部rom。位址 名稱大小 型別r w 描述00000000h exc讀取時產生錯誤。20000000h no00 80 00 00未被對映重複的模式。3ff00000h dport0 1000h i orw...
ESP8266 利用網頁控制ESP8266
說明 發出 gpio 1 就輸出 亮燈 gpio 0 就輸出 滅燈 include const char ssid jia 這裡輸入wifi名稱 const char password lm654321 這裡輸入wifi密碼 wifiserver server 80 開啟板子的80埠 int val...
ESP8266學習筆記
因為此模式可控性高且方便,所以推薦此模式 測試指令 at 應用模式設定 at cwmode 3 ap 模式 1 esp8266模組作為熱點,實現手機或電腦直接與模組通訊,實現區域網無線控制。sta 模式 2 esp8266模組通過路由器連線網際網路,手機或電腦通過網際網路實現對裝置的遠端控制 sta...