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
3、最后好像就没有什么了,user_init就是要调用uart_init就可以了
等我高级了我把整个工程传上来2333333
参考:
http://blog.csdn.net/chen244798611/article/details/51470630
ESP8266 SDK 编程手册.pdf
ESP8266__Interface_UART__CN_v0.2.pdf