开外部中断
1.思路
2.每一节点所要调用的官方指导函数
1.关中断
2.注册中断函数
ETS_GPIO_INTR_ATTACH((ets_isr_t)GPIO0_INTERRUPT, NULL);//注册GPIO中断处理函数
ets_isr_t为类型转换。GPIO0_INTERRUPT为中断函数,NULL 空值 arg代表函数的自变量
3.设置中断IO口及中断触发方式
gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_NEGEDGE);//中断口,中断出发方式
4.打开中断
ETS_GPIO_INTR_ENABLE();//打开中断
5.中断来临处理函数
/****************************************************************************
*中断处理函数
*************************************************************************/
void GPIO0_INTERRUPT(void)
{
static u8 LED;
uint32 I_GPIO_INT;//所有 IO口的中断状态
uint32 f_GPIO0_INT;//IO0的中断状态
I_GPIO_INT = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//读取所有IO口中断状态
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, I_GPIO_INT);
f_GPIO0_INT=I_GPIO_INT&(0x01<<0);GPIO0的中断位在【15:0】,为最低为,用与运算将此位数据提出,送入f_GPIO0_INT,不同的中断位,代表不同的GPIO口中断,后面用if来判断不同口所要触发的中断效果
if(f_GPIO0_INT)
{
LED=!LED;
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),LED);
}
}
3.用户程序全部
#include "ets_sys.h"
#include "osapi.h"
#include "driver/uart.h"
#include "user_interface.h"
#include "driver/eagle_soc.h"
#include "driver/gpio16.h"
/*******************************************************************************
* 毫秒延迟函数
*
*
*
****************************************************************************/
void delayms(uint32 i)
{
for(;i>0;i--)
{
os_delay_us(1000); //调用的微秒延迟函数
}
}
/****************************************************************************
*中断处理函数
*************************************************************************/
void GPIO0_INTERRUPT(void)
{
static u8 LED;
uint32 I_GPIO_INT;//所有 IO口的中断状态
uint32 f_GPIO0_INT;//IO0的中断状态
I_GPIO_INT = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//读取所有IO口中断状态
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, I_GPIO_INT);
f_GPIO0_INT=I_GPIO_INT&(0x01<<0);//获取gpio中断状态
if(f_GPIO0_INT)
{
LED=!LED;
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),LED);
}
}
/******************************************************************************
* FunctionName : user_rf_cal_sector_set
* Description : SDK just reversed 4 sectors, used for rf init data and paramters.
* We add this function to force users to set rf cal sector, since
* we don't know which sector is free in user's application.
* sector map for last several sectors : ABCCC
* A : rf cal
* B : rf init data
* C : sdk parameters
* Parameters : none
* Returns : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map) {
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 5;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_64M_MAP_1024_1024:
rf_cal_sec = 2048 - 5;
break;
case FLASH_SIZE_128M_MAP_1024_1024:
rf_cal_sec = 4096 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
//-------------------------------------------------------------------设置串口波特率
uart_init(115200,115200);//串口0,串口1
os_delay_us(1000);
os_printf("\n\r----------------------");
os_printf("\n\rHello,Wolrd"); //串口打印
os_printf("\n\rSDK version: %s \n", system_get_sdk_version());
os_printf("\r------------------------\n\r");
//------------------------------------------------------------------初始化管脚功能
//管脚功能选择(注意:参数1 【PINNAME】管脚名、参数2 【FUNC】管脚功能)
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U ,0); //将GPIO4设置为IO口
//将相应管脚设为输出模式,并输出对应电平(参数1 【gpio_no】、参数2:输出电平)
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0)); //设置GOIO0为输入模式
//PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);//设置IO0使能,禁止上拉
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//管脚上拉使能
/*******************************************************************************************
* 注意: 【PIN NAME】【FUNC】【gpio_no】不要混淆
*【PIN NAME】 管脚名称 "PERIPHS_IO_MUX" + "管脚名
*【FUNC】 管脚功能 功能序号-1
*【gpio_no】 I0端口序号 GPI0 ID PIN (IO端口序号)
*
*********************************************************************************************/
//GPIO中断设置
ETS_GPIO_INTR_DISABLE();//关闭中断
ETS_GPIO_INTR_ATTACH((ets_isr_t)GPIO0_INTERRUPT, NULL);//注册GPIO中断处理函数
gpio_pin_intr_state_set(GPIO_ID_PIN(0),GPIO_PIN_INTR_NEGEDGE);//中断口,中断出发方式
/*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, 高电平中断
*/
ETS_GPIO_INTR_ENABLE();//打开中断
while(1)
{
system_soft_wdt_feed(); //喂狗函数
// LED=!LED;
// if( GPIO_INPUT_GET(GPIO_ID_PIN(0))==0)
// {
os_printf("\n\rhello,孙韶辉");
/* GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 0);//打开LED
}
else
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);//关闭LED
}*/
}
}
4.实现效果
上电,在按下boot键,D1LED将实现开和关。