⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c.bak

📁 这是三星公司的arm7 s3c44b0x芯片的所有外设中断程序
💻 BAK
字号:
//44BTEST : timer.c
#include <string.h>
#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;
}
volatile int isWdtInt;
/****************************************
* Watch-dog timer test *
****************************************/
void Test_WDTimer(void)
{
	Uart_Printf("[WatchDog Timer Test]\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/66/128, interrupt enable
	rWTDAT=8448/4;
	rWTCNT=8448/4;
	rWTCON=rWTCON|(1<<5); // 1/40/128,interrupt
	while(isWdtInt!=10);
	rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1); // 1/66/128, reset enable
	Uart_Printf("\nI will restart after 2 sec!!!\n");
	rWTCNT=8448*2;
	rWTCON=rWTCON|(1<<5); // 1/40/128,interrupt
	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;
	rINTMSK=~(BIT_GLOBAL|BIT_TIMER0|BIT_TIMER1|BIT_TIMER2|BIT_TIMER3|BIT_TIMER4|BIT_TIMER5);
	pISR_TIMER0=(int)Timer0Done;
	pISR_TIMER1=(int)Timer1Done;
	pISR_TIMER2=(int)Timer2Done;
	pISR_TIMER3=(int)Timer3Done;
	pISR_TIMER4=(int)Timer4Done;
	pISR_TIMER5=(int)Timer5Done;
	Uart_Printf("[Timer0/1/2/3/4/5 Interrupt Test]\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/(66MHz/15/32))*0xffff=0.48s
	rTCNTB1=0xffff; //(1/(66MHz/15/16))*0xffff=0.24s
	rTCNTB2=0xffff; //(1/(66MHz/15/8 ))*0xffff=0.12s
	rTCNTB3=0xffff; //(1/(66MHz/15/4 ))*0xffff=0.06s
	rTCNTB4=0xffff; //(1/(66MHz/15/2 ))*0xffff=0.03s
	rTCNTB5=0xffff; //(1/(66MHz/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
	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)
	// if(variable5==8 && variable4==16 && variable3==8 && variable2==4 && variable1==2 && variable0==1)
	Uart_Printf("Timer0/1/2/3/4/5 interrupt Test --> 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",
		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(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++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -