MATLAB&STM32CubeMX联合开发系列——不用手写一行代码就能实现CAN通讯

从第一次搭建好MATLAB和STM32CubeMX的联合开发环境有一段时间了,之前已经发布了两个实例分享,对这个话题比较感兴趣的朋友还比较多,所以就把最近在调试的CAN通讯的实例也和大家分享一下,后续会针对这个系列不断的更新,有喜欢的小伙伴可以关注哦!

我这里也把之前分享的两篇文章的链接放在这里,因为第一篇文章中花费大量的篇幅介绍环境的搭建,对刚刚了解这个的朋友比较有帮助

萧尘:手把手教你从零开始使用Matlab联合STM32CubeMX以及Keil开发一个STM32的简单程序-LED循环点亮

萧尘:Matlab迭代STM32的程序竟然如此奇妙 - 使用Matlab模型实现STM32串口收发程序

如何需要搭建环境的小伙伴可以去看第一篇文章哦,这里就不在赘述环境搭建的问题了,会直接使用之前已经搭建好的环境。

CAN通讯的配置

这里我们的配置,都是基于STM32CubeMX软件进行的图形化配置,非常的直观。

还是以我手中的开发板为例,通过原理图可以看到

需要配置的PIN脚为PA11和PA12,我这个开发板的MCU也只有这一组CAN可以使用

配置完成之后如下:

PIN脚配置完成之后,需要再配置一些参数

小编手中的开发板的MCU只有一组Master CAN,所以CAN的模式需要配置为Master

然后,再进行如下参数的配置,先附上参数设置

在参数设置部分,第一个主要的部分Bit Timings Parameters,是决定了CAN的通讯速率的,我们知道通常情况下CAN可以有多种不同的速率,125k,250k,500k,1M等等,具体使用哪一个就是由这一部分的参数决定的,可以根据自己的需要进行设置,计算的方法如下:

以我的这个参数设置为例:

CAN的总线时钟是36M的

这里选用的时钟分频系数是9,所以分频之后的周期就是Tq = 9/36000000

配置的TBS1 为 5个Tq, TBS2 为2个Tq

所以正常的位时间为 8个Tq,即 8 * 9/36000000

那么波特率 = 36000000/(8*9) = 500k

如果需要调整为其它的波特率,只需要根据这个计算方法调整对应的三个数值就可以了。

第二个主要的部分Basic parameters

主要是一些模式的使能,根据需要选择就可以了,主要和你的应用相关,这里就不做介绍了,因为小编也没细致的去分析每个参数对应的具体区别

第三个主要部分Advanced Paramaters

这个是用来设置CAN的模式,一般来说CAN可以分为四个模式,如这一项参数选项所示

正常模式 - 正常的收发CAN消息

环回模式 - 正常发送的消息会直接再回到接收端,同时也会将数据发出,但是不接收外部数据

静默模式 - 不发送往外发送消息,只接收消息

静默环回模式 - 不往外发送消息,也不接收外部的消息,只在内部由发送端到接收端

这里为了方便测试,我们将其设置为环回模式,根据原理我们可以看出,外部不需要连接CAN通讯的设备就可以测试CAN是否工作了

配置的最后一部分,中断配置

大家可以看到,我这里没有使用中断发送也没有使用中断接收,通常情况下我们会使用中断来完成,但是这里使用中断的配置一直工作不正常,暂时还没有找到原因,所以就没有使用中断了,使用的是查询模式,这个在后面建立MATLAB模型的时候会再次提到,这也是小编在这次调试的时候遇到的最大的一个坑,不知道是不是和工具有关

到此,图形化配置的工作就结束了

还是和之前一样,模型只需要建立好就可以了

暂时不要再STM32CubeMX里面生成代码
暂时不要再STM32CubeMX里面生成代码
暂时不要再STM32CubeMX里面生成代码

MATLAB模型建立

需要实现的功能:封装一个简单的CAN的message,当检测到按键按下的时候将消息发出,然后通过CAN模块读取发出的消息,再把读到的CAN的message的数据通过串口发送到上位机。

注意:这里是基于之前的工程直接开始的,如果之前没有工程的话,步骤会复杂一些,参看以前的文章,文章开头的部分添加了链接,可以回去查看

