【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF1xx和STMF4xx+数据发送和接收+轮询接收方式+基础样例(1)】

news2024/11/25 20:55:26

【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样例确实挺简单的,所以完成实验后,是需要回来补知识的,而且在这其中,他人指导的知识,也值得记录下来。

  1. 在看他人代码过程中,我发现了一种叫union,联合体的东西,也是需要提升的,很值得学习。
  2. 通过调试的方式,可以知道代码一步一步执行到哪里,我也很久不这么调试了。
  3. 如果怀疑使用的hal库有问题,可以注释掉其它函数,只调hal库,来分析问题。
  4. 平时可能会遇到 “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库,调试啥的都不行,不过这块下篇会写下,也算是做个记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell编程——Here Document免交互与Expect(免交互,高效率)

shell编程——Here Document免交互与Expect(免交互,高效率) 一、Here Document免交互概述二、Here Document常规用法1、免交互方式实现对行数地统计2、通过read/tee命令接受输入并打印3、通过passwd给用户设置密码4、支持变量替换5、整体赋值…

K8S基础操作之命令篇

目录 第一章.陈述式资源管理 1.1陈述式资源管理方法 1.2.基本命令查看信息 1.3.K8S管理操作分为2大类 1.4.数据网络端口访问流程 第二章.基本信息查看 2.1.命令格式 2.2.命令 2.3.项目的生命周期 第三章.service 3.1.概述 3.2.service 的 type 类型 3.3 headless …

神级指标DMI魔改免费公开!在宽基指数上也可以收获40倍收益,每年都在创新高!

一、写在前头 今天,我们要讲的DMI实际上是一组指标,它由表示多空方向的PDI、MDI以及表示趋势强度的ADX、ADXR共四条线组成。在正式开讲之前,我们先聊几句近期的行情。 上周我们根据量化策略提示了一些板块的机会,其中有一些已经开始有所表现。比如今天涨幅前十的板块中,…

【python笔记】可变对象和不可变对象

前言 在python中,一切事物皆是对象,变量是对象在内存中的存储和地址的抽象。类型也是属于对象的,而不是变量。变量和对象是分离的,对象是内存中储存数据的实体,变量则是指向对象的指针。 “”(赋值号)是将右侧对象的内…

网络编程与netty

目录 NIO 网络编程Buffer(缓冲区)Channel(通道)Selector(选择器)SelectionKey 零拷贝原生NIO存在的问题 线程模型传统阻塞 I/O 服务模型Reactor 模式单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程…

RabbitMQ养成记 (3.MQ的简单工作模式 和 Pub/sub 订阅模式)

上一篇是一个简单的helloworld。 我们直接发直接收 这种是最简单的。 下面我们再来接触更加复杂一点: 简单工作模式 work queues 工作队列模式: 这里注意 这里的消息 对两个消费者 c1 c2来说是竞争关系 而不是等份分发关系, 就像两个线程…

[山海关crypto 训练营 day10]

日常鼓励自己:别抱怨努力的苦,那是你去看世界的路。 最近几天一直忙着项目的结项答辩,今天终于是搞完了,得到了老师们的一致好评,最近几天的努力也没白费!现在可以愉快刷题了,先复现下LiteCtf的…

c++核心知识—文件操作

目录 一、文件操作 1、文本文件 2、二进制文件 一、文件操作 文件操作头文件&#xff1a;<fstream> 操作文件的三大流&#xff1a; 1、ofstream&#xff1a;写操作 2、ifstream&#xff1a;读操作 3、fstream&#xff1a;读写操作 1、文本文件 写文件 步骤&…

【数据结构】-学习链表所需要的预备知识

知识点收集于网络&#xff0c;我会加以总结&#xff0c;如果把预备知识学好了。那么后面的操作就不难了 用节或者结都可以&#xff0c;不要在意字的差别 目录 一、头指针与头结点的概念 二、链表带头结点和不带头节点的区别 三、八大链表类型&#xff1a; 四、链表节点为…

unity制作幽灵猎手射击游戏

