【CAN卡通信的下位机-STM32cubeIDE-hal库+数据发送和接收+轮询接收方式+基础样例1】
- 1、概述
- 2、实验环境
- 3、自我总结与提升
- (1)道理学习了一堆,如何使用STM32进行can的收发的话,配置还是挺简单。
- (2)自己实现了can的收发后,要反过来,补充can想过知识,无论是硬件还是软件。
- (3)忘记can原理什么的,那么can样例确实挺简单的,所以完成实验后,是需要回来补知识的,而且在这其中,他人指导的知识,也值得记录下来。
- 4、先行了解
- (1)了解波特率计算方式
- (2)了解基础使用函数
- (3)了解筛选器
- (4)了解回调函数和中断函数
- (5)相关参考资料
- 5、效果展示
- 6、实验说明
- 7、实验过程-STM32Fxx
- (1)新建工程,基础配置。
- (2)配置can前,先配置系统时钟。
- (3)加入代码段-发送部分-共四步。
- (1)printf打印串口
- (2)讲发送函数进行封装成一个函数
- (3)can启动函数-start函数
- (4)调用发送函数-发送
- (4)加入代码段-接收部分。
- (1)加入筛选器函数
- (2)加入接收函数-仿照正点原子,需要对应ID匹配
- (3)main的while循环运行,并打印信息。
- 7、代码连接
- 8、细节部分
- 9、总结
)
1、概述
我总是喜欢以自己的方式,将所学的东西再说一遍,另外看网上的资料,虽然有给代码的,但是一般都不完整,实验的时候,问题一堆,所以个人写总结的时候,习惯性给出完成工程代码,这样也让我养成了自己先做测试实验,这样成功后,做好了以后自己也有底,要不然不通,你很难找到问题原因,所以参照我做过的实验,都请注意下,实验环境,和一些代码步骤,因为环境不一样,最后效果可能就是不出来。
本次实验是用 轮询接收的方式,下一篇会讲述中断的方式,另外在F1上使用中断方式的时候,遇到点问题,这点在看中断的时候,请注意~~!。
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,或者某宝淘一个类似的。
如下是使用野火F1开发板
3、自我总结与提升
(1)道理学习了一堆,如何使用STM32进行can的收发的话,配置还是挺简单。
(2)自己实现了can的收发后,要反过来,补充can想过知识,无论是硬件还是软件。
(3)忘记can原理什么的,那么can样例确实挺简单的,所以完成实验后,是需要回来补知识的,而且在这其中,他人指导的知识,也值得记录下来。
- 在看他人代码过程中,我发现了一种叫union,联合体的东西,也是需要提升的,很值得学习。
- 通过调试的方式,可以知道代码一步一步执行到哪里,我也很久不这么调试了。
- 如果怀疑使用的hal库有问题,可以注释掉其它函数,只调hal库,来分析问题。
- 平时可能会遇到 “classic CAN” ,”SLcan“,”BXCAN“和”FDCAN“,所代表的含义。
一些可能碰到的,使得自己提升的东西,值得记录下来,我会下面细节部分中,加以说明。
4、先行了解
关于can的一些基本知识,我就不再啰嗦说了,但是开始实验前,我们还是需要看些基础知识的,要对can有些常识,对STM32上的can有些常识,以下是我总结些,认为有必要知道的,并且在网上,一搜很多这样的资料。
(1)了解波特率计算方式
波特率计算式公式看起来挺复杂的,如下图,在网上查资料你会基本会看到这个图。
(1)但是我们说的尽量弄的简单点,简化这个过程,如下图是STM32F1上,先设置完时钟后,分到这块是36Mhz。
先配置个时钟后,我们回来配置can的波特率,如下图,到时候你把相应数填进去,就能得到想要的波特率。
(2)这里再举个例子,再F4上,时钟配置如下图,为42Mhz.
配置个时钟后,我们回来配置can的波特率,如下图,到时候你把相应数填进去,就能得到想要的波特率。
(2)了解基础使用函数
这里列出本次实验使用到函数,全部是跟can相关,或者本次实验用到的。
MX_CAN_Init(); //can初始化相关函数,生成后可以自己填写内容--自动生成
MX_USART3_UART_Init(); //串口3,用来打印数据,显示用的--自动生成
HAL_CAN_Init(&hcan); //can结构体初始化函数。--自动生成
HAL_CAN_ConfigFilter(&hcan,&sFileterConfig); //can筛选器初始化 需要自己填写
HAL_CAN_Start(&hcan); //can运行要start,start函数--需要自己填写
Can_Send_Msg(uint32_t id, uint8_t* msg,uint32_t len);//发送帧函数,仿照正点原子,需要自己填写
HAL_CAN_AddTxMessage(&hcan, &TxHeader, msg, &TxMailbox); //真正执行发送帧函数--需要自己填写
can_receive_msg(uint32_t id, uint8_t *buf);//循环接收函数,仿照正点原子,需要自己编写
HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0);// 仿照正点原子,需要自己添加
HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, buf);//获取数据,存在数值内。需要自己添加
HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);//中断接收回调函数
(3)了解筛选器
这段是需要自己添加的代码,软件不自动生成筛选器代码,因为是默认,所有我们是有啥就接收啥,不挑剔。
这段代码主要是MX_CAN_Init内添加的。
(4)了解回调函数和中断函数
使用中断接收,如果你只是想实现功能,那么不太需要了解,本次实验是“轮询接收方式”,先暂时不会涉及到这,但是你要是使用中断接收,那么会涉及的,而我在F1上,到发博文前,还没有解决,只是在F4上实现了中断接收,下篇博文会仔细讲。
(5)相关参考资料
1,这篇文档里,该说都说了,有底层结构,原理,回调,自己就不罗嗦了。
参考资料:https://blog.csdn.net/ooorczgc/article/details/103590250
2,这篇文章,我举得波特率是如何计算讲的挺好的。
参考资料:https://blog.csdn.net/qq_27329367/article/details/90442324
3,这篇文章,在最后有罗列每个函数功能,个人觉得挺好的。
参考资料:https://blog.csdn.net/weixin_41082463/article/details/104914371
4,这篇文章,在最后有罗列如果没有达到想要效果,可能原因,个人觉得挺好的。
参考资料:https://blog.csdn.net/qq_23313467/article/details/127131440?spm=1001.2014.3001.5502
5、效果展示
(1)如下图所示,是F1上循环模式,接收到数据,然后使用串口3进行打印。并且F1会给can卡发送数据,can也能给F1发送数据
注意:循环模式是仿照正点原子代码,做了ID匹配,发送时输入ID要为0xF1
(2)如下图所示,是F4上循环模式,接收到数据,然后使用串口3进行打印。并且F4会给can卡发送数据,can也能给F4发送数据
注意:循环模式是仿照正点原子代码,做了ID匹配,发送时输入ID要为0xF4
同时可以看到我们换了一个接收上位机软件,这个软件是用QT做的,后面会出个联合文章,敬请期待。
6、实验说明
如下图,我们本次实验,主要是测试can通信,但是can没通之前,我们其实不知道单片机是否跑起来了,所有我们需要uart3通过串口打印一些信息,这样我们就能知道单片机跑没跑起来。
以下出自本人灵魂画手,帮助你了解本实验。
7、实验过程-STM32Fxx
这里我拿F1举例子,F4基本类似,这里就不重复造轮子了,实在没看懂,直接去拿代码。
(1)新建工程,基础配置。
(1)配置RCC
(2)配置SYS
(3)配置uart3,在STM32F1配置是uart3,在STM32F4配置uart1,这点只是打印口不同,全部默认。
(2)配置can前,先配置系统时钟。
我们最终是通过APB1总线分频来的,那么需要先配置时钟,如下图。
这里配置后好,回去配置can相关设置。
之后就是保存,生成代码就可以了
注意,我们本次实验使用轮询,所以如下图,我们暂时不需要选择中断。
(3)加入代码段-发送部分-共四步。
(1)printf打印串口
之前文章:# 关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一
有具体写如果加入printf,这里就不细说了,直接上截图。
1、需要加入的库和定义
2、打印信息部分
(2)讲发送函数进行封装成一个函数
(3)can启动函数-start函数
(4)调用发送函数-发送
(4)加入代码段-接收部分。
(1)加入筛选器函数
(2)加入接收函数-仿照正点原子,需要对应ID匹配
(3)main的while循环运行,并打印信息。
7、代码连接
F1代码链接:https://download.csdn.net/download/qq_22146161/87790668
F4代码链接:https://download.csdn.net/download/qq_22146161/87790695
8、细节部分
(1)因为是仿照正点原子,接收的时候,要ID匹配,我后来复测忘了这个事情,导致F1不接收,所以使用时,还要注意的,F1的ID如下,还是要看下代码的。
F4的ID如下
(2)因为要连接的器件比较多,极有可能,串口发现没数据了,can收不到数据了,这些情况,建议多检查硬件连接,我在实验过程中,还出现硬件连接断联情况,这点还是要注意的。
9、总结
最近一直想尝试F1上can中断接收,但是一直没有成功,所以有点难搞,查了很多资料吧,深入看了hal库,调试啥的都不行,不过这块下篇会写下,也算是做个记录。