1. 程式人生 > >【ESP8266】NONOS SDK開發,串列埠傳送、接收與中斷

【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