无论 什么样的应用定时器/计数器是迫切需要的,为此它也是我们快速掌握的{dy}个片内外设。AT91SAM7S系列产品内部有三个16位的定时器
计数器。它们可以独立配置,但由于结构一样(具有相同的用户接寄存器)使用方法也是一样的。
一. 计数时钟源
通过设置模式寄存器 TC_CMR可选择定时器/计数器的计数时钟源:
二.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 ;
//状态标记xx
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 ;
}
|