www.pudn.com > ShfuCOS.rar > Timer.c


#include  
#include "..\inc\44b.h" 
#include "..\inc\44blib.h" 
#include "..\inc\timer.h" 
 
void __irq Timer0Done(void); 
void __irq Timer1Done(void); 
void __irq Timer2Done(void); 
void __irq Timer3Done(void); 
void __irq Timer4Done(void); 
void __irq Timer5Done(void); 
void __irq Wdt_Int(void); 
 
/**************************************** 
 *  PWM Timer TOUT0/1/2/3/4 test	* 
 ****************************************/ 
void Test_Timer(void) 
{ 
    int save_E,save_PE; 
    save_E=rPCONE; 
    save_PE=rPUPE; 
    rPCONE=0xaaa8;	//Tout0/1/2/3/4, RxD0, TxD0 
    rPUPE |=0xf8; 
 
    Uart_Printf("[Timer 0,1,2,3,4,5 Test]\n"); 
    Uart_Printf("Check PWM Output\n"); 
    Uart_Printf("MCLK=%dHz TIMER CLK=%dHz\n",MCLK,MCLK/4); 
    Uart_Printf("TCNTBn=1000(PWM frequency=%dHz)\n",MCLK/4000); 
    Uart_Printf("To exit PWM test mode, Press any key!!!\n"); 
 
			// T0/1/2/3/4 
    rTCFG0=0x1010101;	// Prescaler0/1/2=1, Deadzone=1 
    rTCFG1=0x0;		// Interrupt, Devider=1/2 
			// Timer clock = (MCLK/1)/2 
 
    rTCNTB0=1000; 
    rTCNTB1=1000; 
    rTCNTB2=1000;	// Total cont=1000  
    rTCNTB3=1000; 
    rTCNTB4=1000; 
 
    rTCMPB0=1000-700; 
    rTCMPB1=1000-700; 
    rTCMPB2=1000-700;	// L_count:700, H_count:300 
    rTCMPB3=1000-700; 
    rTCMPB4=1000-700; 
 
    rTCON=0xaaaa0a;	//auto reload, inverter off, manual update, dead zone off 
    rTCON=0x999909;	//start PWM operation 
 
    Uart_Getch();    
 
    rTCON=0x0;		//Stop timer 
     
    rPCONE=save_E; 
    rPUPE=save_PE; 
} 
 
 
/**************************************************************************** 
【功能说明】定时器初始化,让PE7、6、5、4输出PWM信号 
****************************************************************************/ 
void Timer_PWM_Led(void) 
{ 
	rPCONE = 0xaa6b;		 
	//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1、0 RXD0 TXD0 FOUT 
	rPUPE |= 0xf0;		//TOUT4、3、2、1、0设置成不上拉,其他引脚上拉 
 
	rTCFG0 = 0x23f3f3f;		//死区长度为2;    Prescaler0/1/2=3f,3f,3f 
	//定时器输入时钟频率计算公式 = MCLK/{prescaler+1}/{divider value} 
	rTCFG1 = 0x222222;		// Interrupt; Devider value = 1/8 
	//定时器时钟 = (MCLK/prescaler+1)/8 
 
	rTCNTB1 = 24000;		//决定TOUT 1引脚PWM输出信号的频率 
	rTCNTB2 = 37000;		//决定TOUT 2引脚PWM输出信号的频率 
	rTCNTB3 = 50000;		//决定TOUT 3引脚PWM输出信号的频率 
	rTCNTB4 = 64000;		//决定TOUT 4引脚PWM输出信号的频率 
 
	rTCMPB1 = 12000;		//决定TOUT 1引脚PWM输出高电平的信号宽度(rTCMPB1 OK\n"); 
    else 
	Uart_Printf("Timer0/1/2/3/4/5 interrupt Test --> Fail\n"); 
    Uart_Printf("Timer0-%d(1),Timer1-%d(2),Timer2-%d(4),Timer3-%d(8),Timer4-%d(16),Timer5-%d(16)\n", 
//    Uart_Printf("Timer0-%d(1),Timer1-%d(2),Timer2-%d(4),Timer3-%d(8),Timer4-%d(16),Timer5-%d(8)\n", 
	variable0,variable1,variable2,variable3,variable4,variable5); 
 
    rINTMSK=BIT_GLOBAL;    
} 
 
 
void __irq Timer0Done(void) 
{ 
    rI_ISPC=BIT_TIMER0; 
    variable0++;     
} 
 
void __irq Timer1Done(void) 
{ 
    rI_ISPC=BIT_TIMER1; 
    variable1++;     
} 
 
void __irq Timer2Done(void) 
{ 
    rI_ISPC=BIT_TIMER2; 
    variable2++;     
} 
 
void __irq Timer3Done(void) 
{ 
    rI_ISPC=BIT_TIMER3; 
    variable3++;     
} 
 
void __irq Timer4Done(void) 
{ 
    rI_ISPC=BIT_TIMER4; 
    variable4++;     
} 
 
void __irq Timer5Done(void) 
{ 
    rI_ISPC=BIT_TIMER5; 
    variable5++;     
}