Atmel_TC 定时器/计数器- 轩辕赤血的日志- 网易博客

Atmel_TC 定时器/计数器

2010-06-07 13:56:49 阅读6 评论0 字号:

    TC 定时器/计数器

TC包含三个相同的16位定时器/计数器通道,两种模式(捕获模式和波形模式)
功能:频率测量、事件计数、间隔测量、脉冲产生、延时时间及脉宽调制
各通道包含:三个外部时钟输入,五个内部时钟输入,两个多功能输入/输出信号,可配置产生中断

内部时钟源:TIMER_CLOCK1(MCK/2)、TIMER_CLOCK2(MCK/8)、TIMER_CLOCK3(MCK/32)、TIMER_CLOCK4(MCK/128)、TIMER_CLOCK5(MCK/1024)

外部时钟信号:XC0、XC1、XC2
四种触发类型:SYNC信号、软件触发器、RC比较寄存器和外部触发

定时的周期 T = (1/时钟源)*TC_RC 例如这里MCK=18.432M T =(1024/MCK)* 18432 = 1S 那么一秒钟中断一次

TC_BCR  TC块控制寄存器
[0]SYNC:同步命令  1-每个通道同事产生软件触发

TC_BMR  TC块模式寄存器
[0-1]TX0XC0S:外部时钟信号0选择  0-TCLK0  1-无  2-TIOA1  3-TIOA2
[2-3]TX1XC1S:外部时钟信号1选择  0-TCLK1  1-无  2-TIOA0  3-TIOA2
[4-5]TX2XC2S:外部时钟信号2选择  0-TCLK2  1-无  2-TIOA0  3-TIOA1

TC_CCR  TC通道控制寄存器
[0]CLKEN:计数器时钟使能命令
[1]CLKDIS:计数器时钟禁用命令
[2]SWTRG:软件触发命令  1-软触发 计数器复位 时钟启动

TC_CMR  TC通道模式寄存器(捕获模式)
[0-2]TCCLKS:时钟选择  0-TIMER_CLOCK1 ... 4-TIMER_CLOCK5   5-XC0  6-XC1  7-XC2  
[3]CLKI:时钟反转   0-上升沿计数器增加  1-下降沿
[4-5]BURST:脉冲信号选择
[6]LDBSTOP:RB载入时,计数器时钟停止
[7]LDBDIS:RB载入时,计数器时钟禁用
[8-9]ETRGEDG:外部触发边沿选择  0-无  1-上升沿 2-下降沿
[10]ABETRG:TIOA或TIOB外部触发选择  0-TIOB用作外部触发器   1-TIOA
[14]CPCTRG:RC比较触发使能  1-RC比较复位计数器并启动计数器时钟
[15]WAVE  0-捕获模式使能  1-禁用(波形模式使能)
[16-17]LDRA:RA载入选择  1-TIOA上升沿   2-下降沿  3-任意
[18-19]LDRB:RB载入选择

TC_CMR  TC通道模式寄存器(波形模式)
[0-2]TCCLKS:时钟选择  0-TIMER_CLOCK1 ... 4-TIMER_CLOCK5   5-XC0  6-XC1  7-XC2 
[3]CLKI:时钟反转   0-上升沿计数器增加  1-下降沿
[4-5]BURST:脉冲信号选择
[6]CPCSTOP:RC比较时,计数器时钟停止
[7]CPCDIS:RC比较时,计数器时钟禁用
[8-9]EEVTEDG:外部事件边沿选择  0-无  1-上升沿 2-下降沿 3-任意
[10-11]EEVT:外部事件选择  0-TIOB  1-XC0  2-XC1  3-XC2
[12]ENETRG:外部事件触发使能  1-复位计数器并启动计数器时钟
[13-14]WAVSEL:波形选择
[15]WAVE  1-波形模式使能
[16-17]ACPA:TIOA上RA比较效果   1-置位  2-清零  3-切换
[18-19]ACPC:TIOC上RC比较效果
[20-21]AEEVT:TIOA上外部事件效果
[22-23]ASWTRG:TIOA上软件触发效果
[24-25]BCPB:TIOB上RB比较效果
[26-27]BCPC:TIOB上RC比较效果
[28-29]BEEVT:TIOB上外部事件效果
[30-31]BSWTRG:TIOB上软件触发效果

TC_CV  TC计数器值寄存器
[0-15]CV:实时计数器值

