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

news2025/2/22 21:25:31

【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF4xx+数据发送和接收+中断接收方式+基础样例2】

  • 1、概述
  • 2、实验环境
  • 3、问题描述
  • 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、问题描述

最近开始调试时候,按照网上相关文章,配置STM32F1xx的can,并且加入相关代码后,发现无论如何就是不运行,后来使用STM32F4xx配置can,发现可以运行,F4类似的方式,去配置F1的can,还是收不到任何东西,后来在回调函数加入串口打印,发现死在了can中断里,如下图所示。

目前问题是:在hal库,软件STM32cubeIDE下,STM32F1的can无法出中断,也无法获得数据
在这里插入图片描述

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也火了一阵,这个作为了解知识的工具还是挺好用的。

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

9、总结

我尽我所能,尝试所有可能,如今也能调通,我虽然失败了,但是这样情况,应该不是自己能力问题,而没想到。
不过确实没显得F1竟然调不通,这块后续再说吧,F4毕竟通了。

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

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

相关文章

【数据结构】散列表(哈希表)

文章目录 前言一、什么是散列表二、什么是哈希函数三、下面简单介绍几种哈希函数四、冲突处理散列冲突的方法开放定址法再散列函数法公共溢出区法链地址法 五、代码实现1.哈希函数2.链表和哈希表的创建3.哈希表初始化3.从哈希表中根据key查找元素4.哈希表插入元素5.元素删除6.哈…

100天精通Python(可视化篇)——第85天:matplotlib绘制不同种类炫酷气泡图参数说明+代码实战(网格、自定义颜色、钟型、交互、打卡、动态气泡图)

文章目录 专栏导读1. 气泡图介绍1)介绍2)参数说明 2. 普通气泡图3. 网格气泡图4. 自定义气泡图颜色5. 不同颜色气泡图6. 钟型气泡图7. 交互气泡图8. 打卡气泡图9. 动态气泡图 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到…

实战打靶集锦-020-Tre

提示:本文记录了博主一次艰难又失败的提权经历 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.1.1 adminer.php4.1.2 /cms/目录4.1.3 /info.php页面4.1.4 nikto扫描4.1.5 dirb扫描4.1.6 登录Adminer 5. 提权5.1 系统信息枚举5.2 定时任务枚举5…

SocketTools 11在所有HTTP客户端组件支持

SocketTools 11在所有HTTP客户端组件支持 在所有HTTP客户端组件中添加了对HTTP/2.0协议的支持。 更新了TLS 1.2(及更高版本)和SSH 2.0的安全选项,以使用Microsoft Windows 11和Windows Server 2022中提供的密码套件。较旧、安全性较低的密码套件已被弃用&#xff0…

21级计组硬件实验三-八位串行加法器验证

问题1: 小明同学正在做【半加器、全加器与八位串行加法器实验】,他画好了电路图,但还有不少困难,现在他求助于你,请你帮他解决。 答:选A 注释:A是与门,B是或门,C是同…

【cmake】cmake 实现交叉编译

在PC上开发时,我们可以直接在PC端编译、链接、运行,但是到了嵌入式环境,由于嵌入式的设备资源(CPU、RAM)无法和PC端相比,如果项目比较复杂,很难甚至不可能在设备上编译。因此,我们一…

vue diff算法与虚拟dom知识整理(9) 手写patch递归子节点上树,用自己写的patch实现虚拟节点替换

上文 我们做到让一个文字虚拟节点上树 但子节点显然还 没有完成 那这次我们继续 递归的话 我们需要换个思路 我们将 src下的入口文件 index.js代码改成这样 import h from "./snabbdom/h"; import patch from "./snabbdom/patch";const container docum…

Apache Zeppelin系列教程第七篇——运行paragraph的整个流程分析

Zeppelin运行paragraph的整个流程分析 前文分别讲述了,JdbcInterpreter、Interpreter、Zengine的流程,本文来主要串联起来paragraph的整个流程 前端 首先前端部分点运行的时候是通过websocket向后端发送请求的zeppelin-web/src/components/websocket/…

