开始:
1)头文件 #include \"大众driver/gpio16.h\"大众
2)ESP8266的GPIO16属于RTC模块,不能触发中断,与其他GPIO的配置办法不同,配置函数如下
void gpio16_output_conf(void); //初始化为输出模式void gpio16_output_set(uint8 value); //输出指定电平void gpio16InputConf(void); //配置为输入模式uint8 gpio16InputGet(void); //获取管脚输入 3)由于不能中断,无法监控其状态,通过循环或定时器回调检讨//检讨输入的回调void ICACHE_FLASH_ATTR gpio16_timer_cb(){ TimerCounter++;//目的设置频率 //事先定义宏定义(获取状态的值)和一个变量记录旧状态 if(Pin16_OldState!=SWITCH_Pin16_State){Pin16_OldState=SWITCH_Pin16_State;//记录新状态GPIO_OUTPUT_SET(GPIO_ID_PIN(12), Pin16_OldState);//继电器1//Pin16_OldState=!Pin16_OldState;//取反 //os_delay_us(20); }} void ICACHE_FLASH_ATTRGPIO16_Timer_init(){ os_timer_disarm(&timer); os_timer_setfn(&timer,(os_timer_func_t )gpio16_timer_cb,NULL); //set callback func os_timer_arm(&timer,500,1); //set timer interval 1000ms}
扩展知识:正常的中断如何调用?干货!
触摸按钮(14)掌握开关(13)
static void GPIO_INTR_Handler(void arg){
//读取GPIO中断状态;寄存器,获取中断信息
u32 GPIOStatus = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
//全局关闭GPIO中断
ETS_GPIO_INTR_DISABLE();
os_delay_us(20);
//打消中断状态信息
GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, GPIOStatus);//clear interrupt status
if ( GPIOStatus & BIT(14)){ //中断源来自
RelayStatus = !RelayStatus;//状态取反
GPIO_OUTPUT_SET(GPIO_ID_PIN(13), RelayStatus);//开或关(高电平触发)
//按键同步状态到客户端
if(RelayStatus)
{
//状态发布
}else{
//状态发布
}
}
//开启GPIO中断
ETS_GPIO_INTR_ENABLE();
}
//初始化中断
void ICACHE_FLASH_ATTR
Touch_INTR_init(){
ETS_GPIO_INTR_DISABLE();//全局关闭GPIO中断
ETS_GPIO_INTR_ATTACH(&GPIO_INTR_Handler, NULL );//设置中断函数
gpio_pin_intr_state_set(GPIO_ID_PIN(TOUCH_PIN1),1); //上升沿触发中断 按键14,gpio.h;;;DISABLE\POSEDGE\NEGEDGE\LOLEVEL\HILEVEL
GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, BIT(TOUCH_PIN1)); //remove the GPIO interrupt mark of this pin
ETS_GPIO_INTR_ENABLE();//启用中断
}
在 user_init()里初始化即可
Touch_INTR_init();//把稳修正GPIO的针脚及部分变量的定义。
手动触发和远程触发可以状态互动(展现出来)
手机端远程掌握
触摸按键