PAGE1
PAGE1
定时器和中断
定时器
定时器概述
定时器是嵌入式系统中非常重要的组件之一,用于实现精确的时间控制和周期性任务。在ArduinoDue中,定时器基于ARMCortex-M3内核的定时器功能,提供了多种定时器类型,包括系统定时器、通用定时器和高级定时器。这些定时器可以用于各种应用场景,如延时、定时触发事件、甚至实现实时操作系统中的任务调度。
系统定时器
系统定时器是ARMCortex-M3内核自带的定时器,主要用于系统级别的任务。在ArduinoDue中,系统定时器通常用于实现millis()和micros()函数,这些函数可以获取自程序启动以来经过的毫秒和微秒数。
使用系统定时器
系统定时器的使用相对简单,ArduinoDue的库已经封装了相关的函数,可以直接调用。以下是一个简单的示例,展示如何使用millis()函数实现一个延时功能:
//定义一个变量来存储上次执行的时间
unsignedlongpreviousMillis=0;
constlonginterval=1000;//设置延时时间,单位为毫秒
voidsetup(){
//初始化串口通信
Serial.begin(9600);
//初始化数字引脚
pinMode(LED_BUILTIN,OUTPUT);
}
voidloop(){
//获取当前时间
unsignedlongcurrentMillis=millis();
//检查是否超过了设定的时间间隔
if(currentMillis-previousMillis=interval){
//保存当前时间作为下次比较的基准
previousMillis=currentMillis;
//切换LED状态
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
//打印当前时间
Serial.println(currentMillis);
}
}
通用定时器
通用定时器(GeneralPurposeTimers)是SAM3X8E芯片提供的多个定时器之一,用于用户级别的定时任务。ArduinoDue提供了多个通用定时器,可以通过编写底层代码来实现更复杂的定时功能。
配置通用定时器
配置通用定时器需要以下几个步骤:
选择定时器。
配置定时器的时钟源。
设置定时器的分频系数。
配置定时器的中断。
启动定时器。
以下是一个示例,展示如何配置和使用通用定时器:
#includeArduino.h
//定义定时器编号
#defineTMR1
//定义定时器中断处理函数
voidTmrHandler(){
//清除定时器中断标志
TC_GetStatus(TC1,TMR);
//切换LED状态
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
}
voidsetup(){
//初始化串口通信
Serial.begin(9600);
//初始化数字引脚
pinMode(LED_BUILTIN,OUTPUT);
//选择定时器
TCChannel*tc=TC1-TC_CHANNEL[TMR];
//配置定时器时钟源
pmc_set_writeprotect(false);
pmc_enable_periph_clk(19+TMR);//19+TMR是定时器的时钟源编号
tc-TC_CMR=TC_CMR_WAVE|TC_CMR_WAVSEL_UP_RC|TC_CMR_TCCLKS_TIMER_CLOCK1;//选择时钟源,设置为波形模式,上升沿触发
//设置定时器的RC值
tc-TC_RC=20000;//RC值,单位为时钟周期
//配置定时器中断
TC_SetRC(TC1,TMR,20000);
TC_Configure(TC1,TMR,TC_CMR_WAVE|TC_CMR_WAVSEL_UP_RC|TC_CMR_TCCLKS_TIMER_CLOCK1);
TC_Start(TC1,TMR);
//注册定时器中断处理函数
TC1-T