基本信息
文件名称:Arduino 系列:Arduino Due 系列 (基于 ATSAM3X8E)_(8).定时器和中断.docx
文件大小:25.56 KB
总页数:27 页
更新时间:2025-06-17
总字数:约1.28万字
文档摘要

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