📄 timer.c
字号:
/****************************************************************
* ARMSYS S3C44B0X PWM Timer TEST *
****************************************************************
1.2005.4.27:: PWM Timer TEST
***************************************************************/
#include <string.h>
#include "..\target\44b.h"
#include "..\target\44blib.h"
#include "..\target\def.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)
{
U32 save_E,save_PE;
save_E=rPCONE;
save_PE=rPUPE;
rPCONE=0xaaa8; //Tout0/1/2/3/4 Rx0, Tx0
rPUPE |=0xf8; //Tout0/1/2/3/4 The full up is disabled
//Uart_Printf("[定时器0/1/2/3/4/5测试...] ");
Uart_Printf("[PWM输出测试...]\n");
Uart_Printf("MCLK=%dHz TIMER CLK=%dHz\n",MCLK,MCLK/3200);
Uart_Printf("TCNTBn=1000(PWM频率=%dHz)\n",MCLK/3200000);
Uart_Printf("按任意键,退出PWM测试模式!!!\n");
// T0/1/2/3/4
rTCFG0=0x1c8c8c8; // Prescaler0/1/2=200, Deadzone=1
rTCFG1=0x33333; //rTCFG1=0x0; // Interrupt, Devider=1/16
// Timer clock = (MCLK/200)/16
rTCNTB0=1000;
rTCNTB1=1000;
rTCNTB2=1000; // Total cont=1000
rTCNTB3=1000;
rTCNTB4=1000;
rTCMPB0=1000-300;
rTCMPB1=1000-400;
rTCMPB2=1000-500; // L_count:700, H_count:300
rTCMPB3=1000-600;
rTCMPB4=1000-700;
rTCON=0xaaaa0a; //auto reload, inverter off, manual update, dead zone off
rTCON=0x999909; //start PWM operation
Uart_Getch();
rTCON=0x111101; //Stop timer
rPCONE=save_E;
rPUPE=save_PE;
}
volatile int isWdtInt;
/****************************************
* Watch-dog timer test *
****************************************/
void Test_WDTimer(void)
{
Uart_Printf("[看门狗定时器测试...]\n");
rINTMSK=~(BIT_GLOBAL|BIT_WDT);
pISR_WDT=(unsigned)Wdt_Int;
isWdtInt=0;
rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1<<2); // t_watchdog = 1/63/128, interrupt enable
rWTDAT=8448/4;
rWTCNT=8448/4;
rWTCON=rWTCON|(1<<5); // 1/64/128,interrupt,enable watchdog timer
while(isWdtInt!=10);
rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1); // 1/64/128, reset enable
Uart_Printf("\n系统将在2秒后复位!!!\n");
rWTCNT=8448*2;
rWTCON=rWTCON|(1<<5); // 1/64/128,enable watchdog timer
while(1);
rINTMSK=BIT_GLOBAL;
}
void __irq Wdt_Int(void)
{
rI_ISPC=BIT_WDT;
Uart_Printf("%d ",++isWdtInt);
}
volatile int variable0,variable1,variable2,variable3,variable4,variable5;
/****************************************
* PWM Timer Interrupt0/1/2/3/4/5 test *
****************************************/
void Test_TimerInt(void)
{
variable0=0;variable1=0;variable2=0;variable3=0;variable4=0;variable5=0;
pISR_TIMER0=(int)Timer0Done;
pISR_TIMER1=(int)Timer1Done;
pISR_TIMER2=(int)Timer2Done;
pISR_TIMER3=(int)Timer3Done;
pISR_TIMER4=(int)Timer4Done;
pISR_TIMER5=(int)Timer5Done;
rTCON=0x0; //all_stop
//Uart_Printf("[定时器0/1/2/3/4/5测试...] ");
Uart_Printf("[定时器0/1/2/3/4/5 中断测试...]\n");
rTCFG0=0xf0f0f; //dead zone=0,pre2=0xf,pre1=0xf,pre0=0xf
//rTCFG1=0x401234; //all interrupt,mux5=EXTCLK,mux2=1/2,mux3=1/4,mux2=1/8,mux1=1/16,mux0=1/32
rTCFG1=0x01234; //all interrupt,mux5=1/2,mux2=1/2,mux3=1/4,mux2=1/8,mux1=1/16,mux0=1/32
rTCNTB0=0xffff; //(1/(64MHz/15/32))*0xffff=0.48s
rTCNTB1=0xffff; //(1/(64MHz/15/16))*0xffff=0.24s
rTCNTB2=0xffff; //(1/(64MHz/15/8 ))*0xffff=0.12s
rTCNTB3=0xffff; //(1/(64MHz/15/4 ))*0xffff=0.06s
rTCNTB4=0xffff; //(1/(64MHz/15/2 ))*0xffff=0.03s
rTCNTB5=0xffff; //(1/(64MHz/15/2 ))*0xffff=0.03s
//rTCNTB5=0xffff; //(1/(1MHz)*0xffff=0.06s, EXTCLK
rTCON=0x2222202; //update T5/T4/T3/T2/T1/T0
rTCON=0x1111101; //T5/T4/T3/T2/T1=auto reload,T0=one shot,all_start
rINTMSK=~(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
while(variable0==0);
Delay(1);
rTCON=0x0;
variable0=0;variable1=0;variable2=0;variable3=0;variable4=0;variable5=0;
rTCFG0=0xf0f0f; //dead zone=0,pre2=0xf,pre1=0xf,pre0=0xf
rTCFG1=0x01234; //all interrupt,mux5=1/2,mux2=1/2,mux3=1/4,mux2=1/8,mux1=1/16,mux0=1/32
rTCNTB0=0xffff; //(1/(64MHz/15/32))*0xffff=0.48s
rTCNTB1=0xffff; //(1/(64MHz/15/16))*0xffff=0.24s
rTCNTB2=0xffff; //(1/(64MHz/15/8 ))*0xffff=0.12s
rTCNTB3=0xffff; //(1/(64MHz/15/4 ))*0xffff=0.06s
rTCNTB4=0xffff; //(1/(64MHz/15/2 ))*0xffff=0.03s
rTCNTB5=0xffff; //(1/(64MHz/15/2 ))*0xffff=0.03s
//rTCNTB5=0xffff; //(1/(1MHz)*0xffff=0.06s, EXTCLK
rTCON=0x2222202; //update T5/T4/T3/T2/T1/T0
rTCON=0x5999901; //T5/T4/T3/T2/T1=auto reload,T0=one shot,all_start
rINTMSK=~(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
while(variable0==0);
Delay(1); //To compensate timer error(<1 tick period)
rTCON=0x0; //all_stop
if(variable5==16 && variable4==16 && variable3==8 && variable2==4 && variable1==2 && variable0==1)
Uart_Printf("定时器0/1/2/3/4/5 中断测试 --> 通过!!!\n");
else
Uart_Printf("定时器0/1/2/3/4/5 中断测试 --> 失败!!!\n");
Uart_Printf("定时器0/1/2/3/4/5 默认中断次数分别为:1,2,4,8,16,16\n");
Uart_Printf("定时器0/1/2/3/4/5 测试中断次数分别为:%d,%d,%d,%d,%d,%d\n",variable0,
variable1,variable2,variable3,variable4,variable5);
//Uart_Printf("Timer0-%d(1),Timer1-%d(2),Timer2-%d(4),Timer3-%d(8),Timer4-%d(16),Timer5-%d(16)\n",
// variable0,variable1,variable2,variable3,variable4,variable5);
rINTMSK=BIT_GLOBAL;
Test_Timer();
}
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++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -