外部中断----高低电平触发,(边沿触发)上升沿触发和下降沿触发区别

转自:https://blog.csdn.net/as480133937/article/details/97396383

外部中断可以分为电平触发和边缘触发两种,那么这两种中断有什么区别,我们今天讲解下

1什么是中断

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。

通俗点说:你正在家里做家务,突然有人来找你,打断了你的进程,在你们交谈完之后,你就又回去继续进行你的家务活,这其中被打断的过程,就叫做中断,而在中断结束之后,你则会继续进行本来应该做的事情。

高低电平触发:

低电平触发:
低电平触发中断顾名思义,就是检测到引脚为低电平就触发,从而进入中断函数中处理这个中断,并且在高或低电平保持的时间内持续触发,假设是低电平触发,只要引脚为低电平时间内中断一直有效,那么就会一直进入中断,直到电平变化为高电平。

高电平触发:
则是检测为高电平就触发,其余与低电平触发相同。

注意事项:

  • 1.电平触发中断,如果在电平没有恢复之前就退出中断程序,那么会在退出后又再次进入中断。只要不退出是不会重复触发的。也就是重复触发只有在退出中断后才会再次触发,不用担心这次还没进行完,中断已经重新触发的情况。
  • 2.低电平触发是即时的,当外部中断信号撤消时,中断申请信号随之消失。如果在外部中断信号申请期间,CPU来不及响应此中断,那么有可能这次中断申请就漏掉了。也就是说假设低/高电平的时间很短。CPU没来得及相应,那么这次的电平中断申请就可能不会检测到。
  • 3.如果想要电平触发中断也只进行一次,通常的做法是在中断退出前关闭中断,等后面需要的时候再打开。

边沿触发:
这里要先了解下:

从低电平到高电平, 叫做上升
从高电平到低电平, 叫做下降

·上升沿触发
数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间叫作上升沿。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。

·下降沿触发
数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。 [1] 下降沿触发是当信号有下降沿时的开关动作,当电位由高变低而触发输出变化的就叫下降沿触发。也就是当测到的信号电位是从高到低也就是下降时就触发,叫做下降沿触发。

那么我们可以很好的理解两种触发:

  • 上升沿触发 就是当电压从低变高时触发中断
  • 下降沿触发 就是当电压从高变低时触发中断

当然,上升沿与下降沿检测的是电平变化的一瞬间,就会产生中断,这个时间是us级别的,但是如果中断引脚检测到一直保持低/高电平,则无法产生下次中断,也就是中断只会触发一次,只有在下次电平发生变化时才会重新触发中断

注意事项:

1 边沿触发就是单片机在上一次机器周期内,检测到中断引脚口为高电平,这一次机器周期内检测到为低电平,则会申请产生中断,所以为us级别

2 下降沿触发是锁存中断信号的,由D触发器记忆,意即:即使当时CPU来不及响应中断,外部中断信号撤消后,由于D触发器的记忆作用,消失的中断信号仍然有效,直到中断被响应并进入中断ISR,记忆的中断信号才会由硬件清除。 这也是为什么边沿触发只能触发一次的原因

3.对于单片机的中断引脚,如果你另一端接的是VCC 则需要设置成上升沿或者高电平触发 如果你接的是GND 就可以设置成下降沿或者低电平触发

区别:
我们可以理解,电平触发在你一直按着按键的时候会一直进入中断,边沿触发则是只会触发一次,再次按下才会重新触发,这就给我们不同的应用功能提供了选择,使得我们可以在不同个工作下选择适合的模式,边沿触发适用于对对时间要求高的,比如中断中有计数之类的(GATE门控位置1时),而电平触发则适合报警装置。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在ESP32的GPIO中,可以设置GPIO的中断类型为上升沿下降沿、上升下降沿、低电平或者电平触发。当设置为上升下降沿中断时,中断处理函数中可以通过读取GPIO的状态来判断是上升沿还是下降沿触发中断。 具体地,我们可以在中断处理函数中通过读取GPIO的状态来判断是上升沿还是下降沿触发中断。例如,在中断处理函数中可以使用 `gpio_get_level()` 函数读取GPIO的电平状态,如果电平状态为1,则说明是上升沿触发中断;如果电平状态为0,则说明是下降沿触发中断。 下面是一个示例代码,可以同时设置上升下降沿中断,并判断是上升沿还是下降沿触发中断: ```c void IRAM_ATTR gpio_isr_handler(void* arg) { uint32_t gpio_num = (uint32_t) arg; uint32_t gpio_level = gpio_get_level(gpio_num); if (gpio_level == 0) { printf("GPIO %d: Falling edge detected\n", gpio_num); } else { printf("GPIO %d: Rising edge detected\n", gpio_num); } } void app_main() { gpio_config_t io_conf; io_conf.intr_type = GPIO_PIN_INTR_ANYEDGE; // 上升下降沿中断 io_conf.pin_bit_mask = (1ULL<<GPIO_NUM_0) | (1ULL<<GPIO_NUM_2); // GPIO0和GPIO2 io_conf.mode = GPIO_MODE_INPUT; io_conf.pull_up_en = GPIO_PULLUP_ENABLE; gpio_config(&io_conf); gpio_install_isr_service(0); gpio_isr_handler_add(GPIO_NUM_0, gpio_isr_handler, (void*) GPIO_NUM_0); gpio_isr_handler_add(GPIO_NUM_2, gpio_isr_handler, (void*) GPIO_NUM_2); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值