ESP8266:SDK开发(源码见资料源码)

开发板购买链接:开发板购买链接

资料源码:https://gitee.com/yang456/Learn8266ForSDK.git

开发软件:https://mnifdv.cn/resource/cnblogs/Learn8266ForSDK/AiThinkerIDE_V0.5_Setup.exe

点击加入群聊【ESP8266开发交流群】:

淘宝上许多贩卖TCP,UDP,APP,上位机,MQTT,云服务器等基础控制教程的,但是基础的没必要拿出来贩卖!

因为过于简单,只能个人玩玩而已,感觉像是在坑小学生。故,我给大家整理好,开源出来以供大家学习使用!

串口分布

  

NONOS

NONOS

NONOS

1.配置串口

2.按照上面的配置以后,接收中断进入这里面

3.用户需要知道的事情

串口内部自带一个FIFO缓存,数据接收以后先缓存到内部FIFO缓存里面

内部FIFO满了以后进入FIFO满中断

串口打开了串口超时(空闲)中断:超过两个字节的时间没有接受到数据,进入串口超时(空闲)中断

接收思路:

如果进入满中断,在满中断中提取FIFO里面的数据

如果进入空闲中断,在空闲中断中提取FIFO里面的数据

无论怎样,程序最终都会进入空闲中断!

这节接收数据采用缓存

具体细节请参考:

https://www.cnblogs.com/yangfengwu/p/12770504.html

4.直接上菜

4.1创建缓存

#include "driver/BufferManage.h"
/*******串口接收缓存********/
#define UartReadbuffLen 2048
#define UartManagebuffLen 60
u8  UartReadbuff[UartReadbuffLen];//缓存串口接收的每一条数据
u32 UartManagebuff[UartManagebuffLen];//最大管理的数据条数u8  UartReadbuffCopy[UartReadbuffLen];//提取缓存数据BufferManageCreate(&buff_manage, UartReadbuff, UartReadbuffLen, UartManagebuff, UartManagebuffLen*4);//创建缓存

4.2往缓存里面存数据

#include "driver/BufferManage.h"#define Uart0ReadBuffLen 2048
uint8 Uart0ReadBuff[Uart0ReadBuffLen];//串口一次性最大接收的数据个数
u32   Uart0ReadCnt=0;LOCAL void
uart0_rx_intr_handler(void *para)
{uint8 RcvChar;uint8 uart_no = UART0;//UartDev.buff_uart_no;uint8 fifo_len = 0;uint8 buf_idx = 0;uint8 temp,cnt;int WriteState;//RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para;if(UART_FRM_ERR_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_FRM_ERR_INT_ST)){DBG1("FRM_ERR\r\n");WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_FRM_ERR_INT_CLR);}else if(UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_FULL_INT_ST)){//FIFO满中断fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;//读出来内部FIFO缓存的数据个数while (fifo_len--){if(Uart0ReadCnt<Uart0ReadBuffLen-1){//别超过了数组的大小Uart0ReadBuff[Uart0ReadCnt] = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;//取出来一个数据Uart0ReadCnt++;}else{Uart0ReadCnt = 0;}}WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);}else if(UART_RXFIFO_TOUT_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_TOUT_INT_ST)){//FIFO空闲中断fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;//读出来内部FIFO缓存的数据个数while (fifo_len--){if(Uart0ReadCnt<Uart0ReadBuffLen-1){//别超过了数组的大小Uart0ReadBuff[Uart0ReadCnt] = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;//取出来一个数据Uart0ReadCnt++;}else{Uart0ReadCnt = 0;}}BufferManageWrite(&buff_manage,Uart0ReadBuff,Uart0ReadCnt,&WriteState);//把数据插入缓存Uart0ReadCnt=0;WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR);}else if(UART_TXFIFO_EMPTY_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_TXFIFO_EMPTY_INT_ST)){DBG("e");CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA);#if UART_BUFF_ENtx_start_uart_buffer(UART0);#endif//system_os_post(uart_recvTaskPrio, 1, 0);WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_TXFIFO_EMPTY_INT_CLR);}else if(UART_RXFIFO_OVF_INT_ST  == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_OVF_INT_ST)){WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_RXFIFO_OVF_INT_CLR);DBG1("RX OVF!!\r\n");}
}

4.3提取缓存数据,并输出

BufferManageRead(&buff_manage,UartReadbuffCopy,&buff_manage.ReadLen);/*取出缓存的数据*/if(buff_manage.ReadLen>0){/*缓存取出来数据*/uart0_tx_buffer(UartReadbuffCopy,buff_manage.ReadLen);}

测试

