|
一般,我们会通过外部设备传递的信号来执行一些函数,如果使用循环监测gpio的电平变化,会导致大量的cpu时间被浪费,这时候使用gpio中断就可以节省cpu资源,用于执行其他任务,或者降低功耗。GPIO中断是一种硬件事件处理机制,用于监测和响应与GPIO引脚相关的状态变化。当与GPIO引脚相关的事件发生时,系统会触发一个中断,通知CPU来执行特定的处理程序,以响应这个事件。
使用GPIO中断相比轮询GPIO的好处:
1.异步处理: 中断处理是异步的,它们不会占用CPU的大部分时间,而是在需要时触发。这使得CPU能够执行其他任务,而无需持续地轮询GPIO状态。
2.节省CPU资源: GPIO中断允许CPU在等待事件发生的同时执行其他任务,节省了CPU资源,使系统更加高效。
3.实时响应: GPIO中断允许系统实时地响应外部事件,对于实时性要求高的功能非常重要。
4.降低功耗: 通过避免连续的GPIO状态轮询,GPIO中断可以降低系统的功耗,因为CPU可以在事件发生前保持休眠状态。
esp8266作为一个32位的微控制器,自然支持gpio中断,相比普通的单片机,esp8266的gpio中断支持更多的触发方式。
要使用esp8266的gpio中断,基本的流程如下: 设置中断触发方式-》注册中断执行函数-》开启中断-》中断函数清除中断标志位 具体对应的函数**我们可以在sdk文档里找到。
接下来,我们编写实例代码:
首先使用gpio_pin_intr_state_set设置中断的触发方式,esp8266的gpio支持5种中断触发方式,枚举的第一个为为禁用中断,因此不算在中断触发里。然后第一种中断触发GPIO_PIN_INTR_POSEDGE为上升沿中断触发,第二种GPIO_PIN_INTR_NEGEDGE为下降沿触发,第三种GPIO_PIN_INTR_ANYEDGE为边沿触发,第四种GPIO_PIN_INTR_LOLEVEL为低电平触发,第五种GPIO_PIN_INTR_HILEVEL为高电平触发。
边沿触发可以用于计数或者pwm波形频率计算,但是由于精度不高,因此不建议用于高频率的计算。
中断触发:
- gpio_pin_intr_state_set(GPIO_ID_PIN(5), GPIO_PIN_INTR_NEGEDGE);
复制代码
中断函数:
注意在函数内清除gpio的中断标志位,否则中断可能只执行一次
- void io5_interrupt(void){
- GIZWITS_LOG("io5_interrupt");
- uint32 gpio_status;
- gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
- GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,gpio_status);
- }
复制代码
大部分现成的传感器支持ttl电平输出,因此可以使用外置的传感器或者按键用于中断触发,并修改中断函数内的内容用于执行任务。
注册中断函数并开启中断:
- ETS_GPIO_INTR_ATTACH(io5_interrupt,NULL);
- ETS_GPIO_INTR_ENABLE();
复制代码
我们烧录到esp8266里,使用任意一个传感器支持ttl电平输出或者按键,然后连接串口查看输出信息
可见,io5的中断触发后成功执行了相应的函数
|
|