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

📄 timer.c

📁 ucos porting source for Am188
💻 C
字号:
/************************************************************************/
/* PROGRAMER: CHAE, BYOUNG-CHEOL                                        */
/* PROGRAM  : TIMER.C                                                   */
/* COMPILER : BORLAND C/C++ 3.1 FOR DOS 								*/
/************************************************************************/

#include ".\header\main.h"

void __interrupt far INT_Timer0(void);
void __interrupt far INT_Timer1(void);
void __interrupt far INT_Timer2(void);

unsigned int Timer1, Timer2, Timer3;

/************************************************************************/
/* NAME     :                                                           */
/* FUNCTION :                                                           */
/* ARGUMENT :                                                           */
/* RETURNS  :                                                           */
/************************************************************************/
void static __interrupt INT_Timer0(void)
{
	OSIntEnter();

	OSTimeTick();
	outpw(INT_EOI, EOITYPE_TMR0);

	OSIntExit();
}

/************************************************************************/
/* NAME     :                                                           */
/* FUNCTION :                                                           */
/* ARGUMENT :                                                           */
/* RETURNS  :                                                           */
/************************************************************************/
void static __interrupt INT_Timer1(void)
{
	OSIntEnter();
	outpw(INT_EOI, EOITYPE_TMR1);
	OSIntExit();
}

/************************************************************************/
/* NAME     :                                                           */
/* FUNCTION :                                                           */
/* ARGUMENT :                                                           */
/* RETURNS  :                                                           */
/************************************************************************/
void static __interrupt INT_Timer2(void)
{
	OSIntEnter();
	outpw(INT_EOI, EOITYPE_TMR2);
	OSIntExit();
}

/***********************************************************************/
/* NAME     : TIMER_initialize                                         */
/* FUNCTION :                                                          */
/* ARGUMENT : NONE                                                     */
/* RETURN   : NONE                                                     */
/***********************************************************************/
void TIMER_Initialize(void)
{
    poke(0x0000, ITYPE_TMR0*4,  FP_OFF(INT_Timer0));
    poke(0x0000, ITYPE_TMR0*4+2,FP_SEG(INT_Timer0));

    //poke(0x0000, ITYPE_TMR0*4,  FP_OFF(OSTickISR));
    //poke(0x0000, ITYPE_TMR0*4+2,FP_SEG(OSTickISR));

	poke(0x0000, ITYPE_TMR1*4,  FP_OFF(INT_Timer1));
    poke(0x0000, ITYPE_TMR1*4+2,FP_SEG(INT_Timer1));
    
	poke(0x0000, ITYPE_TMR2*4,  FP_OFF(INT_Timer2));
    poke(0x0000, ITYPE_TMR2*4+2,FP_SEG(INT_Timer2));

	outpw(INT_TMR, inpw(INT_TMR) | INT_PRI7);
	
	// CPU clock = 40Mhz
	// Timer reference = 40/10 = 10MHz
    // TIMER 0,1 are prescaled by TIMER2
	TIMER_Control1(TIMER0, TMR_START | TMR_INT | TMR_CONT | TMR_2PRES,
                           0x00, 1000/OS_TICKS_PER_SEC, 1000/OS_TICKS_PER_SEC);
	
	// TIMER1 is prescaled by TIMER2 
	TIMER_Control1(TIMER1, TMR_START | TMR_INT | TMR_CONT | TMR_2PRES,
                           0x00, 50, 50);          // 50ms
	
	TIMER_Control1(TIMER2, TMR_START | TMR_INT | TMR_CONT,
                           0x00, 0x2710, 0xFFFF); // 1ms


	//TIMER_Control2(TIMER0, 0);
    //TIMER_Control2(TIMER1, 1);
    //TIMER_Control2(TIMER2, 1);
}

/***********************************************************************/
/* NAME     :                                                          */
/* FUNCTION :                                                          */
/* ARGUMENT : NONE                                                     */
/* RETURN   : NONE                                                     */
/***********************************************************************/
void TIMER_Control1(int ch, word ctrl, word count, word MaxA, word MaxB)
{
	switch (ch)
	{
		case TIMER0:
			outpw(TMR0_CTL, ctrl);
			outpw(TMR0_CNT, count);
			outpw(TMR0_MAXA, MaxA);
			outpw(TMR0_MAXB, MaxB);
			break;
		case TIMER1:
			outpw(TMR1_CTL, ctrl);
			outpw(TMR1_CNT, count);	
			outpw(TMR1_MAXA, MaxA);
			outpw(TMR1_MAXB, MaxB);
			break;
		case TIMER2:	
			outpw(TMR2_CTL, ctrl);
			outpw(TMR2_CNT, count);	
			outpw(TMR2_MAXA, MaxA);
			break;
	}
}

/***********************************************************************/
/* NAME     :                                                          */
/* FUNCTION :                                                          */
/* ARGUMENT : NONE                                                     */
/* RETURN   : NONE                                                     */
/***********************************************************************/
void TIMER_Control2(int ch, int on_off)
{
	disable();	
	switch (ch)
	{
		case TIMER0:
			if (on_off)
				outpw(TMR0_CTL, inpw(TMR0_CTL) | TMR_START);
			else
				outpw(TMR0_CTL, inpw(TMR0_CTL) & ~TMR_START);
			break;
		case TIMER1:
			if (on_off)
				outpw(TMR1_CTL, inpw(TMR1_CTL) | TMR_START);
			else
				outpw(TMR1_CTL, inpw(TMR1_CTL) & ~TMR_START);
			break;
		case TIMER2:	
			if (on_off)
				outpw(TMR2_CTL, inpw(TMR2_CTL) | TMR_START);
			else
				outpw(TMR2_CTL, inpw(TMR2_CTL) & ~TMR_START);
			break;
	}
	enable();
}

/***********************************************************************/
/* NAME     : TIMER_Delay                                              */
/* FUNCTION : delay ?? miliseconds                                     */
/* ARGUMENT : value - delay value                                      */
/* RETURN   : NONE                                                     */
/***********************************************************************/
void TIMER_Delay(unsigned int value)
{
	TMR_ON();
    TIMER_Control2(TIMER2, 1);
	Timer3 = value;

	while (Timer3) ;
    TIMER_Control2(TIMER2, 0);
}

⌨️ 快捷键说明

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