定时器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"); }
只要留心耐得住烦躁,这些寄存器的配置都不会出错;只不过是人与人之间学习快慢的问题。 |
附件: | ||||
| ||||
|
联系客服