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

📄 timer.c

📁 s3c6410基于USB OTG下载内核至NORFLASH的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************
* 
*	Project Name : S3C6410 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6410.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : timer.c
*  
*	File Description : This file implements the API functons for Timer (PWM, WDT).
*
*	Author : Woojin.Kim
*	Dept. : AP Development Team
*	Created Date : 2006/12/27
*	Version : 0.1 
* 
*	History"
*	- Created(Woojin.Kim 2006/12/27)
*     - Added DelayfrTimer(Woojin.Kim 2007/02/12)
*     - Added Start, Stoptimer (Woojin,Kim 2007/02/15)
*	- Added CalibrateDelay(Haksoo,Kim 2007/02/17)
**************************************************************************************/

#include "option.h"
#include "library.h"
#include "sfr6410.h"
#include "system.h"
#include "timer.h"
#include "intc.h"
#include "sysc.h"

//#define nPCLK (25)

enum TIMER_REG
{
	rTCFG0   = PWMTIMER_BASE+0x00,
	rTCFG1   = PWMTIMER_BASE+0x04,
	rTCON    = PWMTIMER_BASE+0x08,
	rTCNTB0  = PWMTIMER_BASE+0x0C,
	rTCMPB0  = PWMTIMER_BASE+0x10,
	rTCNTO0  = PWMTIMER_BASE+0x14,
	rTCNTB1  = PWMTIMER_BASE+0x18,
	rTCMPB1  = PWMTIMER_BASE+0x1C,
	rTCNTO1  = PWMTIMER_BASE+0x20,
	rTCNTB2  = PWMTIMER_BASE+0x24,
	rTCMPB2  = PWMTIMER_BASE+0x28,
	rTCNTO2  = PWMTIMER_BASE+0x2C,
	rTCNTB3  = PWMTIMER_BASE+0x30,
	rTCMPB3  = PWMTIMER_BASE+0x34,
	rTCNTO3  = PWMTIMER_BASE+0x38,
	rTCNTB4  = PWMTIMER_BASE+0x3C,
	rTCNTO4  = PWMTIMER_BASE+0x40,
	rTINT_CSTAT = PWMTIMER_BASE+0x44,


	rWTCON= WDT_BASE+0x00,
	rWTDAT = WDT_BASE+0x04,
	rWTCNT = WDT_BASE+0x08,
	rWTCLRINT = WDT_BASE+0x0C
	
	
};

// Interrupt Handler Global valiable
   volatile u32 g_uIntCounter0 = 0;
   volatile u32 g_uIntCounter1 = 0;
   volatile u32 g_uIntCounter2 = 0;
   volatile u32 g_uIntCounter3 = 0;
   volatile u32 g_uIntCounter4 = 0;
   volatile u32 g_uIntCounterWT = 0;
   volatile u32 g_PWMDmaDone;
	u32 g_Def = 0;
	
//   	DMAC oPWMDmac;


//static const u32 uTimerFreq = 100000; // It means 100000Hz=100kHz
//static const u32 uPreScale = PCLK_FREQ/8/(uTimerFreq);

//////////
// Function Name : PWM_UserSelect
// Function Description : This function set up Timers by User's Inputs
// Input :	uTimer [0~4]
//			uPrescaler [1~256]
//			uDivider [0:1/1	1:1/2	2:1/4	3:1/8	4:1/16	5:extCLK]
//			uTCNTB [1~2^31]
//			uTCMPB [1~2^31]
//			uEnDz, uEnDMA, uAutoreload, uEnInverter, uEnInt [0:Disable	1:Enbale]
//			uDzlen [0~255]
// Output : NONE
// Version : v0.1

