BPI-BIT外部中断实验

前言

1.什么是中断?

试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情——吃饭。打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人。关上门,你马不停蹄的又投入了于食物的作战中。
我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律——吃饭,就是你的主程序,而敲门声,就是一个中断信号,它让你不得不去执行你的人生插曲——开门接客这个中断函数。完成这个小插曲后,你又要投入到主线剧情 吃饭这个主程序上。

结合单片机来说,外部中断是单片机实时地处理外部事件的一种内部机制。当外部事件发生后,单片机判断外部事件是否符合条件,如果符合外部中断条件,则停止CPU正在执行的程序,转而进行中断事件的处理;中断处理完毕后,又返回被中断的程序处,继续执行。

实验目的

使用外部中断的方法通过按键来控制LED的亮灭和无源蜂鸣器的发声。

软硬件

软件: vscode + platformIO

硬件: BPI-BIT开发板

函数解析

  • attachInterrupt(interrupt, function, mode)

    此函数主要建立外部中断

参数 功能
interrupt 中断通道(外部事件对应的引脚)
function 中断函数(处理外部事件的函数)
mode 触发方式
  • arduino上有以下几张触发放方式
定义名 触发方式
LOW 低电平触发
CHANGE 电平变化(高电平变低电平、低电平变高电平)
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发

代码示例

#include "Arduino.h"
bool State = true;
const int led = 18;
const int button = 35;
const int buzzer = 25;
//我们将使用通道0和8位分辨率作为占空比。对于频率,我们将仅设置2000 Hz以进行初始设置。
int freq = 2000;
int channel = 0;
int resolution = 8;

// 中断函数
void warning()
{
  State = !State;
}

void setup()
{
  // 初始化外部中断、pin
  // 当按键按下时,引脚 35 输入的电平由高变低,触发中断函数warning
  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
  //使用ledcSetup功能设置PWM,该功能接收PWM通道,频率和占空  比分辨率作为输入。
  ledcSetup(channel, freq, resolution);
  ledcAttachPin(buzzer, channel);
  
  attachInterrupt(button, warning, FALLING);    // 设置外部中断(下降沿触发)
}

void loop()
{
  if (State)
  {
    digitalWrite(led, HIGH);//小灯亮
    ledcWrite(channel,0);//蜂鸣器不发声
  }
  else
  {
    ledcWrite(channel,100);//蜂鸣器发声
    digitalWrite(led, LOW);//小灯灭
  }
}

结论

利用外部中断,可以在很多地方提高你程序的运行效率。