【GL的烧脑之路总结(一):Cubemx创建CAN通信工程,无法进入CAN中断的原因 】
【GL的烧脑之路总结(一):Cubemx创建CAN通信工程,无法进入中断的原因 】
1,关于CAN的通信原理以及配置
网上已有大量可参考的博客、例程等,且这方面并不是GL想要表达的重点,故,不多加赘述!
以下是GL认为比较好的资料连接:
https://blog.****.net/anew_moon/article/details/85621123 (这是关于报文的理解)
https://blog.****.net/liuligui5200/article/details/79030676 (CAN的报文格式)
https://blog.****.net/u012587637/article/details/52032630 (过滤器、滤波屏蔽器配置总结、理解)
2,关于无法进入中断的原因
1,CAN的通信乃是利用“电压差”的方式进行的,如果提供的电压不够,将无法进行通讯,也就无法进入中断。
例子:我用cubemx配置波特率和中断,在程序中写好了滤波器、模式,一切都配置好了,然后接线(3.3V)开始试验,结果发送数据一定数量后会卡在
uint32_tHAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan)
这个函数上出不来,如下
我是怎么判断它卡在这里的呢?如下,LED灯一直闪烁,证明着发送邮箱始终是满的,证明着发送不成功!(别问我为什么不用dubug测试,问就是,太容易卡,退不出来,总得重新进入MDK,太烦了,可能是我电脑不太行吧!)
解决办法: 把提供给板子的电压换成5V,如此便可解决以上问题!(可能有烧友会说,板子本来就得用5V之类的问题,但我作为一个渣渣烧友,不太清楚这其中的道道,且从一开始就习惯用3.3V的电压驱动32单片机,串口、SPI之类的都能正常驱动,也没发现问题,不过这个CAN确实让我踩了个大坑,各位烧友请注意!)
2,利用cubemx创建CAN工程,它只会给你配置相关的io口、波特率、时钟之类,但不会给你初始化CAN1或CAN2滤波器配置,以及进行相关的使能!
例子:假定你在cubemx中配置好了一切,生成了工程,都没有问题,当只要你没有忽略使用一下任何一个函数,都会导致无法进入中断。
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig) //关于滤波器配置的。
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan)//开始
HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)//使能,若是不使能,那你只能发送,而无法利用中断接收。
看后总结
1,若使用CAN通信,需要5V电压作为支撑
2,若使用cubemx创建工程,则必须使用以上所提的三个函数,否则无法进入中断!