【CAN卡通信的下位机 | 您所在的位置:网站首页 › n卡滤镜有时候用不了 › 【CAN卡通信的下位机 |
【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开发板 一些可能碰到的,使得自己提升的东西,值得记录下来,我会下面细节部分中,加以说明。 4、先行了解关于can的一些基本知识,我就不再啰嗦说了,但是开始实验前,我们还是需要看些基础知识的,要对can有些常识,对STM32上的can有些常识,以下是我总结些,认为有必要知道的,并且在网上,一搜很多这样的资料。 (1)了解波特率计算方式波特率计算式公式看起来挺复杂的,如下图,在网上查资料你会基本会看到这个图。 这里列出本次实验使用到函数,全部是跟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内添加的。 使用中断接收,如果你只是想实现功能,那么不太需要了解,本次实验是“轮询接收方式”,先暂时不会涉及到这,但是你要是使用中断接收,那么会涉及的,而我在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 如下图,我们本次实验,主要是测试can通信,但是can没通之前,我们其实不知道单片机是否跑起来了,所有我们需要uart3通过串口打印一些信息,这样我们就能知道单片机跑没跑起来。 以下出自本人灵魂画手,帮助你了解本实验。 这里我拿F1举例子,F4基本类似,这里就不重复造轮子了,实在没看懂,直接去拿代码。 (1)新建工程,基础配置。(1)配置RCC (2)配置SYS 我们最终是通过APB1总线分频来的,那么需要先配置时钟,如下图。 注意,我们本次实验使用轮询,所以如下图,我们暂时不需要选择中断。 之前文章:# 关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一 有具体写如果加入printf,这里就不细说了,直接上截图。 1、需要加入的库和定义 F1代码链接:https://download.csdn.net/download/qq_22146161/87790668 F4代码链接:https://download.csdn.net/download/qq_22146161/87790695 8、细节部分(1)因为是仿照正点原子,接收的时候,要ID匹配,我后来复测忘了这个事情,导致F1不接收,所以使用时,还要注意的,F1的ID如下,还是要看下代码的。 (2)因为要连接的器件比较多,极有可能,串口发现没数据了,can收不到数据了,这些情况,建议多检查硬件连接,我在实验过程中,还出现硬件连接断联情况,这点还是要注意的。 9、总结最近一直想尝试F1上can中断接收,但是一直没有成功,所以有点难搞,查了很多资料吧,深入看了hal库,调试啥的都不行,不过这块下篇会写下,也算是做个记录。 |
CopyRight 2018-2019 实验室设备网 版权所有 |