【ESP8266】NONOS SDK開發,串列埠傳送、接收與中斷
ESP8266感覺要成現在物聯網的黑馬了,整合WiFi功能、能程式設計,還便宜,確實挺6的。
就是能提供的資料太少,感覺官網上的遠遠不夠用,這個串列埠收發與中斷折騰了我是在太久,在這裡小的就分享一下自己的經驗。
大家都問我要工程,我終於可以上傳啦:
http://download.csdn.net/download/d521000121/10045750
由於時代久遠,本人很多都忘了,誠意與大家交流。
晶片: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各有一個長度為128Byte的硬體FIFO,讀寫FIFO都在同一個地址操作。
兩個UART模組的硬體暫存器相同,通過UART0/UART1的巨集定義來區分。
我們一般就用加粗的那幾個埠,UART0可以串列埠輸入輸出,UART1只有TXD,一般用於列印系統資訊。
這裡順帶提一句,在後面也會實現的:
在初始化埠的時候
os_printf本介面預設從 UART 0 列印。IOT_Demo 中的 uart_init 可以設定波特率,其中
os_install_putc1((void *)uart1_write_char) 將 os_printf 改為從 UART 1 列印
好了,現在假設已經知道ESP8266的NONOS-SDK開發大致怎麼用。
我們所需要的工程目錄大致是這樣的。
初始化UART大致步驟如下:
1、在某個地方先呼叫uart_init(UartBautRate uart0_br, UartBautRate uart1_br),這uart.c的檔案中
但是為了使用上接收中斷,我們需要做一點改動
void ICACHE_FLASH_ATTR uart_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_EN pTxBuffer = 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作為系統輸出 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_EN os_timer_disarm(&buff_timer_t); os_timer_setfn(&buff_timer_t, uart_test_rx , NULL); //a demo to process the data in uart rx buffer os_timer_arm(&buff_timer_t,10,1); #endif }
2、然後我們需要定義一下中斷服務函式uart0_rx_intr_handler(void *para),同樣是在uart.c中,官網給出的SDK是要我們建立一個接受任務來處理
然而我們這裡並沒有使用系統……
所以我決定把裡面原有的內容全刪了,自己寫!
幾個步驟:
1)關中斷
2)清標誌位
3)處理buf
4)重新開啟中斷
LOCAL void
uart0_rx_intr_handler(void *para)
{
int fifo_len;
//1
uart_rx_intr_disable(UART0);//¹Ø±ÕÖжÏ
//2
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0),UART_TXFIFO_EMPTY_INT_ENA);
//3
fifo_len=(READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT; //»ñÈ¡buf³¤¶È
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);
}
//4
WRITE_PERI_REG(UART_INT_CLR(UART0),UART_RXFIFO_FULL_INT_CLR | UART_RXFIFO_TOUT_INT_CLR);
uart_rx_intr_enable(UART0);
}
3、最後好像就沒有什麼了,user_init就是要呼叫uart_init就可以了
等我高階了我把整個工程傳上來2333333
參考:
http://blog.csdn.net/chen244798611/article/details/51470630
ESP8266 SDK 程式設計手冊.pdf
ESP8266__Interface_UART__CN_v0.2.pdf