void PWM_UserSelect(void)
{
	s32	sTimer;
	s32	sPrescaler;
	s32  sDivider;
	s32  sEnDz;
	s32  sDzlen;
	s32  sAutoreload;
	s32  sEnInverter;
	s32 	sEnInt;
	s32	sEnDMA;
	s32  sTCNTB;
	s32  sTCMPB;

	float fTimerclk;
	float fTimerfreq;
	u32	uTemp0;
	u32	uTemp1;
	u32	uTemp2;
	u32  uTemp3;
	s32  sContinue;


	
	
	while(1)
{
//--------------------select timer -------------------------	
	printf("Which timer do you want to control?  \n");
	printf("Select [0~4] :");
	sTimer = GetIntNum();
	if(sTimer == -1)
		{
		sTimer = 0;
//		printf("%d\n",sTimer);
		}
	else
		{
	
//		printf("%d\n",sTimer);
		}
//--------------------------------------------------------

//--------------------select prescaler-----------------------	
	printf("\nSelect prescaler value [1~256] : ");
	sPrescaler = GetIntNum();
	if(sPrescaler == -1)
	{
		sPrescaler = 1;
	}
	else
	{

	}	

//--------------------------------------------------------

//--------------------select dividerMUX---------------------	
	printf("\nSelect dividerMUX value \n ");
	printf("0. 1/1     1. 1/2     2. 1/4     3. 1/8     4. 1/16    5. externalTCLK1\n");
	printf("[0~5] :");
	sDivider = GetIntNum();
	if(sDivider== -1)
	{
		sDivider= 1;

	}
	else
	{

	}	


//--------------------------------------------------------

//--------------------select Deadzone----------------------
	printf("\nSelect Deadzone\n");
	printf("0.Disable     1.Enable\n");
	printf("[0~1]:");
	sEnDz = GetIntNum();

	if(sEnDz== -1)
	{
		sEnDz= 0;

	}
	else
	{

	}	


	if(sEnDz == 1)
	{
		printf("\nSelect Deadzone Length\n");
		printf("[0~255]: ");
		sDzlen = GetIntNum();

		if(sDzlen== -1)
		{
			sDzlen= 20;

		}
		else
		{

		}	

		
	}
	else
	{
	sDzlen = 0;
	}
	


//--------------------------------------------------------

//--------------------select Auto-reload---------------------
		
	printf("\nSelect Auto-reload\n");
	printf("0. One-shot     1. Auto-reload \n");
	printf("[0,1] :");
	sAutoreload = GetIntNum();
	if(sAutoreload == -1)
	{
		sAutoreload = 1;

	}
	else
	{

	}
	
			


//--------------------------------------------------------


//--------------------select Inverter enable------------------
	printf("\nSelect Inverter Enable");
	printf("0. Disable     1. Enblae");
	printf("[0.1] : ");
	sEnInverter = GetIntNum();

	if(sEnInverter == -1)
	{
		sEnInverter = 0;

	}
	else
	{

	}


//--------------------------------------------------------


//--------------------select interrupt enable------------------

	printf("\nSelect Interrupt Enable");
	printf("0. Disable     1. Enblae");
	printf("[0.1] : ");
	sEnInt = GetIntNum();
	if(sEnInt == -1)
	{
		sEnInt = 1;

	}
	else
	{

	}

//--------------------------------------------------------


//--------------------select DMA enable---------------------
	printf("\nSelect DMA Enable");
	printf("0. Disable     1. Enblae");
	printf("[0.1] : ");
	sEnDMA = GetIntNum();

	if(sEnDMA== -1)
	{
		sEnDMA = 0;

	}
	else
	{

	}

	
	if(sEnDMA == 1)
	{
		sEnDMA = sTimer+1;
	}




		
//--------------------------------------------------------


//--------------------select TCNTB-----------------------	
	printf("\nSelect TCNTB value  : ");
	sTCNTB = GetIntNum();
	if(sTCNTB == -1)
	{
		sTCNTB = 2000;

	}
	else
	{

	}	


//--------------------------------------------------------


//--------------------select TCMPB-----------------------	
	printf("\nSelect TCMPB value  : ");
	sTCMPB = GetIntNum();
	if(sTCMPB == -1)
	{
		sTCMPB = 1000;

	}
	else
	{

	}	


//--------------------------------------------------------

//-----------------------Set SFRs--------------------------


	
		uTemp0 = Inp32(rTCFG1);
		uTemp0 = (uTemp0 & (~(0xf<<4*sTimer))& (~(1<<20))) |(sEnDMA<<20)|(sDivider<<4*sTimer);
		Outp32(rTCFG1,uTemp0);

		uTemp0 = Inp32(rTINT_CSTAT);
		uTemp0 = (uTemp0 & (~(1<<sTimer)))|(sEnInt<<(sTimer));
		Outp32(rTINT_CSTAT,uTemp0);

		switch(sTimer)
			{
			case 0:
				uTemp0 = Inp32(rTCON);
				uTemp0 = uTemp0 & (0xfffffffe);
				Outp32(rTCON, uTemp0); 								// Timer0 stop

				uTemp0 = Inp32(rTCFG0);
				uTemp0 = (uTemp0 & (~(0xff00ff))) | ((sPrescaler-1)<<0) |(sDzlen<<16);
				Outp32(rTCFG0, uTemp0);
				
				Outp32(rTCNTB0, sTCNTB);
				Outp32(rTCMPB0, sTCMPB);

				uTemp1 = Inp32(rTCON);
				uTemp1 = (uTemp1 & (~(0x1f))) |(sEnDz<<4)|(sAutoreload<<3)|(sEnInverter<<2)|(1<<1)|(0<<0);
				Outp32(rTCON, uTemp1);									//timer0 manual update
				uTemp1 = (uTemp1 & (~(0x1f))) |(sEnDz<<4)|(sAutoreload<<3)|(sEnInverter<<2)|(0<<1)|(1<<0);				
				Outp32(rTCON, uTemp1);									// timer0 start

				break;
			case 1:
				uTemp0 = Inp32(rTCON);
				uTemp0 = uTemp0 & (0xfffffeff);
				Outp32(rTCON, uTemp0); 								// Timer1 stop

				uTemp0 = Inp32(rTCFG0);
				uTemp0 = (uTemp0 & (~(0xff00ff))) | ((sPrescaler-1)<<0) |(sDzlen<<16);
				Outp32(rTCFG0, uTemp0);
				
				Outp32(rTCNTB1, sTCNTB);
				Outp32(rTCMPB1, sTCMPB);

				uTemp1 = Inp32(rTCON);
				uTemp1 = (uTemp1 & (~(0xf00))) | (sAutoreload<<11)|(sEnInverter<<10)|(1<<9)|(0<<8);
				Outp32(rTCON,uTemp1); 									// timer1 manual update
				uTemp1 = (uTemp1 & (~(0xf00))) | (sAutoreload<<11)|(sEnInverter<<10)|(0<<9)|(1<<8);				
				Outp32(rTCON,uTemp1); 									// timer1 start


				break;
					
			case 2:
				uTemp0 = Inp32(rTCON);
				uTemp0 = uTemp0 & (0xffffefff);
				Outp32(rTCON, uTemp0); 								// Timer2 stop

				uTemp2 = Inp32(rTCFG0);
				uTemp2 = (uTemp2 & (~(0xffff00)))|((sPrescaler-1)<<8)|(sDzlen<<16);
				Outp32(rTCFG0, uTemp2);
				
				Outp32(rTCNTB2, sTCNTB);
				Outp32(rTCMPB2, sTCMPB);

				uTemp3 = Inp32(rTCON);
				uTemp3 = (uTemp3 & (~(0xf000)))|(sAutoreload<<15)|(sEnInverter<<14)|(1<<13)|(0<<12);
				Outp32(rTCON, uTemp3); 								// timer2 manual update

				uTemp3 = (uTemp3 & (~(0xf000)))|(sAutoreload<<15)|(sEnInverter<<14)|(0<<13)|(1<<12);
				Outp32(rTCON,uTemp3);									 // timer2 start

				break;
				
			case 3:
				uTemp0 = Inp32(rTCON);
				uTemp0 = uTemp0 & (0xfffeffff);
				Outp32(rTCON, uTemp0);									 // Timer3 stop

				uTemp2 = Inp32(rTCFG0);
				uTemp2 = (uTemp2 & (~(0xffff00)))|((sPrescaler-1)<<8)|(sDzlen<<16);
				Outp32(rTCFG0, uTemp2);
				
				Outp32(rTCNTB3, sTCNTB);
				Outp32(rTCMPB3, sTCMPB);

				uTemp3 = Inp32(rTCON);
				uTemp3 = (uTemp3 &(~(0xf0000)))|(sAutoreload<<19)|(sEnInverter<<18)|(1<<17)|(0<<16);
				Outp32(rTCON, uTemp3); 								// timer3 manual update
				uTemp3 = (uTemp3 &(~(0xf0000)))|(sAutoreload<<19)|(sEnInverter<<18)|(0<<17)|(1<<16);
				Outp32(rTCON,uTemp3); 									// timer3 start

				break;

			case 4:
				uTemp0 = Inp32(rTCON);
				uTemp0 = uTemp0 & (0xffefffff);
				Outp32(rTCON, uTemp0);									 // Timer4 stop
				
				uTemp2 = Inp32(rTCFG0);
				uTemp2 = (uTemp2 & (~(0xffff00)))|((sPrescaler-1)<<8)|(sDzlen<<16);
				Outp32(rTCFG0, uTemp2);
				
				Outp32(rTCNTB4, sTCNTB);

				uTemp3 = Inp32(rTCON);
				uTemp3 = (uTemp3 & (~(0xf00000)))|(sAutoreload<<22)|(1<<21)|(0<<20);
				Outp32(rTCON,uTemp3); 									// timer4 manual update

				uTemp3 = (uTemp3 & (~(0xf00000)))|(sAutoreload<<22)|(0<<21)|(1<<20);				
				Outp32(rTCON, uTemp3);									 // timer4 start

				break;

			}


		//(1/(PCLK/(Prescaler)/divider) * count(Max 4294967295) = Timer clock (Frequency)
		fTimerclk = (1/(float)((float)g_PCLK/((float)sPrescaler)/(1<<(sDivider))))*sTCNTB*1000;
		fTimerfreq = 1/fTimerclk;

		printf("Timer = %d\n",sTimer);
		printf("nPCLK = %d , sPrescaler = %d, sDivider = %d dd= %d\n",g_PCLK,sPrescaler,sDivider,(1<<(sDivider)));
		printf("Timer Clock = %f msec , Timer Frequency = %f Khz\n\n",fTimerclk,fTimerfreq);


		printf("Do you want to change other timers?\n");
		printf("[0.no	1.yes]:");
		sContinue = GetIntNum();
		if (sContinue == 0)
			break;
		else
			printf("\n");

		
}

⌨️ 快捷键说明

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