我一直對esp8266的串列埠傳輸的機制很好奇,沒辦法只得好好分析原始碼了。
esp8266的中斷系統是必須要了解的。我分析的源**是分配有任務的,所以在任務函式中是無法看到中斷的。我的分析如下:
**實現如下:
串列埠接收中斷處理函式
local void
uart0_rx_intr_handler(void *para)
if(uart_rxfifo_full_int_st == (read_peri_reg(uart_int_st(uart_no)) & uart_rxfifo_full_int_st))
else
if(uart_rxfifo_tout_int_st == (read_peri_reg(uart_int_st(uart_no)) & uart_rxfifo_tout_int_st))
任務函式
void icache_flash_attr
at_init(void)
如此這般,當串列埠接收中斷發生時,fifo滿了或fifo超時了,都會使得中斷向任務傳送訊息,從而讓任務中的接收任務事件跑起來。
串列埠中斷函式分析:
首先uart的中斷暫存器有:
然後uart的一些特殊的位:
然後uart的暫存器操作函式:
**分析 uart.c–uart0_rx_intr_handler()
if(uart_frm_err_int_st == (read_peri_reg(uart_int_st(uart0)) & uart_frm_err_int_st))
根據前面的各種各樣的識別符號分析
經過一系列的分析,所謂的串列埠接收中斷函式就是:中斷發生後,cpu首先檢視串列埠中斷位,然後在將查詢到的值與那些特殊位進行比較,得出串列埠的當前狀態:串列埠接收錯誤?串列埠接收fifo滿了?串列埠接收fifo超時?…….然後根據不同的狀態進行不同的操作。
如果加入了任務調控機制,就可以在串列埠發生中斷的時候,給任務傳送訊息了。讓任務進行操作。
下面這段**首先分析識別符號:
while(read_peri_reg(uart_status(uart0)) & (uart_rxfifo_cnt << uart_rxfifo_cnt_s))
ESP 8266 串列埠通訊 Serial
esp8266的串列埠通訊與傳統的arduino裝置完全一樣。除了硬體fifo 128位元組用於tx和rx 之外,硬體串列埠還有額外的 256位元組的tx和rx快取。傳送和接收全都由中斷驅動。當fifo 快取滿時,write函式會阻塞工程 的執行,等待空閒空間。當fifo 快取空時,read函式也會...
ESP8266學習筆記
因為此模式可控性高且方便,所以推薦此模式 測試指令 at 應用模式設定 at cwmode 3 ap 模式 1 esp8266模組作為熱點,實現手機或電腦直接與模組通訊,實現區域網無線控制。sta 模式 2 esp8266模組通過路由器連線網際網路,手機或電腦通過網際網路實現對裝置的遠端控制 sta...
esp8266學習筆記
上學以前買了一片esp8266 一直沒用 也是醉了 最近有時間拿出來鼓搗一下 發現功能很強大 是內嵌了 處理器有wifi功能的一款小晶元 還便宜 esp8266 我知道的開發方式 有 可能不全 1 arduino ide for esp8266 2 刷nodemcu 用esploader 進行lua...