||
/*----------------------------------------------------------------------------------------
文件名称:ISR.c
描述:建立中断服务程序
------------------------------------------------------------------------------------------*/
#include "..\include\ISR.h"
#define INT_SOURCE_MAX 19 // 中断类型个数
/////////////////////////////////////////////////////////////////
//
typedef struct
{
void (*pfnInterrupt)(void);
}ISR;
//////////////////////////////////////////////////////////////////
// 函数指针数组,用于指向中断函数
static ISR isr[INT_SOURCE_MAX];
///////////////////////////////////////////////////////////////////
// 注册须中断调用的函数,详解见头文件ISR.h
BOOL RegInterrupt(void (*pfn)(void), INT16U isrSource)
{
if (isrSource > INT_SOURCE_MAX-1)
{
return 0;
}
isr[isrSource].pfnInterrupt = pfn;
return 1;
}
//////////////////////////////////////////////////////////////////
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
isr[IRQ_BREAK].pfnInterrupt();
}
void FIQ(void) __attribute__ ((ISR));
void FIQ(void)
{
if (*P_INT_Ctrl & C_FIQ_TMA)
{
*P_INT_Clear = C_FIQ_TMA;
isr[FIQ_TMA].pfnInterrupt();
}
else if (*P_INT_Ctrl & C_FIQ_TMB)
{
*P_INT_Clear = C_FIQ_TMB;
isr[FIQ_TMB].pfnInterrupt();
}
else
{
*P_INT_Clear = C_FIQ_PWM;
isr[FIQ_PWM].pfnInterrupt();
}
}
void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
*P_INT_Clear = C_IRQ0_PWM;
isr[IRQ0_PWM].pfnInterrupt();
}
void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{
*P_INT_Clear = C_IRQ0_PWM;
isr[IRQ1_TMA].pfnInterrupt();
}
void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
*P_INT_Clear = C_IRQ2_TMB;
isr[IRQ2_TMB].pfnInterrupt();
}
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
if (*P_INT_Ctrl & C_IRQ3_EXT1)
{
*P_INT_Clear = C_IRQ3_EXT1;
isr[IRQ3_EXT1].pfnInterrupt();
}
else if (*P_INT_Ctrl & C_IRQ3_EXT2)
{
*P_INT_Clear = C_IRQ3_EXT2;
isr[IRQ3_EXT2].pfnInterrupt();
}
else
{
*P_INT_Clear = C_IRQ3_KEY;
isr[IRQ3_KEY].pfnInterrupt();
}
}
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
if (*P_INT_Ctrl & C_IRQ4_1KHz)
{
*P_INT_Clear = C_IRQ4_1KHz;
isr[IRQ4_1KHz].pfnInterrupt();
}
else if (*P_INT_Ctrl & C_IRQ4_2KHz)
{
*P_INT_Clear = C_IRQ4_2KHz;
isr[IRQ4_2KHz].pfnInterrupt();
}
else
{
*P_INT_Clear = C_IRQ4_4KHz;
isr[IRQ4_4KHz].pfnInterrupt();
}
}
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
if (*P_INT_Ctrl & C_IRQ5_2Hz)
{
*P_INT_Clear = C_IRQ5_2Hz;
isr[IRQ5_2Hz].pfnInterrupt();
}
else
{
*P_INT_Clear = C_IRQ5_4Hz;
isr[IRQ5_4Hz].pfnInterrupt();
}
}
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
if (*P_INT_Ctrl & C_IRQ6_TMB1)
{
*P_INT_Clear = C_IRQ6_TMB1;
isr[IRQ6_TMB1].pfnInterrupt();
}
else
{
*P_INT_Clear = C_IRQ6_TMB2;
isr[IRQ6_TMB2].pfnInterrupt();
}
}
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
if (*P_UART_Command2 & C_UART_Tx_RDY)
{
isr[IRQ7_UART_Tx].pfnInterrupt();
}
else
{
isr[IRQ7_UART_Rx].pfnInterrupt();
}
}