调用CAN pack的模块,路径如下:

双击打开CAN Pack的属性设置,设置属性如下

输入数据的类型选择raw value,这样比较方便的输入一个数据就可以了,如果是信号或者dbc文件的话,相对比较麻烦,在做真正的工程的时候肯定是需要的,这里我们只做简单的示例,就不使用这么复杂的了哈

设置好之后,在CAN Pack的输入端添加一个自由计数的模块

然后CAN Pack的右侧出来的就是一个CAN的message了,直接传递给一个STM32的CAN Send模块就可以了,如下所示

将这一部分放置到一个条件模块内,因为我们需要通过按键出发CAN消息的发送,这里需要使用条件模块,设置如下:

左上角是一个条件判断,而它的输入就是来自于按键模块的信号

整体的逻辑框图如下:

CAN消息的发送就设置完成了,下一步,设置接收的过滤以及接收模式

CAN filter这个话题比较大,不是三言两语可以解释清楚的,也不属于本文的讨论话题,就不多说了,有兴趣的以后可以再聊,这里你也可以不设置,所有的都接受也可以,毕竟简单的测试,没有比较多的消息,不过滤也可以的

接收模式,我们设置为查询模式,需要调用这个模块

大家可以看到,这里显示有个Polling,代表的就是查询模式,它也可以设置为中断模式

但是,小编尝试了很久,也没有设置成功,help文档说需要再STM32CubeMX里面配置好,可是找了许久,依然是没有找到解决方法,这就是为什么前面我们提到没有设置中断的原因,如果哪位朋友知道原因还望分享一下!

下一步,建立CAN数据接收的模型

总体模型如下

当CAN的状态ready以及CAN接收数据的状态Ready之后,进入右下脚的逻辑框图执行,右下脚的逻辑就是将CAN接收模块接收到的数据通过串口发送出去,模型如下:

注意,一定记得转换一下CAN接收到的数据格式再到串口发送模块,因为串口发送模块需要的是数据地址,不是直接的数据,否则的话模拟和编译会报错的

MATLAB模型建立完成

工程生成

MATLAB模型建立完成之后,就可以返回STM32CubeMX的工程了,将工程设置完成以后

就可以点击右上角的代码生成,生成keil的工程了

编译-下载-调试-验证

上一步生成工程之后,直接在keil中打开即可,你不需要更改任何的代码,直接对工程进行编译就行,理论上不应该报错

哦,忘记了一点,如果是第一次建立CAN的工程可能会出现错误,显示缺少三个文件

以及

还有

别怕。。。

这个STM32的Toolbox已经考虑到了,到你的STM32的MATLAB的toolbox的安装路径下去找如下的文件夹

这个文件夹下包含三个子文件夹,里面有你需要的三个文件

把缺少的文件添加到工程就行了

再次编译,应该就没有问题了,如果再有问题就得具体问题具体分析了

编译之后,下载到开发板进行测试

打开串口调试助手,观察收到的数据,在开发板上按一下按键

串口收到了两个字节的数据,因为我们的CAN的字节长度是两个字节

有的朋友可能会纳闷了,为啥是00 00 呢,有没有有效数据啊

这是因为我们封装CAN消息的时候输入的是自由计数,计数的起始值是0,所以第一次输出的数据是00 00

如果我们按住按键让它持续输出,输出的数据就是如下了:

每次输出两个字节,每次加一,时间间隔是0.5,这个也是自由计数的周期决定的

重新按键的时候,会再次从零开始计数

至此一个简单的工程就实现了,还是那句话,原理是一样的,可以通过简单的原理扩展复杂的功能,包括复杂的CAN消息,都是可以实现的

写在最后

这一期更新的太慢了,主要是最近工作有点忙,家里又有一点私事,包括上一次文章提到的会把这一系列内容也录制成视频,以便更全面一点的说明,打字确实太累了,也是因为时间的原因一直没有践行,不过这个工作还是会做的,最近抽空就开始录制,希望有兴趣的小伙伴多多交流哦!

共同学习,共同进步!

