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

搞过单片机的同学都知道,一般的单片机都有中断系统和外部中断。通过看树莓派的IC手册和WiringPi-Priority, Interrupts and Threads,可以发现树莓派也是具备的,且WiringPi还给我们通过了操作外部中断的函数。这里就介绍一下外部中断怎么使用。这个也是看WiringPi的文档和例子和自己多次试验测试之后发现的,官方文档和例子并不全面,这个不全面也导致我断断续续的搞了几天才搞出来。关于外部中断可以先看看百度百科的解释。

看WiringPi的文档

WiringPi-Priority, Interrupts and Threads中介绍的Interrupts如下:
在这里插入图片描述
在这里插入图片描述
大致是这么几个意思:

  1. 树莓派的GPIO端口可以作为外部中断的输入引脚使用,支持边沿触发:
  • INT_EDGE_FALLING:下降沿
  • INT_EDGE_RISING:上升沿
  • INT_EDGE_BOTH: 可上升沿也可以下降沿
  • INT_EDGE_SETUP:保持原有的GPIO初始方式
  1. 2013年1月以后:反对使用WaisForInterrupate()函数-您应该使用下面较新的和更容易使用的wiringPiISR()函数;
  2. 例子可以查看isr.c
    通过isr.cisr-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按钮操作》,这里也介绍了为什么要按键销抖。

实验效果

在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页