文章目录 介绍人物向着鼠标点击的位置跑动、旋转lerp函数让摄像机平滑跟随敌人导航敌人攻击发射子弹攻击敌人玩家健康敌人健康分数显示刷怪笼游戏结束动画 介绍 玩家鼠标控制人物转向 玩家鼠标点击控制光线发射的终点 玩家受到伤害屏幕闪红 有三个怪物生成点 玩家射杀敌人获得分…

linux-项目部署软件安装

安装jdk 操作步骤&#xff1a; 1、使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux jdk-8u171-linux-x64.tar.gz 2、解压安装包&#xff0c;命令为tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local 3、配置环境变量&#xff0c;使用vim命令修改/etc/profile文…

【JavaWeb】-- Filter、Listener、Ajax、Vue

文章目录 Filter1.概述2.快速入门2.1 开发步骤2.2 代码演示 3.Filter执行流程4. Filter拦截路径配置5.过滤器链5.1 概述5.2 代码演示5.3 问题 Listener1.概述2. 分类3.代码演示 Ajax1.概述1.1作用1.2 同步和异步 2.快速入门2.1 服务端实现2.2 客户端实现2.3 测试 3.axios3.1 基…

“Shell“Awk命令

文章目录 一.Awk二.Awk按行输出文本三.Awk按字段输出文本四.通过管道&#xff0c;双引号调用shell命令五.总结&#xff1a; 一.Awk Awk的工作原理&#xff1a; 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&a…

康耐视智能相机IS2000与三菱PLC走MC协议通讯设置详细步骤及案例详解

1.IS2000(SLMP扫描界面)设置如下: 控制器类型:PLC型号 IP地址:PLC地址 主机端口:16进制下的PLC通讯端口 2、IS2000设备寻址界面设置如下: 六大控制块存放区域根据PLC设定,偏移量及设备数可更改。3.打开GX WORKS软件,选择新建工程,点击“确定”,界面如下: 4.点击“连…

初识redis【redis的安装使用与卸载】

一.redis的概念 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。在redis官网中对redis的描述是这样的&#…

MADDPG-学习笔记(1)

文献链接&#xff1a;https://arxiv.org/abs/1706.02275 "Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments"&#xff08;作者&#xff1a;Lowe, Ryan等人&#xff0c;2017年&#xff09; 环境搭建&#xff1a;https://zhuanlan.zhihu.co…

【保姆级教程】Windows安装CUDA及cuDNN

Windows安装CUDA及cuDNN 前言1. 第一次安装CUDA2. 第N次安装CUDA 一、 CUDA1. 查询CUDA版本2. 下载CUDA3. 安装CUDA4. 配置CUDA环境变量5. 检查CUDA是否安装成功 二、 cuDNN1. cuDNN版本的查询及下载2. 安装cuDNN3. 配置cuDNN的环境变量4. 检查cuDNN是否安装成功 三、查询CUDA及…

Linux常见指令理解

查看 Linux 主机 ip 在终端下敲 ssh[ip] ip 为刚才看到的 ifconfig 结果. 如果网络畅通, 将会提示输入用户名密码. 输入即可正确登陆 XShell 下的复制粘贴 复制: ctrl insert (有的 insert 需要配合 fn 来按) 粘贴: shift insert ctrl c / ctrl v 是不行的. Linu…

【C语言刷题——Leetcode10道简单题】

✨作者&#xff1a;平凡的人1 ✨专栏&#xff1a;《小菜鸟爱刷题》 ✨一句话&#xff1a;凡是过往&#xff0c;皆为序章 ✨说明: 过去无可挽回&#xff0c; 未来可以改变 今天是考四六级的日子&#xff0c;不知道大家考得怎么样呀&#xff1f;(反正我是寄了&#xff0c;好多没明…

Vue CLI ref props mixin plugin scoped

3.2. ref 属性 ref被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09; 应用在html标签上获取的是真实DOM元素&#xff0c;应用在组件标签上获取的是组件实例对象vc使用方式 打标识&#xff1a;或获取&#xff1a;this.$refs.xxx <template> <di…