📄 interruptisr.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 + -