此时在一般情况下函数的返回值有两种:
1、(挂起中断)0x0001~0x0020(即1~32);2、(状态中断)0x8000(即值:CAN_INT_INTID_STATUS)。
CAN_INT_STS_CAUSE返回控制器中断寄存器的值并表示中断产生的原因。如果原因是一个状态中断,那么它返回值是CAN_INT_INTID_STATUS。在这种情况下,应该使用CANStatusGet()函数读取状态寄存器。调用此函数读取状态寄存器也将会清除状态中断。如果返回的中断寄存器的值是1-32之间,那么即表示具有高优先级编号的报文对象正在挂起一个中断。通过使用CANIntClear()函数,或在一个接收到的报文情况下使用CANMessageGet()读取报文,都能清除报文对象中断。中断处理程序能再次读取中断状态,以确保在中断返回前清除全部挂起的中断。
中断处理代码如下:
void CANIntHandler(void)
{
unsigned long ulStatus;
ulStatus = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
if(ulStatus == CAN_INT_INTID_STATUS) //原因是状态中断
{
ulStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); / ulStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); //读取主控制器寄存器的值
/ //并清除状态中断
}
else if(ulStatus == 3) //原因是报文对象3的挂起中断,表明其报文接收已结束
{
CANIntClear(CAN0_BASE, 3) //清除这个挂起中断
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0x01);
SimpleDelay();
GPIOPinW GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0); //闪烁指示灯
}
else //其他不可预料引发的中断(通常不可能发生)
{
// Spurious interrupt handling can go here.
}
} |