当前位置: 首页 > >

(十八)树莓派3B+ wiringPi库的使用--外部中断

发布时间:

搞过单片机的同学都知道,一般的单片机都有中断系统和外部中断。通过看树莓派的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
#include

#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按钮操作》,这里也介绍了为什么要按键销抖。


实验效果



友情链接: