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

📄 timer.c

📁 2410开发测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//=============================================================================
// File Name : Timer.c
// Function	: S3C2410 Watch-Dog and Timer
// Program	: Shin, On Pil (SOP)
// Date		: May 21, 2002
// Version	: 0.0
// History
//	0.0 : Programming start (February 27,2002) -> SOP
//=============================================================================

#include <string.h>
#include "2410addr.h"
#include "2410lib.h"
#include "timer.h"

void __irq Timer0Done(void);
void __irq Timer1Done(void);
void __irq Timer2Done(void);
void __irq Timer3Done(void);
void __irq Timer4Done(void);
void __irq Wdt_Int(void);

//=========================================================================
//		SMDK2410 TOUT configuration
//	GPB4=TCLK0, GPB3=TOUT3, GPB2=TOUT2, GPB1=TOUT1, GPB0=TOUT0, GPG11=TCLK1
//	GPH9=CLKOUT0
//
//Timer input clock frequency = PCLK/{prescaler value+1}/{divider value}
//{prescaler value} = 0 ~ 255	, {divider value} = 2,4,8,16
//
//	PWM Timer TOUT0/1/2/3 Test
//=========================================================================
void Test_Timer(void)
{
	int save_B,save_G,save_H,save_PB,save_PG,save_PH,save_MI;
	char key;
	
	Uart_Printf("[ TOUT 0,1,2,3 Test ]\n\n");	
//	Uart_Printf("= Current Port Setting List =\n");
//	Uart_Printf("rGPBCON = 0x%8x,	rGPGCON = 0x%8x,	rGPHCON= 0x%8x,	rMISCCR = 0x%5x\n" ,rGPBCON,rGPGCON,rGPHCON,rMISCCR);
//	Uart_Printf("rGPBUP	= 0x%8x,	rGPGUP	= 0x%8x,	rGPHUP = 0x%8x\n\n",rGPBUP , rGPGUP , rGPHUP);	

	save_B	= rGPBCON;
	save_G	= rGPGCON;
	save_H	= rGPHCON;	
	save_PB = rGPBUP;
	save_PG = rGPGUP;
	save_PH = rGPHUP;
	save_MI = rMISCCR;	
	
	rGPBUP	= rGPBUP	& ~(0x1f)	| 0x1f;		//GPB4 ~ 0
	rGPBCON = rGPBCON & ~(0x3ff)	| 0x2aa;		//Function Setting TCLK0, TOUT3 ~ 0	
	rGPGUP	= rGPGUP	& ~(0x800)	| 0x800;		//GPG11
	rGPGCON = rGPGCON & ~(0xc00000) | 0xc00000;	//TCLK1
	rGPHUP	= rGPHUP	& ~(0x200)	| 0x200;		//GPH9
	rGPHCON = rGPHCON & ~(0x3<<18)	| (0x2<<18);	//CLKOUT0	
	rMISCCR = rMISCCR & ~(0xf0)	| 0x40;		//Select PCLK with CLKOUT0

//	Uart_Printf("= Changed Port Setting List =\n");	
//	Uart_Printf("rGPBCON = 0x%8x,	rGPGCON = 0x%8x,	rGPHCON= 0x%8x,	rMISCCR = 0x%5x\n" ,rGPBCON,rGPGCON,rGPHCON,rMISCCR);
//	Uart_Printf("rGPBUP	= 0x%8x,	rGPGUP	= 0x%8x,	rGPHUP = 0x%8x\n\n",rGPBUP , rGPGUP , rGPHUP);
	Uart_Printf("[ Select Timer Clock ]\n");
	Uart_Printf("a. PCLK		b. External TOUT[0,1,2,3]\n");
	Uart_Printf("\nSelect the function to test : ");
	key = Uart_Getch();
	Uart_Printf("%c\n\n",key);	

	rTCFG0 = rTCFG0 & ~(0xffffff) | 0x10000;				//Dead zone=1,Prescaler1=0,Prescaler0=0

	switch(key)
	{
		case 'a':
			rTCFG1 = 0x0;			//All Interrupt, MUX 4 ~ 0 : 1/2
			Uart_Printf("PCLK Check Selected\n");			
			Uart_Printf("Probing PCLK : CON15 - 26\n");
			break;
		case 'b':
			rTCFG0 = rTCFG0 & ~(0xffffff) | 0x44444;		//Dead zone=4,Prescaler1=68(0x44),Prescaler0=68(0x44)
//			Uart_Printf("rTCFG0 = 0x%6x	<= Timer configuration register0.\n",rTCFG0);			
			Uart_Printf("External TOUT[0,1,2,3] Check Selected\n");			
//			Uart_Printf("Probing TCLK 0 : U16 - 14\n");
//			Uart_Printf("Probing TCLK 1 : S4	-	1\n");
			break;
		default:
			rGPBCON = save_B; 
			rGPGCON = save_G;		
			rGPHCON = save_H;			
			rGPBUP	= save_PB;
			rGPGUP	= save_PG;
			rGPHUP	= save_PH;
			rMISCCR = save_MI;
			return;
	}
												//(1/(PCLK/(Prescaler+1)/divider) * count(Max 65535) = Timer clock (Frequency)
	rTCNTB0 = rTCNTB0 & ~(0xffff) | 2000;		//(1/(50MHz/69/2))	*	2000 =	5.5200 msec (181.159	Hz)
												//(1/(50.7MHz/69/2))*	2000 =	5.4437 msec (183.698	Hz)
												//(1/(50MHz/1/2))	*	2000 =	0.0800 msec ( 12.500 KHz)
												//(1/(50.7MHz/1/2)) *	2000 =	0.0788 msec ( 12.690 KHz)
	rTCNTB1 = rTCNTB1 & ~(0xffff) | 4000;		//(0.0000027600003) *	4000 = 11.0400 msec ( 90.579	Hz)
												//(0.0000027218935) *	4000 = 10.8875 msec ( 91.848	Hz)
												//(0.00000004)		*	4000 =	0.1600 msec (	6.250 KHz)
												//(0.0000000394477) *	4000 =	0.1577 msec (	6.337 KHz)
	rTCNTB2 = rTCNTB2 & ~(0xffff) | 5000;		//(0.0000027600003) *	5000 = 13.8000 msec ( 72.463	Hz)
												//(0.0000027218935) *	5000 = 13.6094 msec ( 73.478	Hz)
												//(0.00000004)		*	5000 =	0.2000 msec (	5.000 KHz)
												//(0.0000000394477) *	5000 =	0.1972 msec (	5.070 KHz)
	rTCNTB3 = rTCNTB2 & ~(0xffff) | 10000;		//(0.0000027600003) * 10000 = 27.6000 msec ( 36.231	Hz)
												//(0.0000027218935) * 10000 = 27.2189 msec ( 36.739	Hz)
												//(0.00000004)		* 10000 =	0.4000 msec (	2.500 KHz)
												//(0.0000000394477) * 10000 =	0.3944 msec (	2.535 KHz)
	
//	Uart_Printf("rTCNTB0 = %d	<= Timer 0 counter buffer register.\n",rTCNTB0);

	rTCMPB0 =	2000 - 1000;		//(H/L)duty 50%
	rTCMPB1 =	4000 - 2000;
	rTCMPB2 =	5000 - 2500;
	rTCMPB3 = 10000 - 5000;

//	Uart_Printf("rTCMPB0 = %d	<= Timer 0 compare buffer register.\n",rTCMPB0);
//	Uart_Printf("rTCON	= 0x%6x (Before)	<= Timer control register.\n",rTCON); 

	// [22:20] [19:16] [15:12] [11:8] [7:4] [3:0]
	//	110	1010	1010	1010	0000	1010
	rTCON	= rTCON & ~(0xffffff) | 0x6aaa0a;	//Auto reload, Inverter off, Manual update, Stop, Dead zone disable

//	Uart_Printf("rTCON	= 0x%6x (After)	<= Timer control register.(0x6aaa0a)\n",rTCON);
//	Uart_Printf("rTCON	= 0x%6x (Before)	<= Timer control register.\n",rTCON);	
	
	// [22:20] [19:16] [15:12] [11:8] [7:4] [3:0]
	//	101	1001	1001	1001	0000	1001
	rTCON	= rTCON & ~(0xffffff) | 0x599909;	//Auto reload, Inverter off, No operation, Start, Dead zone disable

//	Uart_Printf("rTCON	= 0x%6x (After)	<= Timer control register.(0x599909)\n\n",rTCON);
	
	Uart_Printf("Probing TOUT 0 : J10 -	2\n");
	Uart_Printf("Probing TOUT 1 : U20 -	1\n");
	Uart_Printf("Probing TOUT 2 : U16 - 13\n");
	Uart_Printf("Probing TOUT 3 : U16 - 15\n");	
	
	if(key=='a' && PCLK==50000000)				//Oscilloscope Measurement OK, May 21, 2002 SOP
	{
		Uart_Printf("PCLK 50MHz, Timer TOUT 0 : 0.08 msec (12.50 KHz)\n");
		Uart_Printf("PCLK 50MHz, Timer TOUT 1 : 0.16 msec ( 6.25 KHz)\n");
		Uart_Printf("PCLK 50MHz, Timer TOUT 2 : 0.20 msec ( 5.00 KHz)\n");
		Uart_Printf("PCLK 50MHz, Timer TOUT 3 : 0.40 msec ( 2.50 KHz)\n");						
	}	

	else if(key=='a' && (PCLK==(202800000/4)))	//Oscilloscope Measurement OK, May 21, 2002 SOP
	{
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 0 : 0.0788 msec ( 12.690 KHz)\n");
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 1 : 0.1577 msec (	6.337 KHz)\n");
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 2 : 0.1972 msec (	5.070 KHz)\n");
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 3 : 0.3944 msec (	2.535 KHz)\n");		
	}	
		
	else if(key=='b' && PCLK==50000000)		//Oscilloscope Measurement OK, May 21, 2002 SOP
	{
		Uart_Printf("PCLK 50MHz, Timer TOUT 0 :	5.5200 msec (181.159 Hz)\n");
		Uart_Printf("PCLK 50MHz, Timer TOUT 1 : 11.0400 msec ( 90.579 Hz)\n");
		Uart_Printf("PCLK 50MHz, Timer TOUT 2 : 13.8000 msec ( 72.463 Hz)\n");
		Uart_Printf("PCLK 50MHz, Timer TOUT 3 : 27.6000 msec ( 36.231 Hz)\n");						
	}
	
	else if(key=='b' && (PCLK==(202800000/4)))	//Oscilloscope Measurement OK, May 21, 2002 SOP
	{
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 0 :	5.4437 msec (183.698 Hz)\n");
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 1 : 10.8875 msec ( 91.848 Hz)\n");
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 2 : 13.6094 msec ( 73.478 Hz)\n");
		Uart_Printf("PCLK 50.7MHz, Timer TOUT 3 : 27.2189 msec ( 36.739 Hz)\n");						
	}	
	
	Uart_Printf("\nCheck PWM (Pulse Width Modulation) Output\n");
	Uart_Printf("Press any key to exit.\n");
	Uart_Getch();	
						//Stop timer
	rTCON	= 0x0;		//One-shot, Inverter off, No operation, Dead zone disable, Stop

//	Uart_Printf("rTCON	= 0x%6x	<= Timer control register.(0x0)\n",rTCON);

	rGPBCON = save_B; 
	rGPGCON = save_G;		
	rGPHCON = save_H;	
	rGPBUP	= save_PB;
	rGPGUP	= save_PG;
	rGPHUP	= save_PH;
	rMISCCR = save_MI;
}


//========================================================
// Timer Interrupt 0/1/2/3/4 test
//========================================================
volatile int variable0,variable1,variable2,variable3,variable4;
void Test_TimerInt(void)
{
	variable0 = 0;variable1 = 0;variable2 = 0;variable3 = 0;variable4 = 0;

//	Uart_Printf("rINTMSK (Before) = 0x%8x\n",rINTMSK);
	rINTMSK = ~(BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0);
//	Uart_Printf("rINTMSK (After)	= 0x%8x	<= Timer4,3,2,1 Bit[14:10]\n",rINTMSK);

	pISR_TIMER0 = (int)Timer0Done;
	pISR_TIMER1 = (int)Timer1Done;
	pISR_TIMER2 = (int)Timer2Done;
	pISR_TIMER3 = (int)Timer3Done;
	pISR_TIMER4 = (int)Timer4Done;

	Uart_Printf("\n[ Timer 0,1,2,3,4 Interrupt Test ]\n\n");

	rTCFG0 = rTCFG0 & ~(0xffffff) | 0x000f0f;		//Dead zone=0,Prescaler1=15(0x0f),Prescaler0=15(0x0f)

⌨️ 快捷键说明

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