【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开发大致怎么用。

我们所需要的工程目录大致是这样的。

【ESP8266】NONOS SDK开发,串口发送、接收与中断_第1张图片

初始化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

 

 

3、最后好像就没有什么了,user_init就是要调用uart_init就可以了

等我高级了我把整个工程传上来2333333

 

参考:

http://blog.csdn.net/chen244798611/article/details/51470630

ESP8266 SDK 编程手册.pdf

ESP8266__Interface_UART__CN_v0.2.pdf

你可能感兴趣的:(嵌入式)