8. InterruptIn

InterruptIn 官方文档

InterruptIn 接口用于当输入引脚的电平变化时触发事件,可以选择在上升沿或下降沿触发中断。

8.1. 构造函数

  • InterruptIn (PinName pin) ,创建一个连接到特定引脚的 InterruptIn 。

  • InterruptIn (PinName pin, PinMode mode) ,创建一个连接到特定引脚的 InterruptIn ,同时指定引脚模式,上拉、下拉或浮空。

8.2. 读引脚电平

  • int read () ,返回读到的引脚电平(0或1)。

  • operator int () ,read() 操作符的简写,可以将对象隐式转化为 int 类型数据,代表引脚电平。

例如:

InterruptIn button1(SW1, PullUp);
int value = button1;		//读取 button1 关联引脚的电平

8.3. 绑定中断回调函数

  • void rise (Callback< void()> func) ,绑定上升沿回调函数,参数为 Callback<void()> 对象。

  • void fall (Callback< void()> func) ,绑定下降沿回调函数,参数为 Callback<void()> 对象。

8.4. 使能/失能中断

8.5. 注意事项

  • 在中断回调函数里不要写可能导致阻塞的代码:避免延时,无限 while 循环和调用阻塞函数。

  • 不要再中断回调函数里使用 printfmallocnew:避免对一些特别庞大的库函数的调用,尤其是那些不可重入的库函数(如 printf、malloc 和 new)。

8.6. 例程

/*
 * Copyright (c) 2017-2020 Arm Limited and affiliates.
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"

class Counter {
public:
    Counter(PinName pin) : _interrupt(pin)          // create the InterruptIn on the pin specified to Counter
    {
        _interrupt.rise(callback(this, &Counter::increment)); // attach increment function of this counter instance
    }

    void increment()
    {
        _count++;
    }

    int read()
    {
        return _count;
    }

private:
    InterruptIn _interrupt;
    volatile int _count;
};

Counter counter(SW2);

int main()
{
    while (1) {
        printf("Count so far: %d\n", counter.read());
        ThisThread::sleep_for(2000);
    }
}