在 STM32F103C8T6 中,CAN1 和 CAN2 的接收中断确实会共享同一个中断向量 USB_LP_CAN1_RX0_IRQn。这是因为 CAN2 是 CAN1 的从机,它们的接收中断是共享的。
1. 中断共享的原因
CAN2 是 CAN1 的从机:
在 STM32F103 系列中,CAN2 是 CAN1 的从机,因此它们的中断是共享的。
CAN1 和 CAN2 的接收中断共用同一个中断向量 USB_LP_CAN1_RX0_IRQn。
中断标志区分:
在中断服务函数中,需要通过检查中断标志来区分是 CAN1 还是 CAN2 触发了中断。
2. 中断服务函数的实现
void USB_LP_CAN1_RX0_IRQHandler(void)
{
// 检查 CAN1 的中断标志
if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET)
{
CanRxMsg RxMessage;
// 读取 CAN1 接收到的消息
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
// 处理 CAN1 接收到的消息
// ...
// 清除 CAN1 的中断标志
CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
}
// 检查 CAN2 的中断标志
if (CAN_GetITStatus(CAN2, CAN_IT_FMP0) != RESET)
{
CanRxMsg RxMessage;
// 读取 CAN2 接收到的消息
CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);
// 处理 CAN2 接收到的消息
// ...
// 清除 CAN2 的中断标志
CAN_ClearITPendingBit(CAN2, CAN_IT_FMP0);
}
}
3. 关键点说明
1.中断标志检查:
在中断服务函数中,首先检查 CAN1 的中断标志,然后检查 CAN2 的中断标志。
使用 CAN_GetITStatus 函数检查中断标志。
2.清除中断标志:
在处理完中断后,必须清除相应的中断标志,否则会重复进入中断。
使用 CAN_ClearITPendingBit 函数清除中断标志。
3.中断优先级:
如果同时启用了 CAN1 和 CAN2 的中断,需要确保它们的优先级设置合理。
4. 总结
CAN1 和 CAN2 共享中断向量:在 STM32F103C8T6 中,CAN1 和 CAN2 的接收中断共享同一个中断向量 USB_LP_CAN1_RX0_IRQn。
中断服务函数的实现:在中断服务函数中,需要检查 CAN1 和 CAN2 的中断标志,并分别处理。
清除中断标志:处理完中断后,必须清除相应的中断标志。