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++; }