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

📄 interruptisr.c

📁 此代码应用与f2812的通讯程序!!方便用户编程!
💻 C
字号:

/**************************************************************************/
//  文件名称: InterruptIsr.c
//
//  简    介: 所有的中断服务程序:外部中断2中断, 定时器2中断, 采样中断,串口AB中断,捕获中断
//
//  版权所有(C)2006.12      中科大鲁能集成公司
/**************************************************************************/  
#include "Device.h"

interrupt void nothing(void)
{
	asm ("      ESTOP0");
	for(;;);
}

interrupt void INT13_ISR(void)     
{
	
}

//1306秒中断
interrupt void  XINT2_ISR(void)
{
	DINT;	
	GpioDataRegs.GPFTOGGLE.bit.GPIOF14 = 1;// running lamp
	TimerFlag.f1s=1;

	Time1306.seconds++;
	
	if(Time1306.seconds>=60)
	{
		TimerFlag.f1min=1; 
		Time1306.seconds=0;
		Time1306.minutes++;		
	}
	if(Time1306.minutes>=60)
	{
		TimerFlag.f1hour=1;	
		Time1306.minutes=0;
		Time1306.hours++;
	}
	if(Time1306.hours>=24)
	{
		TimerFlag.f1day=1;	
		Time1306.hours=0;
	}	
	PieCtrlRegs.PIEACK.bit.ACK1=1;//清外围模块中断允许标志,第一组
	EINT;
}

 // CPU-Timer2 10ms
interrupt void INT14_ISR(void)  
{	 	  
	DINT;
	
	TimerFlag.f10ms = 1;

	if(ComParm[0].rxidletime >0)  //通讯端口接收等待
	{
		ComParm[0].rxidletime--;
		
		if(ComParm[0].rxidletime == 0) 
		{

		}		   
	} 

	if(ComParm[1].rxidletime >0)
	{
		ComParm[1].rxidletime--;
		
		if(ComParm[1].rxidletime == 0) 
		{
			
		}		   
	} 

	if(SpiData.Busy10ms > 0) 
	{
		SpiData.Busy10ms--;
	}

	if(SstFlashData.Busy10ms >0)
	{
		SstFlashData.Busy10ms--;
	}

	EINT;
}

 // SCI-A receive
interrupt void SCIRXINTA_ISR(void)    
{
	int temp=0;
	DINT;
	
	if(SciaRegs.SCIRXST.bit.RXERROR == 1)//接收错误处理
	{
		SciaRegs.SCICTL1.bit.SWRESET=0;
		SciaRegs.SCIFFTX.bit.TXFIFOXRESET=0;
		SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
		
		SciaRegs.SCICTL1.bit.SWRESET=1;
		SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
		SciaRegs.SCIFFRX.bit.RXFIFORESET=1;	    	    
	}
	
	while (SciaRegs.SCIFFRX.bit.RXFIFST != 0) //接收FIFO不空则读取数据
	{
		temp = SciaRegs.SCIRXBUF.bit.RXDT & 0xFF;
		
		if((RxLena >0 )||( temp == 0x68))	
		{
			ComBufa[RxLena++]= temp; 			
			if(RxLena > BUF_SIZE)
			{
				RxLena = 0;
			}

			ComParm[0].rxidletime = ComParm[0].rxouttime;	   	
		}
	}
	
	SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;  // 将接收中断标志清零
	SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//clear overflow flager
	PieCtrlRegs.PIEACK.bit.ACK9 = 1;//串口所在的外围模块中断允许
	EINT;
}

 // SCI-A send
interrupt void SCITXINTA_ISR(void)     
{
	DINT;
	
	ComParm[0].txidletime = ComParm[0].txouttime;
	
	while(SciaRegs.SCIFFTX.bit.TXFFST<16) //发送FIFO不为满则发送数据给SCI
	{
		SciaRegs.SCITXBUF = ComBufa[TxCounta++] & 0xFF;

		if ( TxCounta+1 > TxLena)
		{
			SciaRegs.SCIFFTX.bit.TXFFIENA = 0;//FIFO发送中断禁止
			TxCounta = 0;
			break;
		}
	}
	
	SciaRegs.SCIFFTX.bit.TXINTCLR=1;//将发送中断标志清零 	
	PieCtrlRegs.PIEACK.bit.ACK9 = 1;//串口所在的外围模块中断允许
	EINT;
}
// SCI-B
interrupt void SCIRXINTB_ISR(void)     
{
	int temp=0;
	DINT;
	
	if(ScibRegs.SCIRXST.bit.RXERROR == 1)//接收错误处理
	{
		ScibRegs.SCICTL1.bit.SWRESET=0;
		ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0;
		ScibRegs.SCIFFRX.bit.RXFIFORESET=0;
		
		ScibRegs.SCICTL1.bit.SWRESET=1; 
		ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
		ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
	}	
	
	while (ScibRegs.SCIFFRX.bit.RXFIFST != 0) //接收FIFO不空,则读取数据
	{
		temp = ScibRegs.SCIRXBUF.bit.RXDT & 0xFF;
		if((RxLenb>0 )||( temp== 0x68))	
		{
			ComBufb[RxLenb++]= temp; 
					    	
			if(RxLenb > BUF_SIZE)
			{
				RxLenb = 0;
			}		 
			ComParm[1].rxidletime = ComParm[1].rxouttime;   
		}
	}     
	
	ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;  // 将接收中断标志清零
	ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;//clear overflow flager
	PieCtrlRegs.PIEACK.bit.ACK9 = 1;//串口所在的外围模块中断允许
	EINT;
}

