📄 pctimer.c
字号:
// pctimer.c : 模拟Timer 中断计时
// 或者模拟所有的外围设备寄存器.
//通过地址来定位.
/******************************************************************/
#include "include.h"
#include "hw_interrupt.h"
/******************************************************************/
#define PCTM_ENABLE (0X0001<<0) // TIMER 允许.
#define PCTM_INTERRUPT (0X0001<<1) // 正在产生中断.
typedef struct _PCTIMER_REGISTER
{
PERIPH_REG pcTimerMask;
PERIPH_REG pcTimerCurCnt;
PERIPH_REG pcTimerInitCnt;
} PCTIMER_REGISTER , *PPCTIMER_REGISTER;
PPCTIMER_REGISTER gpPCTimerRegister = (PPCTIMER_REGISTER)TMRCTRL_BASE;
INT32U PCTimerOSStartFlag = 0;
INT32U PCTimerRouting = 0;
/******************************************************************/
BOOL Timer_PowerOnInit(UINT8 index, UINT32 mstick)
{
if (index >= TIMER_COUNT)
return FALSE;
gpPCTimerRegister[index].pcTimerMask = PCTM_ENABLE;
gpPCTimerRegister[index].pcTimerInitCnt = gpPCTimerRegister[index].pcTimerCurCnt = mstick / 5;
return TRUE;
}
void Timer_ClearIntrFlag(UINT8 index)
{
gpPCTimerRegister[index].pcTimerMask &= (~PCTM_INTERRUPT);
}
UINT32 Timer_GetCount(UINT8 index)
{
return gpPCTimerRegister[index].pcTimerCurCnt;
}
void PCTimerUpdate(void)
{
INT32U index = 0;
if ((!PCTimerOSStartFlag) || PCTimerRouting)
return;
PCTimerRouting = 1;
while (index < TIMER_COUNT)
{
if ((gpPCTimerRegister[index].pcTimerMask & PCTM_ENABLE))
{
gpPCTimerRegister[index].pcTimerCurCnt --;
if (gpPCTimerRegister[index].pcTimerCurCnt == 0)
{
gpPCTimerRegister[index].pcTimerCurCnt = gpPCTimerRegister[index].pcTimerInitCnt;
gpPCTimerRegister[index].pcTimerMask |= PCTM_INTERRUPT;
PCCoreSystemRestart(0);
PCIGenerateIRQ(INTC_TMR0 + index);
}
}
index++;
}
PCTimerRouting = 0;
}
/*--------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -