arduino 中断 和millis语句
Arduino中支持如下几种中断: RESET中断、外部中断、定时器中断。
对于单片机来说,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);此时CUP暂停当前工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来是实践A被中断的地方继续处理事件A(中断返回),这一过程即称之为中断
① RESET中断:就是当RESET管脚接低电平,则中止当前程序,重启CPU
② 定时器中断:是指设定CPU内部定时器后,当到达指定时间,将产生中断请求。常用于定时。
③ 外部中断:就是当CPU的外部中断管脚电平变动时,将产生中断请求。 常用于键盘输入、串口通信等。
①中断设置函数:MsTimer2::set(unsigned long ms, void (*f)());
此函数用于设定定时每ms毫秒进入中断函数f一次,其中f为我们前面设定的中断服务函数。在本例中MsTimer2::set(300, flash);设定了每经过300ms进入一次中断服务函数flash中。
②中断开始函数:MsTimer2::start();
此函数执行前尽管设定了中断,但是中断依然不会进行,只有执行完此函数,定时器才会开始计时,并按照设定的时间进入中断服务中。本例中在对中断的设置结束后开始中断服务。
③中断结束函数:MsTimer2::stop();
此函数执行后,前述中断不再执行。在本例中,进入loop循环后等待10s结束后结束中断。
下面的程序可以实现通过中断控制led灯300毫秒转换一次亮灭状态的功能。当程序开始loop循环后,经过300ms程序进入flash函数,执行完输出引脚转换电平后再次进入loop循环等待下一次300ms后中断发生或等待超过10s后中断结束。在执行中断服务时,loop函数中的延时函数计时不发生变化,即:延时达到300ms时进入中断函数,中断返回的时延时从300ms开始继续进行。
/*
MsTimer2 is a small and very easy to use library to interface Timer2 with
humans. It's called MsTimer2 because it "hardcodes" a resolution of 1
millisecond on timer2
For Details see: http://www.arduino.cc/playground/Main/MsTimer2
*/
#include <MsTimer2.h>
// Switch on LED on and off each half second
#if ARDUINO >= 100
const int led_pin = LED_BUILTIN; // 1.0 built in LED pin var
#else
const int led_pin = 13; // default to pin 13
#endif
void flash()
{
static boolean output = HIGH;
digitalWrite(led_pin, output);
output = !output;
}
void setup()
{
pinMode(led_pin, OUTPUT);
MsTimer2::set(500, flash); // 500ms period
MsTimer2::start();
}
void loop()
{
}