搞过单片机的同学都知道,一般的单片机都有中断系统和外部中断。通过看树莓派的IC手册和WiringPi-Priority, Interrupts and Threads,可以发现树莓派也是具备的,且WiringPi还给我们通过了操作外部中断的函数。这里就介绍一下外部中断怎么使用。这个也是看WiringPi的文档和例子和自己多次试验测试之后发现的,官方文档和例子并不全面,这个不全面也导致我断断续续的搞了几天才搞出来。关于外部中断可以先看看百度百科的解释。
看WiringPi的文档
在WiringPi-Priority, Interrupts and Threads中介绍的Interrupts
如下:
大致是这么几个意思:
- 树莓派的GPIO端口可以作为外部中断的输入引脚使用,支持边沿触发:
- INT_EDGE_FALLING:下降沿
- INT_EDGE_RISING:上升沿
- INT_EDGE_BOTH: 可上升沿也可以下降沿
- INT_EDGE_SETUP:保持原有的GPIO初始方式
- 2013年1月以后:反对使用
WaisForInterrupate()
函数-您应该使用下面较新的和更容易使用的wiringPiISR()
函数; - 例子可以查看isr.c
通过isr.c和isr-osc.c例子我们可以发现int wiringPiISR (int pin, int edgeType, void (*function)(void))
函数的使用和基本的外部中断编程思路,但是实际按照这个思路来编写是运行部成功的。下面是我测试好的电路和代码:
实验电路
实验代码
#include <wiringPi.h>
#include <stdio.h>
#define LED_B 0 // 蓝色LED
#define LED_G 2 // 绿色LED
#define LED_R 3 // 红色LED
// 中断引脚
#define btn_pin 1 // 按钮引脚
// 中断标志位 发生中断就置1
int flag = 0;
// 中断发生就会执行这个函数
void blank(void){
flag = 1;
}
int main (void)
{
wiringPiSetup();
pinMode(LED_R, OUTPUT);
pinMode(btn_pin, INPUT);
pullUpDnControl (btn_pin, PUD_UP); // 这个很重要,把中断引脚设置成上拉输入,
delay(100);
wiringPiISR(btn_pin,INT_EDGE_FALLING,&blank);
while(1){
if(flag == 1){
delay(20); // 延时 按键销抖
if(flag == 1){
flag = 0; // 重置标志位
// LED 闪烁
digitalWrite(LED_R,HIGH);
delay(100);
digitalWrite(LED_R,LOW);
}
}
}
return 0;
}
这里是使用的引脚是wPi编码的。
关于树莓派按键的操作可以先看看之前的博客:《(九)树莓派3B+ wiringPi库的使用–button按钮操作》,这里也介绍了为什么要按键销抖。