为什么esp8266 sdk开发教程的中断会引起异常

esp8266和MQTT(MQTT介绍) - 简书
esp8266和MQTT(MQTT介绍)
为什么要介绍MQTT呢?MQTT又是什么呢?MQTT能做什么呢?下面,我就来简单的介绍一下
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
MQTT的特点:MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;2、对负载内容屏蔽的消息传输;3、使用 TCP/IP 提供网络连接;4、有三种消息发布服务质量:“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。“至少一次”,确保消息到达,但消息重复可能会发生。“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;
说简单一点,它就是一个即时通讯协议,在占用很少的资源情况下,可完成即时通讯。说以说esp8266采用mqtt通讯协议,是一个很不错的选择,使用esp8266+mqtt实现一个物联网的小实验,也是很容易的,其运行的效率也很高,具体的mqtt我在这里就不多说了,大家可以自行去度娘问问啦。现在位置:
单片机是如何 实时 获取网络连接状态的?????断网了 , ESP8266会告诉 单片机吗????
你设置时间不就行了,8266与MCU实时通讯(),当过t时间,单片机收不到数据时,单片机再分析可知模块儿已断网...或者AT版是不知道的,你可以MCU定时发AT指令查询是否在线,具体哪个AT指令我也不清楚1179人阅读
ESP8266学习(8)
串口是一个非常强大的外设,ESP8266EX有两个UART分别是UART0和UART1,其中UART0可以正常通行,而UART1只支持数据发送功能。需要注意的是UART0在上电时会输出一些打印信息,如果想要禁用此功能需要在ESP8266上电期间将U0TXD、U0RXD与U0RTS、U0CTS交换(相关资料可查阅ESP8266官方手册)。
一、UART引脚介绍
GPIO_Pin_26
GPIO_Pin_25
GPIO_Pin_12
GPIO_Pin_13
GPIO_Pin_14
二、UART介绍
ESP8266的UART0和UART1各有一个长度为128Byte的FIFO,读写FIFO时在同一个地址操作。
发送FIFO的基本工作过程:
只要有数据填充到发送FIFO里,就会立即启动发送过程。甶于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送FIFO里。当发送FIFO被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。发送FIFO会按照填入数据的先后顺序把数据一个个发送出去,直到发送FIFO全空时为止。已发送完毕的数据会被自动清除,在发送FIFO里同时会多出一个空位。
接收FIFO的基本工作过程:
当硬件逻辑接收到数据时,就会往接收FIFO里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO里被自动删除的过程,因此在接收FIFO里同时会多出一个空位。如果在接收FIFO里的数据未被及时取走而造成接收FIFO已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。
2.1 UART初始化操作
双UART模式,初始化两个UART的波特率
void uart_init(UartBautRate uart0_br,UartBautRate uart1_br);
UART0的波特率
UART1的波特率
BIT_RATE_9600
BIT_RATE_19200
BIT_RATE_38400
BIT_RATE_57600
BIT_RATE_74800
BIT_RATE_115200
BIT_RATE_230400
BIT_RATE_460800
BIT_RATE_921600
uart_init(BIT_RATE_9600, BIT_RATE_9600);
配置UART0的波特率为9600bps,UART1的波特率为9600bps
2.2 UART0发送字符串函数
UART0发送字符串函数
void uart0_sendStr(const char *str);
发送的字符串
uart0_sendStr(“Hello World! \r\n”);
UART0发送字符串
2.3 UART0发送数据
UART0发送数据
void uart0_tx_buffer(uint8 *buf, uint16 len);
发送的数据缓冲区
发送的数据长度
2.4 UART接收中断使能函数
UART接收中断使能函数
uart_rx_intr_enable(uint8 uart_no);
使能接收中断的UART端口
2.5 UART接收中断禁用函数
UART接收中断禁用函数
uart_rx_intr_disable(uint8 uart_no);
禁用能接收中断的UART端口(前面有介绍)
2.6 UART的参数配置
2.6.1 UART波特率配置
设置UART的波特率
void UART_SetBaudrate(uint8 uart_no,uint32 baud_rate);
需要设置的UART端口(前面有介绍)
设置的波特率(波特率可设置的范围为300bps-4608Kbps))
2.6.2 UART校验模式配置
设置UART的校验模式
void UART_SetParity(uint8 uart_no, UartParityMode Parity_mode);
需要设置的UART端口(前面有介绍)
Parity_mode
设置UART的校验模式
NONE_BITS(0x02)
ODD_BITS(0x01)
EVEN_BITS(0x00)
2.6.3 UART数据字长设置
UART数据字长设置
void UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len);
需要设置的UART端口(前面有介绍)
设置UART的数据字长
FIVE_BITS(0x00)
SIX_BITS(0x01)
SEVEN_BITS(0x02)
EIGHT_BITS(0x03)
2.6.4 UART停止位设置
UART停止位设置
void UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num);
需要设置的UART端口(前面有介绍)
UART的停止位
ONE_STOP_BIT(0x01)
ONE_HALF_STOP_BIT(0x02)
1.5个停止位
TWO_STOP_BIT(0x03)
2.6.4 切换系统默认打印端口
切换系统默认打印端口
void UART_SetPrintPort(uint8 uart_no);
需要切换的UART端口(前面有介绍)
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#include "uart.h"
static os_timer_t os_
void ESP8266_UART0_Init( void )
/** 初始化串口 设置串口的波特率为9600 */
uart_init( BIT_RATE_9600, BIT_RATE_9600 );
/** 配置串口每500ms发送一次数据 */
os_timer_disarm( &os_timer );
os_timer_setfn( &os_timer, (os_timer_func_t *) ( uart0_sendStr ),
"Hello World!\r\n" );
os_timer_arm( &os_timer, 500, 1 );
void user_init( void )
ESP8266_UART0_Init();
[1]. ESP8266技术参考
[2]. ESP8266Non-OS SDK API参考
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11647次
排名:千里之外
原创:31篇
(2)(3)(4)(4)(4)(7)(1)(2)(1)(2)(1)1076人阅读
ESP8266学习(8)
ESP8266的SDK已经为我们写好了有关按键检测的程序,这样大大节省了软件的开发时间。有关按键的程序在SDK根目录下的driver_lib文件夹中的key.c和key.h。
相关API介绍
一、相关结构体介绍
结构体名称
single_key_param
存储按键相关配置数据
按键处理流程标号
GPIO引脚号(0-15)
GPIO 功能(详见ESP8266 管脚清单.xlsx)
GPIO MUX寄存器(参见gpio.h)
os_timer_t
定时器相关数据结构(详见SDK开发文档)
os_timer_t
定时器相关数据结构(详见SDK开发文档)
short_press
key_function
按键短按处理程序
long_press
key_function
按键长按处理程序
结构体原型
/** 按键处理函数 数据类型 */
typedef void (* key_function)(void);
struct single_key_param
uint8 key_
uint8 gpio_
uint8 gpio_
uint32 gpio_
os_timer_t key_5s;
os_timer_t key_50
key_function short_
key_function long_
结构体名称
keys_param
存储按键参数
按键的数量
single_key
single_key_param **
按键的相关信息
结构体原型
struct keys_param
uint8 key_
struct single_key_param **single_
二、按键相关参数初始化函数
初始化按键的相关参数
struct single_key_param *ICACHE_FLASH_ATTR key_init_single(uint8 gpio_id, uint32 gpio_name, uint8 gpio_func, key_function long_press, key_function short_press)
GPIO的引脚号(0-15)
GPIO MUX寄存器(详见eagle_soc.h)
GPIO 功能(详见ESP8266 管脚清单.xlsx)
long_press
按键长按处理程序
short_press
按键短按处理程序
返回值介绍
返回一个由程序分配的存储着按键数据的指针
struct single_key_param *ICACHE_FLASH_ATTR key_init_single(uint8 gpio_id, uint32 gpio_name, uint8 gpio_func, key_function long_press, key_function short_press)
struct single_key_param *single_key = (struct single_key_param *)os_zalloc(sizeof(struct single_key_param));
single_key-&gpio_id = gpio_
single_key-&gpio_name = gpio_
single_key-&gpio_func = gpio_
single_key-&long_press = long_
single_key-&short_press = short_
return single_
三 、按键初始化函数
初始化按键
void ICACHE_FLASH_ATTR key_init(struct keys_param *keys)
void ICACHE_FLASH_ATTR key_init(struct keys_param *keys)
/** 配置GPIO中断的中断服务函数 */
ETS_GPIO_INTR_ATTACH(key_intr_handler, keys);
/** 关闭GPIO中断 */
ETS_GPIO_INTR_DISABLE();
for (i = 0; i & keys-&key_ i++)
keys-&single_key[i]-&key_level = 1;
/** 配置引脚模式为GPIO模式 */
PIN_FUNC_SELECT(keys-&single_key[i]-&gpio_name, keys-&single_key[i]-&gpio_func);
/** 配置GPIO模式为输入模式 */
gpio_output_set(0, 0, 0, GPIO_ID_PIN(keys-&single_key[i]-&gpio_id));
/** 初始化GPIO中断配置 */
gpio_register_set(GPIO_PIN_ADDR(keys-&single_key[i]-&gpio_id), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE)
| GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE)
| GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE));
/** 清除GPIO中断标志 */
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(keys-&single_key[i]-&gpio_id));
/** 配置GPIO中断触发类型为下降沿触发 */
gpio_pin_intr_state_set(GPIO_ID_PIN(keys-&single_key[i]-&gpio_id), GPIO_PIN_INTR_NEGEDGE);
/** 开启GPIO中断 */
ETS_GPIO_INTR_ENABLE();
按键检测处理程序介绍
一、按键检测处理流程图
二、按键长按检测函数
static void ICACHE_FLASH_ATTR key_5s_cb(struct single_key_param *single_key)
/** 关闭按键长按检测定时器 */
os_timer_disarm(&single_key-&key_5s);
/** 按键处于按下状态 */
if (0 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key-&gpio_id)))
/** 执行按键长按处理函数 */
if (single_key-&long_press)
single_key-&long_press();
三、按键短按检测函数
static void ICACHE_FLASH_ATTR key_50ms_cb(struct single_key_param *single_key)
/** 关闭按键短按检测定时器 */
os_timer_disarm(&single_key-&key_50ms);
/** 按键处于松开状态 */
if (1 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key-&gpio_id)))
/** 停止按键长按状态检测 */
os_timer_disarm(&single_key-&key_5s);
single_key-&key_level = 1;
/** 设置该按键中断触发方式为下降沿触发(等待按键再次按下) */
gpio_pin_intr_state_set(GPIO_ID_PIN(single_key-&gpio_id), GPIO_PIN_INTR_NEGEDGE);
/** 运行按键短按处理程序 */
if (single_key-&short_press)
single_key-&short_press();
/** 设置该按键中断触发方式为上升沿触发(等待按键松开) */
gpio_pin_intr_state_set(GPIO_ID_PIN(single_key-&gpio_id), GPIO_PIN_INTR_POSEDGE);
四、GPIO中断处理函数
static void key_intr_handler(struct keys_param *keys)
uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
for (i = 0; i & keys-&key_ i++)
if (gpio_status & BIT(keys-&single_key[i]-&gpio_id))
/** 关闭该按键的中断 */
gpio_pin_intr_state_set(GPIO_ID_PIN(keys-&single_key[i]-&gpio_id), GPIO_PIN_INTR_DISABLE);
/** 清除该按键的中断标志 */
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & BIT(keys-&single_key[i]-&gpio_id));
/** 按键处理流程一 */
if (keys-&single_key[i]-&key_level == 1)
/** 启动按键长按检测定时器 */
os_timer_disarm(&keys-&single_key[i]-&key_5s);
os_timer_setfn(&keys-&single_key[i]-&key_5s, (os_timer_func_t *)key_5s_cb, keys-&single_key[i]);
os_timer_arm(&keys-&single_key[i]-&key_5s, 5000, 0);
keys-&single_key[i]-&key_level = 0;
/** 设置该按键中断触发方式为上升沿触发(等待按键松开) */
gpio_pin_intr_state_set(GPIO_ID_PIN(keys-&single_key[i]-&gpio_id), GPIO_PIN_INTR_POSEDGE);
/** 按键处理流程二 */
/** 启动按键短按检测定时器 */
os_timer_disarm(&keys-&single_key[i]-&key_50ms);
os_timer_setfn(&keys-&single_key[i]-&key_50ms, (os_timer_func_t *)key_50ms_cb, keys-&single_key[i]);
os_timer_arm(&keys-&single_key[i]-&key_50ms, 50, 0);
#include "ets_sys.h"
#include "osapi.h"
#include "os_type.h"
#include "user_interface.h"
#include "eagle_soc.h"
#include "gpio.h"
#include "key.h"
*******************************************************************************
开关输入引脚配置
*******************************************************************************
#define SWITCH_Pin_NUM
#define SWITCH_Pin_FUNC
FUNC_GPIO5
#define SWITCH_Pin_MUX
PERIPHS_IO_MUX_GPIO5_U
#define SWITCH_Pin_Rd_Init()
GPIO_DIS_OUTPUT(SWITCH_Pin_NUM)
#define SWITCH_Pin_Wr_Init()
GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0)
#define SWITCH_Pin_Set_High()
GPIO_OUTPUT_SET(SWITCH_Pin_NUM,1)
#define SWITCH_Pin_Set_Low()
GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0)
#define SWITCH_Pin_State
( GPIO_INPUT_GET(SWITCH_Pin_NUM) != 0 )
*******************************************************************************
按键相关变量
*******************************************************************************
static struct keys_param switch_
static struct single_key_param *switch_
static bool status =
*******************************************************************************
开关短按状态处理函数
*******************************************************************************
static void Switch_ShortPress_Handler( void )
if( status == true )
*******************************************************************************
输入初始化函数
*******************************************************************************
void drv_Switch_Init( void )
switch_signle = key_init_single( SWITCH_Pin_NUM, SWITCH_Pin_MUX,
SWITCH_Pin_FUNC,
&Switch_ShortPress_Handler );
switch_param.key_num = 1;
switch_param.single_key = &switch_
key_init( &switch_param );
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11647次
排名:千里之外
原创:31篇
(2)(3)(4)(4)(4)(7)(1)(2)(1)(2)(1)ESP8266 GPIO中断学习
ESP8266 GPIO中断学习
ESP8266学习
GPIO中断在进行脉宽测量、脉冲计数时能起到极为重要的作用,本文主要介绍GPIO中断的用法,使用一个开关打开或关闭一个LED灯。
GPIO寄存器介绍
一、GPIO输入寄存器
寄存器名称
寄存器大小
寄存器属性
输入状态寄存器
对应GPIO0-GPIO15
GPIO_PIN12
中断类型寄存器
0:禁用该GPIO的中断 1:上升沿触发中断
2:下降沿触发中断
3:双边沿触发中断
4:低电平触发中断
5:高电平触发中断
GPIO_STATUS
中断状态寄存器
对应GPIO0-GPIO15
GPIO_STATUS_W1TC
复位中断标志寄存器
对应GPIO0-GPIO15
二、GPIO输出寄存器
寄存器名称
寄存器大小
寄存器属性
GPIO_ENABLE_W1TS
使能输出寄存器
对应GPIO0-GPIO15
GPIO_ENABLE_W1TC
禁用输出寄存器
对应GPIO0-GPIO15
GPIO_ENABLE
输出使能状态寄存器
对应GPIO0-GPIO15
GPIO_OUT_W1TC
输出低电平寄存器
对应GPIO0-GPIO15
GPIO_OUT_W1TS
输出高电平寄存器
对应GPIO0-GPIO15
输出状态寄存器
对应GPIO0-GPIO15
注:GPIO16不支持触发IO中断。
相关API介绍
一、引脚复用功能切换函数
配置某引脚的其他功能
PIN_FUNC_SELECT(PIN_NAME, FUNC)
该引脚的MUX寄存器
引脚需要配置的功能
关于PIN_NAME的参数详见eagle_soc.h,关于FUNC的参数详见ESP8266 管脚清单.xlsx(在官网上可以找到当然页可以参考eagle_soc.h)。
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
配置MTDI引脚作为GPIO使用
二、输入模式配置
配置某引脚为输入模式
GPIO_DIS_OUTPUT(gpio_no)
GPIO的引脚号(0-15)
GPIO_DIS_OUTPUT(0);
配置GPIO0为输入模式
三、上拉模式配置
开启某引脚上拉模式
PIN_PULLUP_EN(PIN_NAME)
该引脚的MUX寄存器的名称
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);
开启GPIO4的上拉输入功能
关闭某引脚上拉模式
PIN_PULLUP_DIS(PIN_NAME)
该引脚的MUX寄存器的名称
PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO4_U);
关闭GPIO4的上拉输入功能
四、获取输入引脚状态
读取某引脚的高低电平状态
GPIO_INPUT_GET(gpio_no)
GPIO的引脚号(0-15)
GPIO_INPUT_GET(0);
读取GPIO0的输入引脚状态
五、GPIO中断状态配置
开启GPIO中断
ETS_GPIO_INTR_ENABLE()
关闭GPIO中断
ETS_GPIO_INTR_DISABLE()
六、配置中断处理函数
配置中断处理函数
ETS_GPIO_INTR_ATTACH(GPIO_INTERRUPT,NULL)
GPIO_INTERRUPT
GPIO的中断处理函数
GPIO的中断服务函数的参数
void GPIO_ISR_Handler( void )
/** GPIO中断处理函数 */
void GPIO_ISR_Handler_Config( void )
ETS_GPIO_INTR_ATTACH(&GPIO_ISR_Handler,NULL);
七、配置GPIO中断触发方式
配置GPIO中断触发方式
void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state);
i(GPIO_ID_PIN(n))
GPIO的引脚ID(n为GPIO引脚号,范围为0-15)
intr_state
GPIO中断触发方式
GPIO_PIN_INTR_DISABLE(0)
禁用该引脚的中断
GPIO_PIN_INTR_POSEDGE(1)
使能该引脚的上升沿中断
GPIO_PIN_INTR_NEGEDGE(2)
使能该引脚的下降沿中断
GPIO_PIN_INTR_ANYEDGE(3)
使能该引脚的双边沿中断
GPIO_PIN_INTR_LOLEVEL(4)
使能该引脚的低电平中断
GPIO_PIN_INTR_HILEVEL(5)
使能该引脚的高电平中断
gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_ANYEDGE);
配置GPIO0的中断触发方式为双边沿触发方式
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#include "eagle_soc.h"
#include "gpio.h"
#include "gpio16.h"
/** 开关输入相关 宏定义 */
#define SWITCH_Pin_NUM
#define SWITCH_Pin_FUNC
FUNC_GPIO5
#define SWITCH_Pin_MUX
PERIPHS_IO_MUX_GPIO5_U
#define SWITCH_Pin_Rd_Init()
GPIO_DIS_OUTPUT(SWITCH_Pin_NUM)
#define SWITCH_Pin_Wr_Init()
GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0)
#define SWITCH_Pin_Set_High()
GPIO_OUTPUT_SET(SWITCH_Pin_NUM,1)
#define SWITCH_Pin_Set_Low()
GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0)
#define SWITCH_Pin_State
( GPIO_INPUT_GET(SWITCH_Pin_NUM) != 0 )
*******************************************************************************
GPIO中断处理函数
*******************************************************************************
static void GPIO_ISR_Handler( void )
/** 读取GPIO中断状态 */
u32 pin_status = GPIO_REG_READ( GPIO_STATUS_ADDRESS );
/** 关闭GPIO中断 */
ETS_GPIO_INTR_DISABLE();
/** 清除GPIO中断标志 */
GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, pin_status );
/** 检测是否已开关输入引脚中断 */
if ( pin_status & BIT( SWITCH_Pin_NUM ) )
if( SWITCH_Pin_State )
gpio16_output_set(0);
gpio16_output_set(1);
/** 开启GPIO中断 */
ETS_GPIO_INTR_ENABLE();
*******************************************************************************
输入初始化函数
*******************************************************************************
static void drv_Input_Init( void )
PIN_FUNC_SELECT( SWITCH_Pin_MUX, SWITCH_Pin_FUNC );
SWITCH_Pin_Rd_Init();
ETS_GPIO_INTR_DISABLE();
ETS_GPIO_INTR_ATTACH( &GPIO_ISR_Handler, NULL );
gpio_pin_intr_state_set( GPIO_ID_PIN( SWITCH_Pin_NUM ),
GPIO_PIN_INTR_ANYEDGE );
/** 清除该引脚的GPIO中断标志 */
GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, BIT(SWITCH_Pin_NUM) );
ETS_GPIO_INTR_ENABLE();
*******************************************************************************
用户初始化程序
*******************************************************************************
void user_init( void )
drv_Input_Init();
gpio16_output_conf();
[1]. ESP8266技术参考
[2]. ESP8266Non-OS SDK API参考
[3]. ESP8266 管脚清单
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 esp8266串口中断 的文章

 

随机推荐