📄 isr.c
字号:
#include "includes.h"
volatile unsigned int IntOffSet;
extern unsigned int GetIsrStartAddr(void);
#define ISRSTART GetIsrStartAddr()
//****************************************************************************
#ifdef _OS_
extern OS_EVENT *UartSem;
extern OS_EVENT *D12Mbox;
//extern INT32U OSCtxSwCtr;
#endif
//****************************************************************************
__swi(0x16) extern void OSEnter0(void);
__swi(0x6) extern void OSEnter1(void);
extern void OS_EnterOS0(void)
{
OSEnter0();
}
//****************************************************************************
static void IsrUndef(void)
{
uprintf("IsrUndef\n");
while(1);
}
extern void IsrSWI(unsigned int swi_num)
{
switch(swi_num)
{
case 0x16:
break;
default: break;
}
uprintf("IsrSWI\n");
while(1);
}
static void IsrPabort(void)
{
uprintf("IsrPabort\n");
while(1);
}
static void IsrDabort(void)
{
uprintf("IsrDabort\n");
while(1);
}
static void IsrReserved(void)
{
unsigned short val=1;
#ifdef _OS_
val=OSSemAccept(UartSem);
#endif
if(val)
{
uprintf("IsrReserved\n");
#ifdef _OS_
OSSemPost(UartSem);
#endif
}
while(1);
}
/*
static void IsrIrq(void)
{
}
static void IsrFIQ(void)
{
}
*/
static void IsrADC(void)
{
}
static void IsrRTC(void)
{
}
static void IsrUTXD1(void)
{
}
static void IsrUTXD0(void)
{
}
static void IsrSIO(void)
{
}
static void IsrIIC(void)
{
}
static void IsrURXD1(void)
{
}
static void IsrURXD0(void)
{
}
void IsrTIMER5(void)
{
static unsigned int tt=0;
unsigned short val=1;
tt++;
#ifdef _OS_
val=OSSemAccept(UartSem);
#endif
if(val)
{
//uprintf("Timer5 Int %d\n",tt);
//uprintf("%d\n",OSCtxSwCtr);
//uprintf("%d\n",OSIntNesting);
#ifdef _OS_
OSSemPost(UartSem);
#endif
}
}
static void IsrTIMER4(void)
{
}
static void IsrTIMER3(void)
{
}
static void IsrTIMER2(void)
{
}
static void IsrTIMER1(void)
{
}
static void IsrTIMER0(void)
{
}
static void IsrUERR01(void)
{
}
static void IsrWDT(void)
{
}
static void IsrBDMA1(void)
{
}
static void IsrBDMA0(void)
{
}
static void IsrZDMA1(void)
{
}
static void IsrZDMA0(void)
{
}
void IsrTICK(void)
{
#ifdef _OS_
OSTimeTick();
#endif
}
static void IsrEINT4567(void)
{
switch(rEXTINTPND&0x0f)
{
case 0x01:rPDATC^=0x0002;
//delay(100);
rEXTINTPND|=1;
rI_ISPC|=(1<<21);
break;
case 0x02:rPDATC^=0x0004;
//delay(100);
rEXTINTPND|=2;
rI_ISPC|=(1<<21);
break;
case 0x04:rPDATC^=0x0008;
//delay(100);
rEXTINTPND|=4;
rI_ISPC|=(1<<21);
break;
default: //delay(100);
rEXTINTPND|=15;
rI_ISPC|=(1<<21);
break;
}
}
static void IsrEINT3(void)
{
}
static void IsrEINT2(void)
{
}
static void IsrEINT1(void)
{
}
static void IsrEINT0(void)
{
}
/****************************************************************/
static void RTCTICKInit(void)
{
rRTCCON|=0x01;
rTICINT=0x81;
rRTCCON&=~(0x01);
}
static void Timer5Init(void)
{
/*
rTCON=0;
rTCFG0=255<<16;//1/256
rTCFG1=2<<20;//1/8
rTCNTB5=32767;
rTCON=3<<24;
*/
rTCON &= 0xf0ffffff; //clear manual update bit, stop Timer 5
rTCFG0 &= 0xff00ffff; //定时器4/5的预分频为128
rTCFG0 |= (128-1)<<16;
rTCFG1 &= 0xff0fffff; //定时器5的MUX为1/8
rTCFG1 |= 2<<20;
rTCNTB5 =32767; //定时器5的重装值,在ENABLE之前设定
rTCON |= 0x02000000; //定时器5的MANUAL UPDATE BIT设为1
;rTCON &= 0xf0ffffff; //MANUAL UPDATE BIT清零
rTCON |= 0x05000000; //定时器5 start, 设为INTERVAL模式
}
/****************************************************************/
void IrqInit(void)
{
RTCTICKInit();
Timer5Init();
IsrInstallAll();
rINTCON=0x05;//non-vectored interrupt
rINTMOD=0x0;
rINTMSK=0x07cffeff;//5cffeff
//rINTMSK=0x05ffffff;
rI_ISPC|=0x03ffffff;
}
static void IsrInstall(unsigned int vector,unsigned int isr)
{
//isr 入口地址根据init中的进行计算
vector=ISRSTART+vector*4;
*(unsigned int *)vector=(unsigned int)isr;
}
//在该函数中完成ISR注册
//for vectored interrupt mode
void IsrInstallAll(void)
{
IsrInstall(vctUNDEF,(unsigned int)IsrUndef);
IsrInstall(vctSWI,(unsigned int)IsrSWI);
IsrInstall(vctPABORT,(unsigned int)IsrPabort);
IsrInstall(vctDABORT,(unsigned int)IsrDabort);
IsrInstall(vctRESERVED,(unsigned int)IsrReserved);
IsrInstall(vctADC,(unsigned int)IsrADC);
IsrInstall(vctRTC,(unsigned int)IsrRTC);
IsrInstall(vctUTXD1,(unsigned int)IsrUTXD1);
IsrInstall(vctUTXD0,(unsigned int)IsrUTXD0);
IsrInstall(vctSIO,(unsigned int)IsrSIO);
IsrInstall(vctIIC,(unsigned int)IsrIIC);
IsrInstall(vctURXD1,(unsigned int)IsrURXD1);
IsrInstall(vctURXD0,(unsigned int)IsrURXD0);
IsrInstall(vctTIMER5,(unsigned int)IsrTIMER5);
IsrInstall(vctTIMER4,(unsigned int)IsrTIMER4);
IsrInstall(vctTIMER3,(unsigned int)IsrTIMER3);
IsrInstall(vctTIMER2,(unsigned int)IsrTIMER2);
IsrInstall(vctTIMER1,(unsigned int)IsrTIMER1);
IsrInstall(vctTIMER0,(unsigned int)IsrTIMER0);
IsrInstall(vctUERR01,(unsigned int)IsrUERR01);
IsrInstall(vctWDT,(unsigned int)IsrWDT);
IsrInstall(vctBDMA1,(unsigned int)IsrBDMA1);
IsrInstall(vctBDMA0,(unsigned int)IsrBDMA0);
IsrInstall(vctZDMA1,(unsigned int)IsrZDMA1);
IsrInstall(vctZDMA0,(unsigned int)IsrZDMA0);
IsrInstall(vctTICK,(unsigned int)IsrTICK);
IsrInstall(vctEINT4567,(unsigned int)IsrEINT4567);
IsrInstall(vctEINT3,(unsigned int)IsrEINT3);
IsrInstall(vctEINT2,(unsigned int)IsrEINT2);
IsrInstall(vctEINT1,(unsigned int)IsrEINT1);
IsrInstall(vctEINT0,(unsigned int)IsrEINT0);
}
//****************************************************************************
void (*pIsrFunc[26])(void)=
{
IsrADC,
IsrRTC,
IsrUTXD1,
IsrUTXD0,
IsrSIO,
IsrIIC,
IsrURXD1,
IsrURXD0,
IsrTIMER5,
IsrTIMER4,
IsrTIMER3,
IsrTIMER2,
IsrTIMER1,
IsrTIMER0,
IsrUERR01,
IsrWDT,
IsrBDMA1,
IsrBDMA0,
IsrZDMA1,
IsrZDMA0,
IsrTICK,
IsrEINT4567,
IsrEINT3,
IsrEINT2,
IsrEINT1,
IsrEINT0,
};
//****************************************************************************
//for non-vectored interrupt mode
void ISR_IrqHandler(void)
{
#ifdef _OS_
OSIntEnter();
#endif
pIsrFunc[IntOffSet]();
#ifdef _OS_
OSIntExit();
#endif
}
//****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -