ARM7定时器模块简介及实现(C语言)

来源:互联网 发布:网络安全法二审稿 编辑:程序博客网 时间:2024/05/16 02:59

定时器/计数器(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);     

}

 


(文章原创,转载请声明)

原创粉丝点击