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

📄 timer_isr.c

📁 Wince4.2 BSP for SH4 engineering development board
💻 C
字号:

//
//      Copyright (c) Renesas Technology Corp. 2002-2003 All Rights Reserved.
//
//      OEM Adaptation Layer
//
//----------------------------------------------------------------------------
//
//  FILE      : TimerISR.C
//  CREATED   : 2001.09.27
//  MODIFIED  : 2003.08.06
//  AUTHOR    : Renesas Technology Corp.
//  HARDWARE  : RENESAS HS7751RSTC01H (S1-E, ITS-DS5)
//  TARGET OS : Microsoft(R) Windows(R) CE .NET 4.2
//  NOTES     : 
//  FUNCTION  : ISR body of HD64404 timer module
//  HISTORY   :
//    			2001.09.27
//    			- Initially created.
//    			2002.01.21
//    			- Modified to refer HD64404 common header file.
//    			2002.5.30
//    			- Changed to include platform-independent platform header
//                file "platform.h".
//              2002.09.26
//              - Released for Hitachi HS7751RSTC01H (S1-E, ITS-DS5)


#include <windows.h>
#include <platform.h>
#include <HD64404.H>
#include <oalintr.h>
#include <drv_glob.h>


typedef struct _TIMER_CHANNEL {
	volatile unsigned long dwInitCount;
	volatile unsigned long dwCurCount;
	volatile unsigned long dwSysintrNo;
} TIMER_CHANNEL;
typedef struct _UPDOWN_CHANNEL {
	volatile unsigned long dwInitCount;
	volatile unsigned long dwCurCount;
	volatile unsigned long dwSysintrNo;
	volatile unsigned long dwLimitCount;
} UPDOWN_CHANNEL;
typedef struct _UPCOUNT_CHANNEL {
	volatile unsigned long dwCurCount;
	volatile unsigned long dwSysintrNo;
	volatile unsigned long dwLimitCount;
} UPCOUNT_CHANNEL;

typedef struct _TIMER_TABLE {
	struct {
		CRITICAL_SECTION		cs;
		volatile unsigned long	dwFreeCHNo;
		volatile long			bCH_Active[16];
		TIMER_CHANNEL			TMRCH[16];
	}timer;
	struct {
		CRITICAL_SECTION		cs;
		volatile unsigned long	dwFreeCHNo;
		volatile long			bCH_Active[16];
		UPCOUNT_CHANNEL			TMRCH[16];
		volatile unsigned long	UpCounter;
	}upcount;
	struct {
		CRITICAL_SECTION		cs;
		volatile unsigned long	dwFreeCHNo;
		volatile long			bCH_Active[16];
		UPDOWN_CHANNEL			TMRCH[16];
		volatile unsigned long	UpDownCounter;
	}updown;
}*PTIMER_TABLE;

#define Read(reg)		(*(volatile unsigned long * const)(reg))
#define Write(reg, val)	(*(volatile unsigned long * const)(reg)) = (val)

int	TimerISR(void)
{
PTIMER_TABLE	pTimer = (PTIMER_TABLE)TIMER_BUFFER_BASE;
int	i;
int	iRet = SYSINTR_NOP;
unsigned long	status;

	status = Read((TMR_BASE+0x0c));
	Write((TMR_BASE+0x0c), 0);	// Clear all timer event
	Read((TMR_BASE+0x0c));		// dummy read
	if ( status & 0x00000020 ){
		if ( pTimer -> timer.dwFreeCHNo != 16 ){
			for( i=0;i < 16;i++ ){
				if ( pTimer -> timer.bCH_Active[i] ){
					if ( pTimer -> timer.TMRCH[i].dwCurCount ){
						(pTimer -> timer.TMRCH[i].dwCurCount) --;
						if ( !pTimer -> timer.TMRCH[i].dwCurCount ){
							if ( iRet == SYSINTR_NOP ){
								iRet = pTimer -> timer.TMRCH[i].dwSysintrNo;
								pTimer -> timer.TMRCH[i].dwCurCount = pTimer -> timer.TMRCH[i].dwInitCount;
							}else{
								pTimer -> timer.TMRCH[i].dwCurCount = 1;
							}
						}
					}
				}
			}
		}
	}
	if ( status & 0x00000001 ){
		if ( pTimer -> upcount.dwFreeCHNo != 16 ){
			for( i=0;i < 16;i++ ){
				if ( pTimer -> upcount.bCH_Active[i] ){
					pTimer -> upcount.TMRCH[i].dwCurCount ++;
					if ( pTimer -> upcount.TMRCH[i].dwCurCount >= pTimer -> upcount.TMRCH[i].dwLimitCount ){
						if ( iRet == SYSINTR_NOP ){
							iRet = pTimer -> upcount.TMRCH[i].dwSysintrNo;
							pTimer -> upcount.TMRCH[i].dwCurCount = 0;
						}
					}
				}
			}
		}
	}
	if ( status & 0x0000000c ){
		if ( pTimer -> updown.dwFreeCHNo != 16 ){
			for( i=0;i < 16;i++ ){
				if ( pTimer -> updown.TMRCH[i].dwCurCount ){
					if ( status & 0x00000004 ){
						pTimer -> updown.TMRCH[i].dwCurCount ++;
						if ( pTimer -> updown.TMRCH[i].dwCurCount >= pTimer -> updown.TMRCH[i].dwLimitCount ){
							if ( iRet == SYSINTR_NOP ){
								iRet = pTimer -> updown.TMRCH[i].dwSysintrNo;
								pTimer -> updown.TMRCH[i].dwCurCount = pTimer -> updown.TMRCH[i].dwInitCount;
							}
						}
					}else{
						pTimer -> updown.TMRCH[i].dwCurCount --;
						if ( !pTimer -> updown.TMRCH[i].dwCurCount ){
							if ( iRet == SYSINTR_NOP ){
								iRet = pTimer -> updown.TMRCH[i].dwSysintrNo;
								pTimer -> updown.TMRCH[i].dwCurCount = pTimer -> updown.TMRCH[i].dwInitCount;
							}
						}
					}
				}else if ( iRet == SYSINTR_NOP ){
					iRet = pTimer -> updown.TMRCH[i].dwSysintrNo;
					pTimer -> updown.TMRCH[i].dwCurCount = pTimer -> updown.TMRCH[i].dwInitCount;
				}
			}
		}
	}
	return iRet;
}

⌨️ 快捷键说明

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