📄 mng_irq.c
字号:
#include "sys_def.h"
#include "mng_irq.h"
/*******************************************************************************
// 静态变量定义
*******************************************************************************/
//irq vector
static Irq_t aIrqVector[NUM_IRQ];
/*******************************************************************************
// 外部变量定义
*******************************************************************************/
char acIrqLog[32];
/*******************************************************************************
// 外部函数定义
*******************************************************************************/
void IrqMngInit()
{
//初始化软件
for (USHORT usIrqNum = 1; usIrqNum <= NUM_IRQ; ++usIrqNum){
aIrqVector[usIrqNum].usIrqNum = usIrqNum;
aIrqVector[usIrqNum].pfIrqProc = NULL;
}
//初始化Port1
P1DIR = 0x00;
P1IES = 0x00;
P1IFG = 0x00;
P1SEL = 0x00;
P1IE = 0xFF;
//初始化Port2
P2DIR = 0x00;
P2IES = 0x00;
P2IFG = 0x00;
P2SEL = 0x00;
P2IE = 0xFF;
//初始化Adc12
ADC12CTL0 &= ~ENC;
ADC12CTL0 = REFON + REF2_5V + ADC12ON + SHT0_2 + INCH_0 + ADC12SSEL0;
ADC12CTL1 = SHP + ADC12SSEL1;
ADC12MCTL0 = SREF_1;
Delay(10);
ADC12CTL0 |= ENC;
ADC12IE = 0xFFFF;
sprintf(acIrqLog, "Init Irq");
//启动可屏蔽中断
__enable_interrupt();
return;
}
int RegIrq(USHORT usIrqNum, IRQ_PROC_FUNC pfIrqProc)
{
int iRst = NG;
USHORT int_state = __get_interrupt_state();
__disable_interrupt();
if (0 < usIrqNum && usIrqNum <= NUM_IRQ
&& NULL == aIrqVector[usIrqNum].pfIrqProc){
aIrqVector[usIrqNum].pfIrqProc = pfIrqProc;
iRst = OK;
}
__set_interrupt_state(int_state);
return iRst;
}
int UnregIrq(USHORT usIrqNum)
{
int iRst = NG;
if (0 < usIrqNum && usIrqNum <= NUM_IRQ){
aIrqVector[usIrqNum].pfIrqProc = NULL;
iRst = OK;
}
return iRst;
}
/*******************************************************************************
// 静态函数定义
*******************************************************************************/
//Timer&Port IRQ Process
__monitor int IrqProc(int iIrqID)
{
static int iCnt = 0;
int iRst = NG;
USHORT usBit;
USHORT usIrqNum;
switch (iIrqID){
case IRQ_PORT1:
for (usBit=0x01, usIrqNum=IRQ_PORT1_BIT0; usIrqNum <= IRQ_PORT1_BIT7; usBit<<=1, ++usIrqNum){
if (P1IFG & usBit && aIrqVector[usIrqNum].pfIrqProc){
iRst = aIrqVector[usIrqNum].pfIrqProc();
}
}
P1IFG = 0x00;
break;
case IRQ_PORT2:
for (usBit=0x01, usIrqNum=IRQ_PORT2_BIT0; usIrqNum <= IRQ_PORT2_BIT7; usBit<<=1, ++usIrqNum){
if (P2IFG & usBit && aIrqVector[usIrqNum].pfIrqProc){
iRst = aIrqVector[usIrqNum].pfIrqProc();
}
}
P2IFG = 0x00;
break;
case IRQ_ADC12:
for (usBit=0x0001, usIrqNum=IRQ_ADC12_A0; usIrqNum <= IRQ_ADC12_A15; usBit<<=1, ++usIrqNum){
if (ADC12IFG & usBit && aIrqVector[usIrqNum].pfIrqProc){
iRst = aIrqVector[usIrqNum].pfIrqProc();
}
}
P2IFG = 0x00;
break;
default:
iRst = NG;
break;
}
//保存Log信息
sprintf(acIrqLog, "%d:%d", usIrqNum, ++iCnt);
return iRst;
}
/* 0xFFE8 Port1 */
#pragma vector=PORT1_VECTOR
__interrupt void PORT1(void)
{
if (OK == IrqProc(IRQ_PORT1)){
__bic_SR_register_on_exit(CPUOFF);
}
return;
}
/* 0xFFE2 Port2 */
#pragma vector=PORT2_VECTOR
__interrupt void PORT2(void)
{
if (OK == IrqProc(IRQ_PORT2)){
__bic_SR_register_on_exit(CPUOFF);
}
return;
}
/* 0xFFEE ADC12 */
#pragma vector=ADC12_VECTOR
__interrupt void ADC12(void)
{
if (OK == IrqProc(IRQ_ADC12)){
__bic_SR_register_on_exit(CPUOFF);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -