【ESP8266】NONOS SDK开发,串口发送、接收与中断
ESP8266感覺(jué)要成現(xiàn)在物聯(lián)網(wǎng)的黑馬了,集成WiFi功能、能編程,還便宜,確實(shí)挺6的。
就是能提供的資料太少,感覺(jué)官網(wǎng)上的遠(yuǎn)遠(yuǎn)不夠用,這個(gè)串口收發(fā)與中斷折騰了我是在太久,在這里小的就分享一下自己的經(jīng)驗(yàn)。
大家都問(wèn)我要工程,我終于可以上傳啦:
http://download.csdn.net/download/d521000121/10045750
由于時(shí)代久遠(yuǎn),本人很多都忘了,誠(chéng)意與大家交流。
芯片:ESP8266-07
先介紹一下ESP8266的UART情況:
ESP8266共有兩組UART接口,分別為:
UART0:
U0TXD: pin26(U0TXD)
U0RXD: pin25(U0RXD)
U0CTS: pin12(MTCK)
U0RTS: pin13(MTDO)
UART1:
U1TXD: pin14(GPIO2)
UART0和UART1各有一個(gè)長(zhǎng)度為128Byte的硬件FIFO,讀寫FIFO都在同一個(gè)地址操作。
兩個(gè)UART模塊的硬件寄存器相同,通過(guò)UART0/UART1的宏定義來(lái)區(qū)分。
我們一般就用加粗的那幾個(gè)端口,UART0可以串口輸入輸出,UART1只有TXD,一般用于打印系統(tǒng)信息。
這里順帶提一句,在后面也會(huì)實(shí)現(xiàn)的:
在初始化端口的時(shí)候
os_printf本接口默認(rèn)從 UART 0 打印。IOT_Demo 中的 uart_init 可以設(shè)置波特率,其中
os_install_putc1((void *)uart1_write_char) 將 os_printf 改為從 UART 1 打印
好了,現(xiàn)在假設(shè)已經(jīng)知道ESP8266的NONOS-SDK開(kāi)發(fā)大致怎么用。
我們所需要的工程目錄大致是這樣的。
初始化UART大致步驟如下:
1、在某個(gè)地方先調(diào)用uart_init(UartBautRate uart0_br, UartBautRate uart1_br),這uart.c的文件中
但是為了使用上接收中斷,我們需要做一點(diǎn)改動(dòng)
| 12345678910111213141516171819202122232425262728293031323334353637 | void ICACHE_FLASH_ATTRuart_init(UartBautRate uart0_br, UartBautRate uart1_br){/*this is a example to process uart data from task,please change the priority to fit your application task if exists*/system_os_task(uart_recvTask, uart_recvTaskPrio, uart_recvTaskQueue, uart_recvTaskQueueLen); //demo with a task to process the uart data UartDev.baut_rate = uart0_br;uart_config(UART0);UartDev.baut_rate = uart1_br;uart_config(UART1);ETS_UART_INTR_ENABLE(); //增加,接收使能中斷 #if UART_BUFF_ENpTxBuffer = Uart_Buf_Init(UART_TX_BUFFER_SIZE);pRxBuffer = Uart_Buf_Init(UART_RX_BUFFER_SIZE);#endif/*option 1: use default print, output from uart0 , will wait some time if fifo is full *///do nothing.../*option 2: output from uart1,uart1 output will not wait , just for output debug info *//*os_printf output uart data via uart1(GPIO2)*///取消注釋,使用uart1作為系統(tǒng)輸出os_install_putc1((void *)uart1_write_char); //use this one to output debug information via uart1 ///*option 3: output from uart0 will skip current byte if fifo is full now... *//*see uart0_write_char_no_wait:you can output via a buffer or output directly *//*os_printf output uart data via uart0 or uart buffer*///os_install_putc1((void *)uart0_write_char_no_wait); //use this to print via uart0 #if UART_SELFTEST&UART_BUFF_ENos_timer_disarm(&buff_timer_t);os_timer_setfn(&buff_timer_t, uart_test_rx , NULL); //a demo to process the data in uart rx bufferos_timer_arm(&buff_timer_t,10,1);#endif} |
?來(lái)自CODE的代碼片 uart_init
2、然后我們需要定義一下中斷服務(wù)函數(shù)uart0_rx_intr_handler(void *para),同樣是在uart.c中,官網(wǎng)給出的SDK是要我們創(chuàng)建一個(gè)接受任務(wù)來(lái)處理
然而我們這里并沒(méi)有使用系統(tǒng)……
所以我決定把里面原有的內(nèi)容全刪了,自己寫!
幾個(gè)步驟:
1)關(guān)中斷
2)清標(biāo)志位
3)處理buf
4)重新打開(kāi)中斷
| 1234567891011121314151617181920212223242526 | LOCAL voiduart0_rx_intr_handler(void *para){int fifo_len; //1uart_rx_intr_disable(UART0);//關(guān)閉中斷 //2WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0),UART_TXFIFO_EMPTY_INT_ENA); //3fifo_len=(READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT; //獲取buf長(zhǎng)度uint8 d_tmp=0;uint8 idx=0;for(idx=0;idx<fifo_len;idx++) //原樣輸出{d_tmp=READ_PERI_REG(UART_FIFO(UART0)) &0xFF;uart_tx_one_char(UART0,d_tmp);} //4WRITE_PERI_REG(UART_INT_CLR(UART0),UART_RXFIFO_FULL_INT_CLR | UART_RXFIFO_TOUT_INT_CLR);uart_rx_intr_enable(UART0);} |
?來(lái)自CODE的代碼片 uart0_rx_intr_handler
3、最后好像就沒(méi)有什么了,user_init就是要調(diào)用uart_init就可以了
等我高級(jí)了我把整個(gè)工程傳上來(lái)2333333
參考:
http://blog.csdn.net/chen244798611/article/details/51470630
ESP8266 SDK 編程手冊(cè).pdf
ESP8266__Interface_UART__CN_v0.2.pdf
總結(jié)
以上是生活随笔為你收集整理的【ESP8266】NONOS SDK开发,串口发送、接收与中断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【ESP8266】NONOS SDK开发
- 下一篇: 关于ESP8266 GPIO中断使用的总