8. 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. 绑定中断回调函数
8.4. 使能/失能中断
void enable_irq () ,使能中断。
void disable_irq () ,失能中断。
8.5. 注意事项
在中断回调函数里不要写可能导致阻塞的代码:避免延时,无限 while 循环和调用阻塞函数。
不要再中断回调函数里使用
printf
,malloc
和new
:避免对一些特别庞大的库函数的调用,尤其是那些不可重入的库函数(如 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);
}
}