完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
MATLAB&STM32CubeMX联合开发系列——不用手写一行代码就能实现CAN通讯
从第一次搭建好MATLAB和STM32CubeMX的联合开发环境有一段时间了,之前已经发布了两个实例分享,对这个话题比较感兴趣的朋友还比较多,所以就把最近在调试的CAN通讯的实例也和大家分享一下,后续会针对这个系列不断的更新,有喜欢的小伙伴可以关注哦! 我这里也把之前分享的两篇文章的链接放在这里,因为第一篇文章中花费大量的篇幅介绍环境的搭建,对刚刚了解这个的朋友比较有帮助 如何需要搭建环境的小伙伴可以去看第一篇文章哦,这里就不在赘述环境搭建的问题了,会直接使用之前已经搭建好的环境。 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消息,都是可以实现的 写在最后 这一期更新的太慢了,主要是最近工作有点忙,家里又有一点私事,包括上一次文章提到的会把这一系列内容也录制成视频,以便更全面一点的说明,打字确实太累了,也是因为时间的原因一直没有践行,不过这个工作还是会做的,最近抽空就开始录制,希望有兴趣的小伙伴多多交流哦! 共同学习,共同进步! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:51 , Processed in 0.791991 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号