📄 isr.c
字号:
#include "44b.h"
#include "44blib.h"
#include "ISR.h"
#include "def.h"
static int LedStatus=0;
extern void OS_CPU_IRQ_ISR(void);
extern OSTimeTick(void);
void (*InterruptHandlers[MAXHNDLRS])(void);
void (*ExInt4567Handlers[4])(void);
void ExInt4567() //外部中断4567的共享函数
{
int i,exinpnd=rEXTINTPND,tmp=1;//temp bit
for(i=0;i<4;i++){
if(exinpnd&tmp){
rEXTINTPND=tmp; //clear Extint bit
rI_ISPC=(1<<4); //clear i_ispc
(*ExInt4567Handlers[i])();
break;
}
tmp<<=1;
}
}
int GetISROffsetClr()
{
//计算中断的偏移地址,高位优先
int i,ispr=rI_ISPR,tmp=1<<(MAXHNDLRS-1);//temp bit
for(i=MAXHNDLRS;i>0;i--){
if(ispr&tmp){
rI_ISPC=tmp;//清中断
return i-1;
}
tmp>>=1;
}
return -1;
}
void SetISR_Interrupt(int vector, void (*handler)(), int ExInt)
{
if(vector==EINT4567_OFFSET){
InterruptHandlers[vector] = ExInt4567;
ExInt4567Handlers[ExInt] = handler;
}
else {
InterruptHandlers[vector] = handler;
}
}
void ISR_IrqHandler()
{
//int intpnd=rINTPND;
// while(intpnd!=0)
{
int IntOffset=GetISROffsetClr(); //得到中断向量的偏移地址
//OSIntEnter();
(*InterruptHandlers[IntOffset])(); // Call interrupt service routine
//OSIntExit();
// intpnd=rINTPND;
}
}
void uHALr_InterruptRequestInit()
{
pISR_UNDEF= (unsigned) DebugUNDEF;
pISR_SWI= (unsigned) DebugSWI;
pISR_PABORT= (unsigned) DebugABORT;
pISR_DABORT= (unsigned) DebugABORT;
// pISR_RESERVED
pISR_IRQ= (unsigned) OS_CPU_IRQ_ISR; //irq interrupt
pISR_FIQ= (unsigned) DebugFIQ;
SetISR_Interrupt(INT_TIMER1_OFFSET,OSTickISR,NULL);
///////////////////////No use////////////////////////
pISR_ADC= (unsigned) BreakPoint;
pISR_RTC= (unsigned) BreakPoint;
pISR_UTXD1= (unsigned) BreakPoint;
pISR_UTXD0= (unsigned) BreakPoint;
pISR_SIO= (unsigned) BreakPoint;
pISR_IIC= (unsigned) BreakPoint;
pISR_URXD1= (unsigned) BreakPoint;
pISR_URXD0= (unsigned) BreakPoint;
//remove by eric rong// pISR_EINT67= (unsigned) BreakPoint;
pISR_WDT= (unsigned) BreakPoint;
pISR_TIMER3= (unsigned) BreakPoint;
pISR_TIMER2= (unsigned) BreakPoint;
//pISR_TIMER1= (unsigned) OSTickISR;
pISR_TIMER0= (unsigned) BreakPoint;
//remove by eric rong// pISR_UERR1= (unsigned) BreakPoint;
//remove by eric rong// pISR_UERR0= (unsigned) BreakPoint;
pISR_BDMA1= (unsigned) BreakPoint;
pISR_BDMA0= (unsigned) BreakPoint;
pISR_ZDMA1= (unsigned) BreakPoint;
pISR_ZDMA0= (unsigned) BreakPoint;
//remove by eric rong// pISR_EINT5= (unsigned) BreakPoint;
//remove by eric rong// pISR_EINT4= (unsigned) BreakPoint;
pISR_EINT3= (unsigned) BreakPoint;
pISR_EINT2= (unsigned) BreakPoint;
pISR_EINT1= (unsigned) BreakPoint;
pISR_EINT0= (unsigned) BreakPoint;
/////////////////////////////////////////////////////
}
void OSTickISR(void)
{
// rTCON=(0x2<<8); //update mode for TCNTB1 and TCMPB1.
// rI_ISPC=BIT_TIMER1;
//rTCON=(0x9<<8); //timer1 = auto reload, start
OSTimeTick();
Led_Display(LedStatus);
LedStatus=(~(LedStatus)&0x7);
Uart_Printf("\nTIMER interrupt... ");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -