收藏官网首页
查看: 1547|回复: 0

[经验分享] esp8266 GPIO中断实例

106

主题

107

帖子

7261

积分

论坛元老

Rank: 8Rank: 8

积分
7261
跳转到指定楼层
楼主
 楼主| 发表于 2023-9-21 21:26:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
    一般,我们会通过外部设备传递的信号来执行一些函数,如果使用循环监测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波形频率计算,但是由于精度不高,因此不建议用于高频率的计算。

中断触发:
  1. gpio_pin_intr_state_set(GPIO_ID_PIN(5),        GPIO_PIN_INTR_NEGEDGE);
复制代码


中断函数:
注意在函数内清除gpio的中断标志位,否则中断可能只执行一次

  1. void io5_interrupt(void){
  2.         GIZWITS_LOG("io5_interrupt");
  3.         uint32        gpio_status;
  4.         gpio_status        =        GPIO_REG_READ(GPIO_STATUS_ADDRESS);
  5.         GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,gpio_status);
  6. }
复制代码


大部分现成的传感器支持ttl电平输出,因此可以使用外置的传感器或者按键用于中断触发,并修改中断函数内的内容用于执行任务。

注册中断函数并开启中断:

  1. ETS_GPIO_INTR_ATTACH(io5_interrupt,NULL);
  2.     ETS_GPIO_INTR_ENABLE();
复制代码

我们烧录到esp8266里,使用任意一个传感器支持ttl电平输出或者按键,然后连接串口查看输出信息



可见,io5的中断触发后成功执行了相应的函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表