arthur0561 发表于 2009-7-20 6:07:00
2440有5个16位的定时器,0,1,2,3有PWM功能,0有一个deadzone,用于大电流设备。0与1公用一个8位预分频器,另外的公用另一个8位预分频器。每个定时器都有一个时钟分频器,他能够产生5种不同的分频(1/2,1/4,1/8,1/16和TCLK)
寄存器 1.定时器配置寄存器TCFG0,TCFG1 TCFG0:23:16 Dead zone长度设置 15:8 Prescaler1值设定 7: 0 Prescaler0 值设定 TCFG1:23:20 选择DMA请求通道(可以选择一个定时器定时产生DMA请求) 0000 = No select (all interrupt) 0001 = Timer0 0010 = Timer1 0011 = Timer2 0100 = Timer3 0101 = Timer4 0110 = Reserved 19:16 选择对于PWM定时器4的MUX值 0000 = 1/2 0001 = 1/4 0010 = 1/8 0011 = 1/16 01xx = External TCLK1 2.TCON 定时器控制寄存器 对每一通道进行启动重载,开启关闭等功能的设定 3TCNTBn 定时器n的计数缓冲寄存器 4.TCMPBn 定时器n的计数比较缓冲寄存器(用于PWM功能) 5.TCNTOn 定时器n的当前计数值寄存器
定时器0输出PWM程序段: void Buzzer_Freq_Set( U32 freq ) { rGPBCON &= ~3; //set GPB0 as tout0, pwm output rGPBCON |= 2;
rTCFG0 &= ~0xff; rTCFG0 |= 15; //prescaler = 15+1 rTCFG1 &= ~0xf; rTCFG1 |= 2; //mux = 1/8 rTCNTB0 = (PCLK>>7)/freq;//除16*8等于右移7位(PCLK>>7)为一秒的数值 rTCMPB0 = rTCNTB0>>1; // 50%占空比 rTCON &= ~0x1f; rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0 rTCON &= ~2; //clear manual update bit } 定时器1设置为中断 void(*Timer1Callbackf)()=NULL;//定时回调函数指针 uint G_timers=0;//定时记录 static void __irq Timer1_ISR(void)//中断响应 { static uint timers=0; timers++; if((timers>G_timers)&&(Timer1Callbackf!=NULL))//到达时间则调运回调函数 { Timer1Callbackf(); timers=0; } ClearPending(BIT_TIMER1); } void IntTimer(unsigned int us,void(*Callbackf)())//初始化 { if(Callbackf!=NULL) Timer1Callbackf=Callbackf;//记录回调函数指针 G_timers=us;//记录定时时间 rTCFG0 &= ~0xff; rTCFG0 |= 15; //prescaler = 15+1 rTCFG1 &= ~(0xf<<4); rTCFG1 |= (0x2<<4); //mux = 1/8
rTCNTB1 =(PCLK>>7)/1000;//设置初始值,1us位单位 rTCON &= ~0x0f00; rTCON |= 0xb<<8; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0 rTCON &= ~0x200; //clear manual update bit ClearPending(BIT_TIMER1); pISR_TIMER1= (U32)Timer1_ISR; EnableIrq(BIT_TIMER1);
} |