快速掌握ATEML ARM7系列文章(4) 定时器/计数器

 
      无论 什么样的应用定时器/计数器是迫切需要的,为此它也是我们快速掌握的第一个片内外设。AT91SAM7S系列产品内部有三个16位的定时器

  计数器。它们可以独立配置,但由于结构一样(具有相同的用户接寄存器)使用方法也是一样的。

    一. 计数时钟源

通过设置模式寄存器TC_CMR可选择定时器/计数器的计数时钟源:

类型 数据手册中符号 频率
内部 TIMER_CLOCK1 MCK/2
TIMER_CLOCK2 MCK/8
TIMER_CLOCK3 MCK/32
TIMER_CLOCK4 MCK/128
TIMER_CLOCK5 MCK/1024
外部
(I/O复用引脚输入)
XC0 TCLK0引脚输入
XC1 TCLK1引脚输入
XC2 TCLK2引脚输入

    二.I/O复用

    1.外部时钟源输入I/O:TCLK0,TCLK1,TCLK2

    2.测量信号输入或波形信号输出I/O:TIOA0 TIOB0 TIOA1 TIOB1 TIOA2 TIOB2

        要注意的是: 在数据手册的引脚排列列表中没有标出这些复用的I/O名称,为此要从数据手册"外设"一章的“PIO控制器A引脚复用”表格中

    找到这些复用I/O在引脚中的位置.

    三.工作模式

    捕获模式:典型应用于测量输入信号的频率,例如某一信号从TIOA0口输入,TC0在这一信号的变化处记录当前的计数值便可计算出此信号的频率

     波形模式:典型应用于输出波形,例如TC0通过TIOA0口输出PWM调节波形

      工作模式是通过设置模式寄存器TC_CMR中的WAVE位来设置选择的,而定时器计数器的模式是与通过I/O口输入输出信号的应用相关的,而某些不

     需要I/O口输入输出信号的应用中工作模式变得无关却要,例如我们想通过定时器/计数器获取一定频率的中断,在中断程序处理某定时任务,但是

     为了更灵活的产生频率,我们仍然在波形模式下工作,因为波形模式下可设计计数方式(WAVESEL).

     四.产生约一秒的中断示例

    //中断处理函数
    __ramfunc void timer0_c_irq_handler(void)
   {
      AT91PS_TC TC_pt = AT91C_BASE_TC0;
      unsigned int dummy;
      //Acknowledge interrupt status
      dummy = TC_pt->TC_SR;
      //Suppress warning variable "dummy" was set but never used
      dummy = dummy;

      //.......
      //此处添加用户代码
   }

   void TimerInit(void)
   {
      unsigned int dummy;

      //在电源管理器中打开定时器的时钟
      AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< AT91C_ID_TC0) ;

      //先在定时器内关闭时钟
      AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS ;
      AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF ;

      //状态标记清除
      dummy = AT91C_BASE_TC0->TC_SR;
      //Suppress warning variable "dummy" was set but never used
      dummy = dummy;

      //波形模式,与RC匹配后清零,时钟为MCK的1024分频
      AT91C_BASE_TC0->TC_CMR =AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO| TC_CLKS_MCK1024;

      //定时器内重新允许时钟
      AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN ;

      //TC0 中断配置
      AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,
                              AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_c_irq_handler);
      AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;//RC寄存器比较匹配中断允许
      AT91C_BASE_TC0->TC_RC=MCK/1024;//RC寄存器设置,为了产生一秒中断这里设置计数频率即可,但要注意不能大于0XFFFF
      AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC0);//中断控制中允许定时器0中断

      //软件触发开始计数
      AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG ;
   }
 

    

芯艺设计室(http://www.chipart.cn) 2009.03.21  转载请注明出处!

 

芯艺设计室    蒙ICP备06005492号

Copyright© 2004-2011 ChipArt Design House All Rights Reserved