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

📄 interrupt.h

📁 使用MC9S12DP256写的CAN转串口程序。
💻 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 + -