【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF4xx+数据发送和接收+中断接收方式+基础样例2】
- 1、概述
- 2、实验环境
- 3.1 问题描述
- 3.2 问题已解
- 4、自我尝试与努力
- (1)在网上查照相关配置文章,进行配置对比。
- (2)对比st的官方样例例程。
- (3)请教大佬,帮忙查看代码和调试。
- (4)总之,在STM32F1上能想的就都想过了。
- 5、后期自己学习提升-暂时定因
- (1)union联合
- (2)平时可能会遇到 “classic CAN” ,”SLcan“,”BXCAN“和”FDCAN“,所代表的含义
- (3)通过调试的方式,可以知道代码一步一步执行到哪里
- (4)如果怀疑使用的hal库有问题,可以注释掉其它函数,只调hal库,来分析问题。
- 6、实验说明
- 7、实验过程-STM32F4-中断实验
- (1)新建工程,基础配置。
- (2)配置can前,先配置系统时钟。
- (3)加入代码段-发送部分-共四步。
- (1)printf打印串口
- (2)讲发送函数进行封装成一个函数
- (3)can启动函数-start函数
- (4)调用发送函数-发送
- (4)加入代码段-接收部分。
- (1)加入筛选器函数和中断初始化
- (2)回调函数加入接收函数-收到指定数组
- (3)main的while循环运行,并打印信息。
- 7、代码连接
- 8、细节部分
- 9、总结
)
1、概述
本次实验我们继续上一篇,进行can下位机相关实验,我一直在尝试使用STM32F1xx进行can的中断接收,但是一直未能成功,但是在STM32F4xx就成功了,这就很奇怪,多次尝试,一直也没能成功,看起来是hal库有问题,具体问题我会在下面说,这里也会说在STM32F4上成功的样例
2、实验环境
本次实验环境实是在两个环境下,如下,请根据自己的环境选择对应开发板。
(1)软件环境:STM32cubeIDE 1.8.0
(2)硬件芯片:STM32F103VET6(野火:指南者)
(3)硬件芯片:STM32F407ZET6(正点原子:探索者)
(4)其它硬件:j-link or st-link , 串口转usb转换器,can卡,开发板。
(5)特殊硬件:STM32F103VET6(野火:指南者)这款开发板,是没有can转换芯片的,所以我们自己需要弄一个,而STM32F407ZET6(正点原子:探索者)这款,是有的,可以不用外接,如下需要买的话,可以参照正点原子F4的can芯片SIT1050T,或者某宝淘一个类似的。
下图所示硬件截图
3.1 问题描述
最近开始调试时候,按照网上相关文章,配置STM32F1xx的can,并且加入相关代码后,发现无论如何就是不运行,后来使用STM32F4xx配置can,发现可以运行,F4类似的方式,去配置F1的can,还是收不到任何东西,后来在回调函数加入串口打印,发现死在了can中断里,如下图所示。
目前问题是:在hal库,软件STM32cubeIDE下,STM32F1的can无法出中断,也无法获得数据。
3.2 问题已解
https://blog.csdn.net/qq_22146161/article/details/131234569?spm=1001.2014.3001.5501
4、自我尝试与努力
(1)在网上查照相关配置文章,进行配置对比。
在网上找了很多文章,进行配置的对比,从开始不熟悉配置,现在基本能背下来了,配置差不多大同小异,均在初始化MX_CAN_Init();这个初始化函数内,都调试过,均无法在STM32F1上,成功收到数据。
(2)对比st的官方样例例程。
如下图,如果你是默认安装路径的话,那么在如下路径,能够找到官方的样例,对比样例后,我发现配置也没有什么不同,改成和官方一样,也无法解决,STM32F1上,中断接收,说啥就是不好使。
后来想着不用IDE软件也行,用KEIL软件,最后能实现can中断接收,也可以接受,结果加了串口代码,各种报错,有点头大,所以就没继续弄。
(3)请教大佬,帮忙查看代码和调试。
工作的原因,有机会请教大佬,甚至请教原厂的人,ST原厂回复说,查找对比官方样例,让进行对比。
(1)在大佬协助下吧,进行在线仿真调试,发现死在can中断内,如果请中断标志位,确实能出去,但是数据无法接收到。
(2)后来有改写hal库下的HAL_CAN_Init(&hcan);内部内容,让其判定通过,发现确实收到数据了,但是数据不对。
如下图,函数所在位置。
如下代码截图,将HAL_CAN_Init(&hcan)内代码复制过来,进入函数后,我们能学习到很多东西
(1)在开始的时候,函数做了很多赋值,来读取标志什么的。
(2)中间要进入哪里,其实是做判定,那个判定对了就进哪个。
(3)如下截图,我们也能知道,为啥进的是这个HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);//中断接收回调函数,一步步执行的话,你会发现判定最终会进入这里,这样我们重写这个回调函数,在这个回调函数取数据才有意义。
(4)总之,在STM32F1上能想的就都想过了。
5、后期自己学习提升-暂时定因
在上一篇中,我们说到有些东西需要自己了解的,作为嵌入式工程师或者电子相关专业学习者,这些日常积累,是必不可少的,这里填补上这些坑,另外就是最近chatGPT也火了一阵,这个作为了解知识的工具还是挺好用的。
- 在看他人代码过程中,发现了一种叫union,联合体的东西,也是需要提升的,很值得学习。
- 通过调试的方式,可以知道代码一步一步执行到哪里,我也很久不这么调试了。
- 如果怀疑使用的hal库有问题,可以注释掉其它函数,只调hal库,来分析问题。
- 平时可能会遇到 “classic CAN” ,”SLcan“,”BXCAN“和”FDCAN“,所代表的含义。
(1)union联合
以下来自GPT的解答,自己之前也查过一些资料,觉得讲的还可以。
(2)平时可能会遇到 “classic CAN” ,”SLcan“,”BXCAN“和”FDCAN“,所代表的含义
对此,我也直接询问ChatGPT,它可以快速帮助我们了解一些概念。
(3)通过调试的方式,可以知道代码一步一步执行到哪里
有段时间没这样调试了,快忘记了,不过这样的好处是,可以知道代码运行到哪里了,记得之前调试灯带时候,通过一步步调试,知道当时使用的hal库缺少部分代码。
本次也是通过一步一步执行,才知道在STM32F1的can上,不断在死循环在can中断函数里。
(4)如果怀疑使用的hal库有问题,可以注释掉其它函数,只调hal库,来分析问题。
后续通过定义一个变量,来接收反馈hal的返回值,可以辅助帮忙定位问题,另外一方面,尝试直接让接收判定通过,看看收到的数据,来判定是否正确。
后来才知道是HAL_ERROR错误。
但如何查,还是有点一头雾水,暂时定位hal出现问题的,因为跟进大佬所说,STM32F103这款,也用了多少年了,出问题早发现了。
6、实验说明
如下图,我们本次实验,主要是测试can通信,但是can没通之前,我们其实不知道单片机是否跑起来了,所有我们需要uart3通过串口打印一些信息,这样我们就能知道单片机跑没跑起来。
以下出自本人灵魂画手,帮助你了解本实验。
7、实验过程-STM32F4-中断实验
这里只有F4例子,实在没看懂,直接去拿代码对比。
(1)新建工程,基础配置。
(1)配置RCC
(2)配置SYS
(3)配置uart1,在STM32F1配置是uart3,在STM32F4配置uart1,这点只是打印口不同,全部默认。
(2)配置can前,先配置系统时钟。
我们最终是通过APB1总线分频来的,那么需要先配置时钟,如下图。
这里配置后好,回去配置can相关设置。
因为用到了中断,这里别忘记配置中断。
另外之前调试F1时,有说,要选择以下选项的,但是我这边成功了,可以看到没有有勾选。
之后就是保存,生成代码就可以了
(3)加入代码段-发送部分-共四步。
(1)printf打印串口
之前文章:# 关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一
有具体写如果加入printf,这里就不细说了,直接上截图。
1、需要加入的库和定义
2、打印信息部分
(2)讲发送函数进行封装成一个函数
(3)can启动函数-start函数
(4)调用发送函数-发送
(4)加入代码段-接收部分。
(1)加入筛选器函数和中断初始化
(2)回调函数加入接收函数-收到指定数组
(3)main的while循环运行,并打印信息。
7、代码连接
F1未成功代码链接:
https://download.csdn.net/download/qq_22146161/87798132
以下为实验截图:
F4成功代码链接:https://download.csdn.net/download/qq_22146161/87798146
实验结果截图:
8、细节部分
(1)中断接收,是不需要匹配ID,如实验结果,自己想输入什么就输入什么ID
(2)因为要连接的器件比较多,极有可能,串口发现没数据了,can收不到数据了,这些情况,建议多检查硬件连接,我在实验过程中,还出现硬件连接断联情况,这点还是要注意的。
另外就是注意软件上,要点接收,自己有次忘记点这个接收了,查了半天硬件。
(3)在STM32F1和STM32F4下,生成代码结构体,命名不太一样。
如下图,在F4中,命名为hcan1,因为还有个hcan2,而F1中,只有hcan这样一个。
(4)在写这篇文章时看到F4在这个文件下,有这样两行代码,想着是不是F1里没有,
于是在F1下进行尝试,如下图,发现还是不行。
(5)根据大佬指导,尝试如下图地方,进行勾选的,最后也尝试了,没有成功。
(6)我用网上工具对比了F1和F4中断函数,完全一致。
F1和F4除了进入函数名不一样外,但这不是影响因素。
(7)根据大佬给到资料,发现F1内部有can1和can2,这个应该是一主一从,不是F4的两个can
(8)上传的F4代码编译后,会报错。
这块确实不小心多打了一个字母,已经更正,如还是会报错,那么自己手打改下吧,如果没报错,就是我已经更新了代码。
9、总结
我尽我所能,尝试所有可能,如今也能调通,我虽然失败了,但是这样情况,应该不是自己能力问题,而没想到。
不过确实没显得F1竟然调不通,这块后续再说吧,F4毕竟通了。