interrupt void SCITXINTB_ISR(void)     // SCI-B
{
	DINT;
	
	ComParm[1].txidletime = ComParm[1].txouttime;//ComParm.outtime;
	
	while(ScibRegs.SCIFFTX.bit.TXFFST<16)// the send FIFO is not full
	{
		ScibRegs.SCITXBUF = ComBufb[TxCountb++] & 0xFF;

		if ( TxCountb + 1 > TxLenb)
		{
			ScibRegs.SCIFFTX.bit.TXFFIENA = 0;//FIFO发送中断禁止
			TxCountb=0;
			break;
		}
	}
	
	ScibRegs.SCIFFTX.bit.TXINTCLR=1;//将发送中断标志清零 	
	PieCtrlRegs.PIEACK.bit.ACK9 = 1;//串口所在的外围模块中断允许
	EINT;
}

//EVB-CAP4 捕获交流信号Ua上升沿跳变 测频和启动ADC采样
interrupt void CAPINT4_ISR(void)
{
	DINT;		
	
	cePin.capGood = 3;
	if(cePin.pinLvNow != cePin.pinLvBef)//pinLv change
	{
		EvbRegs.T4PR = cePin.pinLvNow;
		cePin.pinLvBef = cePin.pinLvNow;
	}
	
	//CAPTURE
	cePin.capnum1=EvbRegs.CAP4FIFO;
	cePin.capnum2=EvbRegs.CAP4FIFO;	
	wst.cepinFlag=1;
	
	if(wst.enaSample)	  // Enable EVB timer4 to start ADC
		EvbRegs.T4CON.bit.TENABLE=1;
	
	EvbRegs.EVBIFRC.bit.CAP4INT=1;//clear capture1 interrupt flag
	PieCtrlRegs.PIEACK.bit.ACK5 = 1;

	EINT;

}

// ADC采样中断,每次16通道并发采样转换结束后读取寄存器值
interrupt void  ADCINT_ISR(void)     
{	
	Ach[0][SamCounter] = (long)AdcRegs.ADCRESULT0>>4;        //Ua,  ADCa0
	Ach[1][SamCounter] = (long)AdcRegs.ADCRESULT2>>4;        //Ub,  ADCa1
	Ach[2][SamCounter] = (long)AdcRegs.ADCRESULT4>>4;        //Uc,  ADCa2

	Ach[3][SamCounter] = (long)AdcRegs.ADCRESULT1>>4;       //I1a, ADCb0
	Ach[4][SamCounter] = (long)AdcRegs.ADCRESULT3>>4;       //I1b, ADCb1
	Ach[5][SamCounter] = (long)AdcRegs.ADCRESULT5>>4;       //I1c, ADCb2
	Ach[6][SamCounter] = (long)AdcRegs.ADCRESULT7>>4;       //I0, ADCb3
	
	Ach[7][SamCounter] = (long)AdcRegs.ADCRESULT6;        //I2a,  ADCa3
	Ach[8][SamCounter] = (long)AdcRegs.ADCRESULT8;        //I2b, ADCa4
	Ach[9][SamCounter] = (long)AdcRegs.ADCRESULT10;       //I2c, ADCa5

	Ach[10][SamCounter] = (long)AdcRegs.ADCRESULT12;       //5v, ADCa6
	Ach[11][SamCounter] = (long)AdcRegs.ADCRESULT14;       //temperature, ADCa7
	
	Ach[12][SamCounter] = (long)AdcRegs.ADCRESULT9;       //power moniter, ADCb4
	Ach[13][SamCounter] = (long)AdcRegs.ADCRESULT11;       //AGND , ADCb5

	SamCounter++;
	if(SamCounter >= SAMPLE_NUM)
	{
		if( cePin.capGood > 0)
		    EvbRegs.T4CON.bit.TENABLE=0; //disable timer to start ADC
		
		SamCounter = 0;

		wst.enaSample =0;
		wst.bCal = 1;
	}	
	
	PieCtrlRegs.PIEACK.bit.ACK1=1;		//清外围模块中断允许标志,第一组
	AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;	//clear ADC interrupt flag
	EINT;	
}


//================ NO MORE ============================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -