定时器0寄存器的配置
TQ2440 CodeWarrior SecureCRT DNW
把自己做的每一个实验例程都共享出来,一方面跟大家共同交流提高,一方面激励自己每天学习;
用到的寄存器:
TCFG0:配置两个8位预分频器
TCFG1:5路多路选择器和DMA模式选择寄存器
TCNTB0: 定时器0计数缓冲寄存器
TCMPB0: 定时器0比较缓冲寄存器
TCON: 定时器控制寄存器
SRCPND: 源挂起寄存器
INTPND: 中断挂起寄存器
INTMSK: 中断屏蔽寄存器
2440有两个8位预分频器0,1共用一个2,3,4共用另外一个,每个定时器都有一个可以生成5种不同分频信号(1/2,1/4,1/8,1/16和
TCLK)的时钟分频器。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK。
定时器输入时钟频率由TCFG0与TCFG1决定
定时器输入时钟频率 = PCLK/(预分频值+1)/(分频值);
预分频值 = 0~255;
分频值 = 2,4,8,16
TCNTB0包含了一个当使能定时计数器的初始值。TCMPB0包含了一个与TCNTB0相比较的初始值。当递减计数器到达0时,产生定时器中断请求通知CPU定时器操作已经完成。
TCON 定时器控制寄存器 定时器0的自动重载开启或关闭,TOUT0变换极性,手动更新TCNTB0与TCMPB0的值,启动/停止定时器。
SRCPND 与 INTPND 和 INTMSK在上个实验已经讲过,这里不在过多阐述。
定时器初始化:
//定时器输入时钟频率 = PCLK/(预分频值+1)/(分频值);
//预分频值 = 0~255;
//分频值 = 2,4,8,16;
rTCFG0 = 49;
rTCFG1 &= ~(0xf<<0);
rTCFG1 |= (1<<0); //4分频:
rTCNTB0 =65536/2;
rTCMPB0 = 0;
rTCON |= (1<<1);
rTCON &= ~(0xff<<0);
rTCON |= ((1<<3)|(1<<0)); //启动定时器,自动重载
rSRCPND = BIT_TIMER0;
rINTPND = BIT_TIMER0;
rINTMSK &= ~(BIT_TIMER0); //取消相应位的屏蔽
pISR_TIMER0 = (U32)Timer_Handle;
注意:在配置TCON寄存器的时候,一定要先手动更新TCNTB0与TCMPB0的值,然后将其清0,然后才开以开启定时器与自动重载功能。
中断服务程序:
static void __irq Timer_Handle(void)
{
rSRCPND = BIT_TIMER0;
rINTPND = BIT_TIMER0;
Uart_Printf("OK");
}
只要留心耐得住烦躁,这些寄存器的配置都不会出错;只不过是人与人之间学习快慢的问题。
|