在 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 的中断标志,并分别处理。

清除中断标志:处理完中断后,必须清除相应的中断标志。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