swp协议-1

Swp接口是UICC和CLF(非接前端)之间的面向比特流,点到点通信的协议。CLF是主设备(master),UICC是从设备(slave)。图SWP数据传输虽然是单线协议,但是是全双工数字传输。 1 …

电商项目之海量操作日志的实现

文章目录 1 问题背景2 前言3 思考4 解决思路5 交互6 工作原理7 伪代码实现7.1 安装并配置Canal Server7.2 Canal客户端拉取MQ消息7.3 Canal数据的转换7.4 定制自己的业务逻辑 1 问题背景 有时候客户做了某些操作却不认账,咱们又拿不出证据;有时候客户将账…

入参校验1

文章目录 一、简介1、快速失败(Fail Fast) 二、单字段类入参校验三、JSON实体类校验1、注解解析2、案例1、简单校验2、分组校验3、嵌套校验4、集合校验5、自定义校验 四、相关1、源码文件2、参考地址 一、简介 1、快速失败(Fail Fast) Spring Validation 默认会校验完所有字段…

GPT-4的免费使用方法分享(续)

GPT-4的免费使用方法分享_我爱OJ的博客-CSDN博客 在这篇博客里,我介绍了一些ChatGPT的一些使用方法,但可能有一定的缺陷,有的需要魔法,所以,今天我就来亲测一下,关于ChatGPT的一些免费使用技巧 目录 镜像…

代码随想录算法训练营第九天|KMP算法

记录一下KMP算法,本文摘录自《代码随想录》和部分b站视频帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibiliKMP字符串匹配算法2_哔哩哔哩_bilibili KMP算法 主要应用:字…

牛客小白月赛65

题目链接 牛客小白月赛65 A-牛牛去购物(枚举)B-牛牛写情书(字符串)C-牛牛排队伍(模拟)D-牛牛取石子(博弈)E-牛牛的构造(构造,思维) A-牛牛去购物…

怎么免费使用 ChatGpt,实用!

最近发现了一个可以免费、轻松使用 ChatGpt 的方法,随即做个记录,留着备忘,以后想用也能随时找到方法。 但是不保证该方法永远有效,仅当下有限,做个记录罢了。 因为我使用的是 windows 自带的浏览器 Microsoft Edge &a…

Android--刷机与adb

目录 一、Android设备启动流程 二、刷机模式介绍 三、Windows命令行 四、adb介绍与配置 五、常用的adb命令 一、Android设备启动流程 Android就是Linux内核(Kernel)Java虚拟机(JVM) Android设备启动就分为两个阶段: Linux启动 1.启动电源以及系统启动&#…

详解c++STL—容器list

目录 1、list基本概念 1.1、概念描述 1.2、结点的组成 1.3、list的优点 1.4、list的缺点 1.5、总结 2、list构造函数 2.1、功能描述 2.2、函数原型 2.3、示例 3、list赋值和交换 3.1、功能描述 3.2、函数原型 3.3、示例 4、list大小操作 4.1、功能描述 4.2、函…

ChatGPT的前世今生——混沌初开

目录 ChatGPT的前世今生——混沌初开ChatCPT简介ChatCPT是什么?ChatCPT的火爆程度ChatCPT火爆的原因1、功能强大,应用范围广泛2、训练数据量大,模型效果好3、优秀的商业模式 OpenAI公司公司创始团队 总结公众号文章链接参考链接: …

03C++类与对象之运算符重载

文章目录 C类与对象之运算符重载与const成员运算符重载赋值运算符重载运算符重载 日期类的实现与运算符重载赋值运算符重载比较类运算符的重载二元运算符-的重载前置和后置重载 总体实现代码const成员const的好处1.防止程序员犯错2.提高代码的复用性 const 成员与函数重载规则 …

Qt文件系统源码分析—第三篇QDir

深度 本文主要分析Windows平台,Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次,再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…