MATLABSTM32CubeMX联合开发系列——不用手写一行代码就能实现CAN通讯相关推荐

  1. android骰子游戏代码_真神器!不用手写一行代码就能做网站~

    点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货! 制作网站用什么,Dreamweaver 还是 Fireworks? 现在, ...

  2. 【Linux服务器开发系列】手写一个用户态网络协议栈,瞬间提升你网络功底丨netmap/dpdk的实现

    手写一个用户态网络协议栈,瞬间提升你网络功底 1. 网卡基础架构 2. netmap/dpdk的实现 3. 网络协议栈实战 [Linux服务器开发系列]手写一个用户态网络协议栈,瞬间提升你网络功底丨n ...

  3. 【Linux服务器开发系列】手写用户态协议栈,udpipeth数据包的封装,零拷贝的实现,柔性数组

    视频教你手写网络协议栈,保证大家能学会,耐心看 1. 用户态协议栈 2. udp/ip/eth数据包的封装 3. 零拷贝的实现 4. 零长数组(柔性数组) [Linux服务器开发系列]手写用户态协议栈 ...

  4. 太赞了,使用应用魔方 AppCube,我没有写一行代码就开发出了一款投票微信小程序

    低代码开发近些年非常火热,所谓低代码开发就是无需写太多的代码甚至有些简单应用不用写代码就能构建出一款应用,低代码开发平台非常多,其中我比较熟悉的就是华为的应用魔方 AppCube,本文就带着大家用应用 ...

  5. 安全系列之——手写JAVA加密、解密

    其他文章: 安全系列之--手写JAVA加密.解密 安全系列之--数据传输的完整性.私密性.源认证.不可否认性 安全系列之--主流Hash散列算法介绍和使用 安全系列之--RSA的公钥私钥有多少人能分的 ...

  6. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础-手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  7. 【效率】微软开源最强Python自动化神器!不用写一行代码!

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...

  8. [软件评测第十期]神器系列之手写计…

    [软件评测第十期]神器系列之手写计算器MyScript Calculator 作者:张羊羊 软件名称: MyScript Calculator 评测软件类型:工具软件.学习软件.生活实用类软件 软件简 ...

  9. 开会不用手写记录?来看看华为手机自带的这个功能

    开会不用手写记录?来看看华为手机自带的这个功能 在工作中,我们开会都要写会议纪要,相信很多人还在手写笔记.如果你用的是华为手机,其实它自带会议记录黑科技,10秒自动输出会议纪要. 1.首先我们在华为手 ...

最新文章

  1. leetcode算法题--盛最多水的容器
  2. 成功解决This DCH driver package is not compatible with the currently installed version of Windows. This
  3. Redis的RDB持久化和AOF持久化区别
  4. TreeView无限极分类绑定(从数据库读取数据源)
  5. 明明一样的程序为啥有的系统就报错有的就正常运行呢_SurfaceGo Android系统折腾笔记...
  6. linux 参数扩展,Shell Bash 中的参数扩展
  7. mysql修改字段一部份_mysql 修改字段中部分值
  8. 【Level 08】U05 Better option L6 Informative posts
  9. 关于vue如何解决数据渲染完成之前,dom树显示问题
  10. 架构学习----消息队列
  11. HTML(三)选择器--复杂选择器
  12. python if else格式_Python进阶之路 3.4.2 条件语句(if、else和elif)
  13. 华为悦盒EC6108V9教程
  14. 电子知识基础——电阻
  15. 实践一 网络攻防环境的搭建
  16. 蓝桥杯2020年第十一届C/C++B组(第一次)省赛习题题解
  17. 直播已入下半场,秀场直播该何去何从?
  18. 开源月刊《HelloGitHub》第 62 期
  19. wpf拖拽图片,滚轮放大缩小
  20. IOS端使用WebRTC实现一对一音视频通话

热门文章

  1. C++17之省略不必要的拷贝Copy Elision
  2. 大陆首款车量AI芯片 开启国产替代新纪元
  3. int? 是什么类型?和int有何区别
  4. 汇编语言:使用汇编程序计算2的8次方
  5. c++逆天改命进阶--哈希表
  6. iOS最全打包IPA教程
  7. Get Window Titles关键字——获取当前已经打开的浏览器窗口的所有Title
  8. 针对车载系统相关的功能分析(车载OS、芯片、导航、DC、总线系统等)
  9. r8168网卡在同方超翔z8307机器V10版本无法上网问题
  10. 硬盘坏了!!!!!!