📄 interrupt.h
字号:
//实时中断历程
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void RTI_ISR(void)
{
//clear RTIF bit
CRGFLG = 0x80;
}
//串口0中断
interrupt void SCI0_ISR(void)
{
SCI_CMD = SCI0SR1; /* dummy read to clear flags */
SCI_CMD = SCI0DRL; /* data read */
// Write_To_SCI0_UCHAR_ASCII(SCI_CMD);
}
//串口0中断
interrupt void SCI1_ISR(void)
{
SCI_CMD = SCI1SR1; /* dummy read to clear flags */
SCI_CMD = SCI1DRL; /* data read */
// Write_To_SCI1_UCHAR_ASCII(SCI_CMD);
}
//CAN0接收中断
__interrupt void CAN0_Receive(void)
{
uchar Recv_index = 0;
uchar i = 0;
for(Recv_index=0;Recv_index<16;Recv_index++)//搜索空闲的缓冲区
{
if(!(frame_status & (0x0001<<Recv_index)))
break;
}
if(Recv_index == 16)//没有空闲的缓冲区
{
CAN0RFLG_RXF = 1;//接收完毕,写1清除中断位
if(RX_OK == 0x01)
Recv_buffer_overflow++;
return;
}
frame_status |= (0x0001<<Recv_index);
Recv_Frame[Recv_index].ExternFlag = CAN0RXIDR1_IDE;
if(CAN0RXIDR1_IDE == 1)
Recv_Frame[Recv_index].RemoteFlag = CAN0RXIDR3_RTR;
else
Recv_Frame[Recv_index].RemoteFlag = CAN0RXIDR1_SRR;
Recv_Frame[Recv_index].Data[0] = CAN0RXDSR0;
Recv_Frame[Recv_index].Data[1] = CAN0RXDSR1;
Recv_Frame[Recv_index].Data[2] = CAN0RXDSR2;
Recv_Frame[Recv_index].Data[3] = CAN0RXDSR3;
Recv_Frame[Recv_index].Data[4] = CAN0RXDSR4;
Recv_Frame[Recv_index].Data[5] = CAN0RXDSR5;
Recv_Frame[Recv_index].Data[6] = CAN0RXDSR6;
Recv_Frame[Recv_index].Data[7] = CAN0RXDSR7;
Recv_Frame[Recv_index].DataLen = 0x0F & CAN0RXDLR;
if(Recv_Frame[Recv_index].ExternFlag == 1)
{
Recv_Frame[Recv_index].ID = ( CAN0RXIDR3 & 0xFE)>>1;
Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR2 ))<<7;
Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR1 & 0x07))<<15;
Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR1 & 0xE0))<<13;
Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR0 ))<<21;
}
else
{
Recv_Frame[Recv_index].ID = ( CAN0RXIDR1 & 0xE0)>>5;
Recv_Frame[Recv_index].ID += ((unsigned long)( CAN0RXIDR0 ))<<3;
}
Recv_Frame[Recv_index].frame_status_OBJ = Recv_buffer_overflow;
CAN0RFLG_RXF = 1;//接收完毕,写1清除中断位
return;
}
//CAN0发送中断
__interrupt void CAN0_Transmit(void)
{
//发送中断禁止
CAN0TIER = 0x00;
//中断屏蔽
asm
{
sei;
}
//获得可用的发送缓冲区编号,取编号值最小的缓冲区
CAN0TBSEL = CAN0TFLG;
if( SendFrame.ExternFlag == 1 )
{
CAN0TXIDR3 = (SendFrame.ID & 0x0000007F)<<1;
CAN0TXIDR2 = (SendFrame.ID & 0x00007F80)>>7;
CAN0TXIDR1 = (SendFrame.ID & 0x00038000)>>15;
CAN0TXIDR1+= (SendFrame.ID & 0x001C0000)>>13;
CAN0TXIDR0 = (SendFrame.ID & 0x1FE00000)>>21;
CAN0TXIDR1_IDE = 1;
CAN0TXIDR1_SRR = 1;
if( SendFrame.RemoteFlag == 1 )
{
CAN0TXIDR3_RTR = 1;
}
else
{
CAN0TXIDR3_RTR = 0;
CAN0TXDSR0 = SendFrame.Data[0];
CAN0TXDSR1 = SendFrame.Data[1];
CAN0TXDSR2 = SendFrame.Data[2];
CAN0TXDSR3 = SendFrame.Data[3];
CAN0TXDSR4 = SendFrame.Data[4];
CAN0TXDSR5 = SendFrame.Data[5];
CAN0TXDSR6 = SendFrame.Data[6];
CAN0TXDSR7 = SendFrame.Data[7];
CAN0TXDLR = SendFrame.DataLen;
}
}
else
{
CAN0TXIDR1 = (SendFrame.ID & 0x0007)<<5;
CAN0TXIDR0 = (SendFrame.ID & 0x01F8)>>3;
CAN0TXIDR1_IDE = 0;
if( SendFrame.RemoteFlag == 1 )
{
CAN0TXIDR1_SRR = 1;
}
else
{
CAN0TXIDR1_SRR = 0;
CAN0TXDSR0 = SendFrame.Data[0];
CAN0TXDSR1 = SendFrame.Data[1];
CAN0TXDSR2 = SendFrame.Data[2];
CAN0TXDSR3 = SendFrame.Data[3];
CAN0TXDSR4 = SendFrame.Data[4];
CAN0TXDSR5 = SendFrame.Data[5];
CAN0TXDSR6 = SendFrame.Data[6];
CAN0TXDSR7 = SendFrame.Data[7];
CAN0TXDLR = SendFrame.DataLen;
}
}
//--------------------------------------------------------------------------
// 将发送缓冲区选择寄存器赋值给发送缓冲区标志寄存器
// 将自动将该缓冲区内的数据加入发送队列发送
//--------------------------------------------------------------------------
CAN0TFLG = CAN0TBSEL;
//清除中断屏蔽
asm
{
cli;
}
//中断返回
asm
{
rti;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -