定时器/计数器(TC)
ARM7系列芯片中定时器/计数器模块一般包括三个相同的16位定时器/计数器通道,每个通道可独立编程,通道通过驱动一个可编程内部中断信号来产生处理器中断。
工作时钟源
TC由电源管理控制器(PMC)驱动,使用定时器模块之前必须首先配置PMC模块以使能TC时钟。TC通过一条中断线与高级中断控制器(AIC)相连,若是在定时器处理模块添加中断处理程序,则处理中断之前需对AIC进行编程,然后再对TC模块进行配置。
TC的三个通道相互独立,但操作相同。每个通道有一个16位的寄存器,寄存器值在所选时钟的每个正沿处自增,当计数器的值增加为0xFFFF进而变成0x0000时,产生溢出,此时状态寄存器(TC_SR)中的COVFS位置位。
定时器/计数器的时钟选择方面,每个通道可独立选择内部或外部的时钟作为计数器时钟源。对于时钟源的选择可通过TC通道模式寄存器的TCCLKS位实现。另外,对于所选时钟信号的工作方式,可以通过TC_CMR寄存器的CLKI位来实现反转,即使用时钟负沿进行计数。当使用外部时钟作为计数器时钟源时,需要保证外部时钟电平的持续时间长于主机时钟周期。
工作模式及触发形式
TC的每个通道有两种工作模式可供选择:捕获模式及波形模式。工作模式的选择通过TC通道模式寄存器的WAVE位设定。两种工作模式下有三种较为通用的触发器,触发器的作用是复位计数器并启动计数器时钟。触发器类别如下:
一、软件触发器:每个通道均有一个软件触发器。通过设置TC_CCR中的SWTRG位使能。
二、SYNC:每个通道均有一个SYNC同步信号。当此信号使能时,该信号所触发的作用与软件触发器效果类似,通过控制TC_BCR使能所有通道的SYNC信号。
三、RC比较触发器:每个通道均执行RC,若TC_CMR中的CPCTRG置位,则当计数器的值与RC值相等时产生触发信号。
以下对两种工作模式做简单介绍:
捕获工作模式:通过清零TC_CMR(通道模式寄存器)的WAVE参数可进入此工作模式。捕获工作模式下TC通道可作为测量用。此时待测试信号的脉冲时间、频率、周期占空比等可通过TC通道进行测量。
波形工作模式:通过设置TC_CMR寄存器的WAVE参数可进入此工作模式。波形工作模式下,TC通道产生一个或两个相同频率的可独立编程占空比的PWM信号,或产生不同类型的单发射或重复脉冲。根据TC_CMR中的WAVSEL参数的不同,TC_CV产生不同的动作。如,WAVSEL=00时,TC_CV的值从0增加到0xFFFF,一旦到达0XFFFF,TC_CV值即被复位并重新增加且继续循环。外部事件或软件触发亦可复位TC_CV的值。
示例程序
通过RC比较寄存器来设置定时计数,其程序代码如下:
void init_tc0(void)
{
AT91C_BASE_PMC -> PMC_PCER = 1 << AT91C_ID_TC0; // Enable peripheral clock
AT91C_BASE_TC0 -> TC_CMR =AT91C_TC_CLKS_TIMER_DIV5_CLOCK|AT91C_TC_CPCTRG; //RC Compare trigger
AT91C_BASE_TC0-> TC_RC = 4680; //100ms
AT91F_TC_InterruptEnable(AT91C_BASE_TC0, AT91C_TC_CPCS); //RC compare lead to interrupt pTc->TC_IER = flag;
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_TC0,1\
,AT91C_AIC_SRCTYPE_POSITIVE_EDGE,(void(*)())TC_handler); //Configure and enable interrupt on RC compare
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_TC0);
AT91C_BASE_TC0-> TC_CCR = ((AT91C_TC_CLKEN)|(AT91C_TC_SWTRG)); //Start Timer
}
void TC_handler(void) __irq
{
unsigned int u32TCSR;
u32TCSR= AT91C_BASE_TC0->TC_SR; // Clearstatus bit to acknowledge interrupt Clearall status by read
u32TCSR= u32TCSR; //Suppress warning <<variable "u32TCSR" was set but neverused>>
u32TCtime++;
if(u32TCtime>= 4) //1=100ms
{
u32TCtime=0;
//此处可添加处理函数
}
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
}
(文章原创,转载请声明)