⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mng_irq.c

📁 基于MSP430FG4618MCU的铭正同创LCD驱动程序。
💻 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 + -