【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的文件中
但是为了使用上接收中断,我们需要做一点改动
| 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作为系统输出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} |
来自CODE的代码片 uart_init
2、然后我们需要定义一下中断服务函数uart0_rx_intr_handler(void *para),同样是在uart.c中,官网给出的SDK是要我们创建一个接受任务来处理
然而我们这里并没有使用系统……
所以我决定把里面原有的内容全删了,自己写!
几个步骤:
1)关中断
2)清标志位
3)处理buf
4)重新打开中断
| 1234567891011121314151617181920212223242526 | LOCAL voiduart0_rx_intr_handler(void *para){int fifo_len; //1uart_rx_intr_disable(UART0);//关闭中断 //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长度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);} |
来自CODE的代码片 uart0_rx_intr_handler
3、最后好像就没有什么了,user_init就是要调用uart_init就可以了
等我高级了我把整个工程传上来2333333
参考:
http://blog.csdn.net/chen244798611/article/details/51470630
ESP8266 SDK 编程手册.pdf
ESP8266__Interface_UART__CN_v0.2.pdf
总结
以上是生活随笔为你收集整理的【ESP8266】NONOS SDK开发,串口发送、接收与中断的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【ESP8266】NONOS SDK开发
- 下一篇: 关于ESP8266 GPIO中断使用的总