STM32勘误:CAN接收中断使用CAN1_RX0_IRQHandler还是USB_LP_CAN1_RX0_IRQHandler?
STM32勘误——CAN接收中断到底使用CAN1_RX0_IRQHandler还是USB_LP_CAN1_RX0_IRQHandler
最近测试新做的板子,使用了正点原子F407V3版本的HAL库例程代码(因为HAL库在更新,老版本的原子的例程使用的较老的HAL库)。其中CAN通信的中断接收出现了问题,原子例程中的用法为:
开启中断:HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
中断函数:void USB_LP_CAN1_RX0_IRQHandler(void);
但是编译错误,提示USB_LP_CAN1_RX0_IRQn
未定义,查看库文件确实没有定义(所以猜测原子并没有测试这个地方)。我改成了CAN1_RX0_IRQn
,编译成功,但是CAN接收就死机了。于是继续改成void CAN1_RX0_IRQHandler(void)
,这下数据接受正常了。
实际上我用Cubemx生成的代码里面,默认的就是使用CAN1_RX0_IRQn
和void CAN1_RX0_IRQHandler(void)
。(库版本是STM32Cube FW_F4 V1.26.0)。
查看了之前自己用的STM32Cube FW_F4 V1.4.0库时,同样用的CAN1_RX0_IRQn
和void CAN1_RX0_IRQHandler(void)
,完全就是正常的。
网上说由于PA11和PA12同时是USB引脚,所以CAN中断使用的是USB_LP_CAN1_RX0_IRQn
。但经过测试新老版本HAL库都不需要这样用,所以这个地方并不需要搞这么麻烦。评论区的高人知道真正原因的麻烦告知我哈,欢迎交流。