如果想应用到自己的项目,拷贝以下文件

RTOS

RTOS

RTOS

1.默认所有的数据都使用串口0输出

官方提供了函数可以选择printf利用哪一个串口输出

配置printf使用串口1打印输出,波特率115200

(注:这样配置对于调试程序很有帮助,printf当做程序运行的日志打印)

  

  

  

void
uart_init_new(void)
{UART_WaitTxFifoEmpty(UART0);UART_WaitTxFifoEmpty(UART1);UART_ConfigTypeDef uart_config;uart_config.baud_rate    = BIT_RATE_115200;//波特率uart_config.data_bits     = UART_WordLength_8b;//数据位数uart_config.parity          = USART_Parity_None;//奇偶校验uart_config.stop_bits     = USART_StopBits_1;//停止位uart_config.flow_ctrl      = USART_HardwareFlowControl_None;//硬件流控制uart_config.UART_RxFlowThresh = 120;uart_config.UART_InverseMask = UART_None_Inverse;UART_ParamConfig(UART0, &uart_config);UART_ParamConfig(UART1, &uart_config);//串口1和串口0的配置一样UART_IntrConfTypeDef uart_intr;//配置启用哪些些中断                                                    数据接收超时                                                               接收数据错误                                                  缓存满中断                                                            发送空中断uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA | UART_TXFIFO_EMPTY_INT_ENA;uart_intr.UART_RX_FifoFullIntrThresh = 10;//接收数据个数超过10个字节进入FIFO满中断uart_intr.UART_RX_TimeOutIntrThresh = 2;//超过两个字节的数据的时间没有接收到数据,进入接收超时中断uart_intr.UART_TX_FifoEmptyIntrThresh = 20;UART_IntrConfig(UART0, &uart_intr);//    UART_SetPrintPort(UART0);UART_SetPrintPort(UART1);//printf使用串口1输出UART_intr_handler_register(uart0_rx_intr_handler, NULL);ETS_UART_INTR_ENABLE();/*UART_SetWordLength(UART0,UART_WordLength_8b);UART_SetStopBits(UART0,USART_StopBits_1);UART_SetParity(UART0,USART_Parity_None);UART_SetBaudrate(UART0,74880);UART_SetFlowCtrl(UART0,USART_HardwareFlowControl_None,0);*/}

串口接收数据说明

1.该模块默认内部有个128字节的缓存区,默认接收的数据存入缓存区里面

在中断接收函数里面,从缓存里面获取数据

  

2.咱们在串口中断函数里面,是在满中断和接收超时中断里面获取串口接收的数据

  

串口接收数据典型程序

1.具体请参考: https://www.cnblogs.com/yangfengwu/p/11669373.html

2.uart.c

//串口数据接收处理方式:https://www.cnblogs.com/yangfengwu/p/11669373.html
char Usart0ReadBuff[Usart0ReadLen]={0};//接收数据缓存
u32  Usart0ReadCnt = 0;//串口接收的数据个数
u32  Usart0ReadCntCopy = 0;//用于拷贝串口接收的数据个数
u32  Usart0IdleCnt = 0;//空闲时间累加变量

LOCAL void
uart0_rx_intr_handler(void *para)
{uint8 RcvChar;uint8 uart_no = UART0;//UartDev.buff_uart_no;uint8 fifo_len = 0;uint8 buf_idx = 0;
//    uint8 fifo_tmp[128] = {0};uint32 uart_intr_status = READ_PERI_REG(UART_INT_ST(uart_no)) ;while (uart_intr_status != 0x0) {if (UART_FRM_ERR_INT_ST == (uart_intr_status & UART_FRM_ERR_INT_ST)) {//数据错误//printf("FRM_ERR\r\n");WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_FRM_ERR_INT_CLR);} else if (UART_RXFIFO_FULL_INT_ST == (uart_intr_status & UART_RXFIFO_FULL_INT_ST)) {//FIFO满中断
//            printf("full\r\n");fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;//读取缓存了多少字节buf_idx = 0;while (buf_idx < fifo_len) {if(Usart0ReadCnt>Usart0ReadLen){//预防数组溢出Usart0ReadCnt=0;}Usart0ReadBuff[Usart0ReadCnt] = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;//把数据存入数组Usart0ReadCnt++;Usart0IdleCnt=0;
//                uart_tx_one_char(UART0, READ_PERI_REG(UART_FIFO(UART0)) & 0xFF);//从FIFO读取一字节数据并发送出去buf_idx++;}WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);} else if (UART_RXFIFO_TOUT_INT_ST == (uart_intr_status & UART_RXFIFO_TOUT_INT_ST)) {//接收超时中断
//            printf("tout\r\n");fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;//读取缓存了多少字节buf_idx = 0;while (buf_idx < fifo_len) {if(Usart0ReadCnt>Usart0ReadLen){//预防数组溢出Usart0ReadCnt=0;}Usart0ReadBuff[Usart0ReadCnt] = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;//把数据存入数组Usart0ReadCnt++;Usart0IdleCnt=0;
//                uart_tx_one_char(UART0, READ_PERI_REG(UART_FIFO(UART0)) & 0xFF);//从FIFO读取一字节数据并发送出去buf_idx++;}WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR);} else if (UART_TXFIFO_EMPTY_INT_ST == (uart_intr_status & UART_TXFIFO_EMPTY_INT_ST)) {//发送缓存为空
//            printf("empty\n\r");WRITE_PERI_REG(UART_INT_CLR(uart_no), UART_TXFIFO_EMPTY_INT_CLR);CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_TXFIFO_EMPTY_INT_ENA);} else {//skip}uart_intr_status = READ_PERI_REG(UART_INT_ST(uart_no)) ;}
}

3.uart.h

#define Usart0ReadLen 1024  //串口缓存的最大字节数
#define Usart0IdleTime 10//设置串口空闲时间

4.user_main.h

#include "uart.h"extern char Usart0ReadBuff[Usart0ReadLen];//接收数据缓存
extern u32  Usart0ReadCnt;//串口接收的数据个数
extern u32  Usart0ReadCntCopy;//用于拷贝串口接收的数据个数
extern u32  Usart0IdleCnt;//空闲时间累加变量

/**
* @brief   硬件定时器中断回调函数
* @param   None
* @param   None
* @param   None
* @param   None
* @retval  None
* @warning None
* @example
**/
void hw_test_timer_cb(void)
{if(Usart0ReadCnt!=0){//串口接收到数据Usart0IdleCnt++;//空闲时间累加if(Usart0IdleCnt>Usart0IdleTime){//累加到期望值(10ms)Usart0IdleCnt=0;Usart0ReadCntCopy = Usart0ReadCnt;//拷贝接收的数据个数Usart0ReadCnt=0;/*处理数据* 数据缓存数组:Usart0ReadBuff* 数据长度:Usart0ReadCntCopy* */}}
}
/******************************************************************************* FunctionName : user_init* Description  : entry of user application, init user function here* Parameters   : none* Returns      : none
*******************************************************************************/
void user_init(void)
{uart_init_new();printf("SDK version:%s\n", system_get_sdk_version());printf("Ai-Thinker Technology Co. Ltd.\r\n%s %s\r\n", __DATE__, __TIME__);//定时器初始化hw_timer_init(1);//1:循环//设置定时器回调函数hw_timer_set_func(hw_test_timer_cb);//hw_test_timer_cb:硬件定时器中断回调函数hw_timer_arm(1000);//1000:1000us定时进入中断函数
}

串口发送

1.说明

串口发送实际上是把要发送的数据拷贝到128字节的数据发送缓存区

然后由模块内部发送

2.发送函数

3.为了可以在别的文件中使用,去掉函数前面的LOCAL 标识

测试串口返回接收到的信息

/**
* @brief   硬件定时器中断回调函数
* @param   None
* @param   None
* @param   None
* @param   None
* @retval  None
* @warning None
* @example
**/
void hw_test_timer_cb(void)
{if(Usart0ReadCnt!=0){//串口接收到数据Usart0IdleCnt++;//空闲时间累加if(Usart0IdleCnt>Usart0IdleTime){//累加到期望值(10ms)Usart0IdleCnt=0;Usart0ReadCntCopy = Usart0ReadCnt;//拷贝接收的数据个数Usart0ReadCnt=0;/*处理数据* 数据缓存数组:Usart0ReadBuff* 数据长度:Usart0ReadCntCopy* */for(i=0;i<Usart0ReadCntCopy;i++){uart_tx_one_char(UART0,Usart0ReadBuff[i]);}}}
}

NONOS_SDK版本区别

NONOS提供了使用内部Task接收数据

如果不想使用Task,想用上面的方式实现

在最后有一个 uart_init_2 可使用这个函数初始化串口

void ICACHE_FLASH_ATTR
uart_init_2(UartBautRate uart0_br, UartBautRate uart1_br)
{// rom use 74880 baut_rate, here reinitializeUartDev.baut_rate = uart0_br;
//    UartDev.exist_parity = STICK_PARITY_EN;UartDev.parity = NONE_BITS;UartDev.stop_bits = ONE_STOP_BIT;UartDev.data_bits = EIGHT_BITS;uart_config(UART0);UartDev.baut_rate = uart1_br;uart_config(UART1);ETS_UART_INTR_ENABLE();// install uart1 putc callbackos_install_putc1((void *)uart1_write_char);//print output at UART1}

os_install_putc1((void *)uart0_write_char);//print output at UART0

2.06-外设篇-串口相关推荐

  1. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

  2. 多麦克风做拾音的波束_乱侃外设 篇四十二:一浪更比一浪强!HyperX Quadcast S 声浪加强版麦克风浅评...

    原标题:乱侃外设 篇四十二:一浪更比一浪强!HyperX Quadcast S 声浪加强版麦克风浅评 乱侃外设 篇四十二:一浪更比一浪强!HyperX Quadcast S 声浪加强版麦克风浅评 20 ...

  3. z490 linux raid,PC硬件与外设 篇二十三:光威弈系列Pro Z490平台装机评测(含raid模式)...

    PC硬件与外设 篇二十三:光威弈系列Pro Z490平台装机评测(含raid模式) 2020-06-16 09:53:51 0点赞 0收藏 0评论 创作立场声明:raid模式值得体验 存储颗粒与主控的 ...

  4. 【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器

    [STM32]标准库与HAL库对照学习教程外设篇--红外避障传感器 一.前言 二.准备工作 三.红外避障传感器 1.传感器原理说明 2.传感器特性 四.标准库使用红外传感器 1.实验程序 2.实验效果 ...

  5. 安卓系统百变USB OTG之输入外设篇

    安卓系统百变USB OTG之输入外设篇 转自:http://www.sina.com.cn   2012年09月29日 09:27  斑马网 近日小米2的开箱照频频曝光,而在小米的随箱"嫁妆 ...

  6. 【ESP32学习笔记】#外设篇#(3)串口通信(UART)

    一.简介 官方文档:UART ESP32 有 3 个 UART 控制器(UART0.UART1 和 UART2),它们具有一组相同的寄存器. 每个 UART 控制器均可独立配置参数,如波特率.数据位长 ...

  7. Esp8266 进阶之路36【外设篇】乐鑫esp8266芯片SDK编程驱动时间芯片 ds1302,同步网络时间到本地,再也不怕掉电断网也可以同步时间了!(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  8. Esp8266 进阶之路31【外设篇】分享一个乐鑫esp8266 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  9. Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  10. USART串口协议和USART串口外设(USART串口发送串口发送和接收)

    1.通信接口 A.基本概念 • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发  异步:需要双方约定一个频率 B.数据通信方 ...

最新文章

  1. Python开发【第十篇】:CSS (二)
  2. 百度大脑发挥AI“头雁效应” 王海峰:在AI时代共同推动社会智能化升级
  3. hdfs 数据迁移_基于JindoFS+OSS构建高效数据湖
  4. sun building in shanghai
  5. 如何查看、备份电脑隐藏的恢复分区
  6. 6-7 求链表的倒数第m个元素 (25 分)
  7. C++ 异常变量的生命周期
  8. [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
  9. 使用nagios监控io,内存
  10. php分享十三:mysql事物
  11. (版本定制)第2课:通过案例对SparkStreaming透彻理解之二
  12. 暑期训练第四次团队赛
  13. word文件做一半未响应_Word 2016 开个别文档总是未响应
  14. IDEA Tomcat 无法加载mysql驱动
  15. python中ttk和tkinter_Python Tkinter ttk组件及用法(附带实例)
  16. 2022 最新Robots.txt文件教程
  17. 发那科sub_FANUC PMC功能指令之计数器 CTR SUB5-共享屋共享屋
  18. JAVA的直接内存介绍
  19. 支付宝等第三方支付原理与概述
  20. 刚看《孙悟空是一个好员工》,有一段比喻很有意思

热门文章

  1. 一波骚操作,用 Python 给照片换颜色
  2. Cookie跨域存储问题
  3. 1088: 手机短号 (多实例)____酸菜鱼(h404j)的博客
  4. 简户检测 | 上海可靠性——电子胶带剥离力测试、胶带初粘力试验、胶黏剂剪切强度试验、高速剥离力测试、拉力测试
  5. 一些免费的无限制接口
  6. c语言shengchen图像,430编程C语言常识(IAR)(二)结构体与联合体
  7. Keil uVision4起步简单编程 __note1
  8. c语言空格键变成删除键怎么变回来,文档空格键怎么变成删除了
  9. 不要再搞混Vue的响应式原理和双向数据绑定了
  10. 解决Jekins打包报错Failed to execute goal....