【CAN卡通信的下位机 您所在的位置:网站首页 n卡滤镜有时候用不了 【CAN卡通信的下位机

【CAN卡通信的下位机

2023-05-21 09:42| 来源: 网络整理| 查看: 265

【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库,调试啥的都不行,不过这块下篇会写下,也算是做个记录。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有