日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ESP8266--学习笔记(八)串口源码分析

發(fā)布時(shí)間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ESP8266--学习笔记(八)串口源码分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我一直對(duì)ESP8266的串口傳輸?shù)臋C(jī)制很好奇,沒辦法只得好好分析源碼了。?
?ESP8266的中斷系統(tǒng)是必須要了解的。我分析的源代碼是分配有任務(wù)的,所以在任務(wù)函數(shù)中是無法看到中斷的。我的分析如下:

代碼實(shí)現(xiàn)如下:

串口接收中斷處理函數(shù)

LOCAL void uart0_rx_intr_handler(void *para) {uint8 uart_no = UART0;//UartDev.buff_uart_no;if(UART_FRM_ERR_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_FRM_ERR_INT_ST)){os_printf("FRM_ERR\r\n");WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_FRM_ERR_INT_CLR);}if(UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_FULL_INT_ST)){ETS_UART_INTR_DISABLE();//中斷失能system_os_post(at_recvTaskPrio, 0, 0);//向任務(wù)函數(shù)發(fā)送消息}else if(UART_RXFIFO_TOUT_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_TOUT_INT_ST)){ETS_UART_INTR_DISABLE();////中斷失能system_os_post(at_recvTaskPrio, 0, 0);//向任務(wù)函數(shù)發(fā)送消息}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

任務(wù)函數(shù)

void ICACHE_FLASH_ATTR at_init(void) {system_os_task(at_recvTask, at_recvTaskPrio, at_recvTaskQueue, at_recvTaskQueueLen);system_os_task(at_procTask, at_procTaskPrio, at_procTaskQueue, at_procTaskQueueLen); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

?如此這般,當(dāng)串口接收中斷發(fā)生時(shí),FIFO滿了或FIFO超時(shí)了,都會(huì)使得中斷向任務(wù)發(fā)送消息,從而讓任務(wù)中的接收任務(wù)事件跑起來。


串口中斷函數(shù)分析:

首先UART的中斷寄存器有:

  • UART_INT_RAW 中斷原始狀態(tài)寄存器
  • UART_INT_ENA 中斷使能寄存器:表?示當(dāng)前使能的uart中斷。
  • UART_INT_ST 中斷狀態(tài)寄存器:表?示當(dāng)前有效的中斷狀態(tài)
  • UART_INT_CLR 清除中斷寄存器:置對(duì)應(yīng)位來清除中斷狀態(tài)寄存器

然后UART的一些特殊的位:

  • UART_RXFIFO_FULL_INT_ST :接收full中斷位
  • UART_RXFIFO_OVF_INT_ST:接收溢出中斷位
  • UART_RXFIFO_TOUT_INT_ST :接收超時(shí)中斷位
  • UART_TXFIFO_EMPTY_INT_ST:發(fā)送空中斷位

然后UART的寄存器操作函數(shù):

  • READ_PERI_REG(addr) 讀寄存器值的函數(shù)
  • WRITE_PERI_REG(addr, val) 寫寄存器函數(shù)

代碼分析 uart.c–uart0_rx_intr_handler()

if(UART_FRM_ERR_INT_ST == (READ_PERI_REG(UART_INT_ST(UART0)) & UART_FRM_ERR_INT_ST)){os_printf("FRM_ERR\r\n");WRITE_PERI_REG(UART_INT_CLR(UART0), UART_FRM_ERR_INT_CLR);}
  • 1
  • 2
  • 3
  • 4
  • 5

根據(jù)前面的各種各樣的標(biāo)識(shí)符分析

  • 首先讀uart0的中斷狀態(tài)寄存器READ_PERI_REG(UART_INT_ST(UART0))
  • 而 UART_FRM_ERR_INT_ST 是這么定義的#define UART_FRM_ERR_INT_ST (BIT(3))
  • 然后將這兩個(gè)寄存器進(jìn)行“和”運(yùn)算再與UART_FRM_ERR_INT_ST進(jìn)行判斷

總結(jié):

?經(jīng)過一系列的分析,所謂的串口接收中斷函數(shù)就是:中斷發(fā)生后,CPU首先查看串口中斷位,然后在將查詢到的值與那些特殊位進(jìn)行比較,得出串口的當(dāng)前狀態(tài):串口接收錯(cuò)誤?串口接收FIFO滿了?串口接收FIFO超時(shí)?…….然后根據(jù)不同的狀態(tài)進(jìn)行不同的操作。?
?如果加入了任務(wù)調(diào)控機(jī)制,就可以在串口發(fā)生中斷的時(shí)候,給任務(wù)發(fā)送消息了。讓任務(wù)進(jìn)行操作。

————————————————————

下面這段代碼首先分析標(biāo)識(shí)符:

  • READ_PERI_REG(…):讀取tx/rx 隊(duì)列內(nèi)當(dāng)前剩余的字節(jié)數(shù)
  • UART_STATUS(…)
  • UART_RXFIFO_CNT :0x000000FF (255)
  • UART_RXFIFO_CNT_S :0
while(READ_PERI_REG(UART_STATUS(UART0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)){}

總結(jié)

以上是生活随笔為你收集整理的ESP8266--学习笔记(八)串口源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。