TC_RA  TC寄存器A
[0-15]RA:实时寄存器A值

TC_RB  TC寄存器B
[0-15]RB:  实时寄存器B值

TC_RC  TC寄存器C
[0-15]RC:  实时寄存器C值

TC_SR  TC状态寄存器
[0]COVFS:计数器溢出状态
[1]LOVRS:载入溢出状态
[2]CPAS:RA比较状态
[3]CPBS:RB比较状态
[4]CPCS:RC比较状态
[5]LDRAS:RA载入状态
[6]LDRBS:RB载入状态
[7]ETRGS:外部触发状态
[16]CLKSTA:时钟使能状态
[17]MTIOA:TIOA镜像
[18]MTIOB:TIOB镜像

TC_IER  TC中断使能寄存器
[0]COVFS:计数器溢出
[1]LOVRS:载入溢出
[2]CPAS:RA比较
[3]CPBS:RB比较
[4]CPCS:RC比较
[5]LDRAS:RA载入
[6]LDRBS:RB载入
[7]ETRGS:外部触发
0-无效  1-中断使能

TC_IDR  TC中断禁用寄存器
[0]COVFS:计数器溢出
[1]LOVRS:载入溢出
[2]CPAS:RA比较
[3]CPBS:RB比较
[4]CPCS:RC比较
[5]LDRAS:RA载入
[6]LDRBS:RB载入
[7]ETRGS:外部触发
0-无效  1-中断禁用

TC_IMR  TC中断屏蔽寄存器
[0]COVFS:计数器溢出
[1]LOVRS:载入溢出
[2]CPAS:RA比较
[3]CPBS:RB比较
[4]CPCS:RC比较
[5]LDRAS:RA载入
[6]LDRBS:RB载入
[7]ETRGS:外部触发
0-禁用  1-使能

//============================TC调试  wang@20080612==================================
#include "../Startup/Board.h"

void Timer0ISR(void);
/*
* 初始化定时器T0
*/
void Timer0Init(void)
{

    AT91F_TC0_CfgPMC();

    *AT91C_PIOA_PDR = AT91C_PA0_TIOA0;
    *AT91C_PIOA_BSR = AT91C_PA0_TIOA0;

    AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; // Disable TC. 

    AT91C_BASE_TC0->TC_IDR =  0xFFFFFFFF;

    *AT91C_TC0_CMR =(AT91C_TC_CLKS_TIMER_DIV5_CLOCK 
                  | AT91C_TC_BURST_NONE 
                  | AT91C_TC_WAVE 
                  | AT91C_TC_WAVESEL_UP_AUTO 
                  | AT91C_TC_ACPA_SET 
                  | AT91C_TC_ACPC_CLEAR 
                  ); 

    AT91C_BASE_TC0->TC_RC = MCK/1024;//  1/(1/(MCK/1024))   1秒中断一次   定时的周期 T = (1/时钟源)*TC_RC //  T=1  时钟源=MCK/1024   1=(1/(MCK/1024))*TC_RC

    AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN; 

    AT91F_AIC_ConfigureIt (
                            AT91C_BASE_AIC,       // AIC base address
                            AT91C_ID_TC0,       // SYSTEM peripheral ID
                            AT91C_AIC_PRIOR_HIGHEST,    // Max priority
                            AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL, // Internal Sources Code Label Edge triggered
                            Timer0ISR );      

    AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS; // RC比较使能

    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC0);//使能时钟中断

    AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; // 软件触发命令  1-软触发 计数器复位 时钟启动

}
/*
* 定时器T0中断
*/
void Timer0ISR(void)
{
    int status;
    status = *AT91C_TC0_SR;

    if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & LED2) == LED2 )
    {
      AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,LED2);
    }
    else
    {
      AT91F_PIO_SetOutput(AT91C_BASE_PIOA,LED2);
    }

}


void main(void)
{
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
    AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ) ;

    Timer0Init();

    while(1)
    {
      ;
    }
}

//============================end=================================




引文来源  fly511
<#--{zx1}日志--> <#--推荐日志--> <#--引用记录--> <#--相关日志--> <#--推荐日志--> <#--推荐阅读--> <#--相关文章--> <#--历史上的今天--> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构-->
郑重声明:资讯 【Atmel_TC 定时器/计数器- 轩辕赤血的日志- 网易博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——