MATLABSTM32CubeMX联合开发系列——无需手写一行代码就能实现CAN通信。 首次构建MATLAB和STM32CubeMX的共同开发环境已经有一段时间了。 之前发布和共享了两个实例,对这个话题感兴趣的朋友还很多,所以最近正在调试的CAN通信实例也和大家共享,今后将面向这个系列陆续公开
这里也把以前共享的两篇文章的链接放在这里。 因为第一篇文章花了很多篇幅介绍环境的构建,所以对刚知道这个的朋友很有帮助
PSD db :手把手教你使用MATLAB联合STM32CubeMX和Keil从零开始开发STM32的简单程序-LED循环点亮
psddb: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
因此,通常位时间为8TQ,即8 * 9/36000000
波特率=36000000/(8*9)=500k
如果需要调整到其他波特率,根据这种计算方法调整对应的三个数值即可。
第二个主要部分基本参数
主要是几种模式的启用,根据需要选择就可以了。 主要涉及你的应用,这里就不介绍了。 因为小编也没有仔细分析各参数对应的具体差异
第三个主要部分高级参数
这是用于配置CAN的模式,CAN一般分为四种模式,如此参数选项所示
正常模式-正常收发CAN消息
环回模式-正常发送的消息将直接返回到接收方,同时还会发送数据,但不会接收外部数据
静默模式-不向外部发送消息,仅接收消息
静默环回模式-内部仅从发送方向接收方发送消息,而不向外部发送消息或接收外部消息
这里为了便于测试,设定为环回模式,但从原理上可以看出,可以在不需要从外部连接到CAN通信的设备上测试CAN是否工作
构成的最后一部分,中断构成
正如你所看到的,我这里既没有使用中断发送,也没有使用中断接收。 通常使用中断进行,但这里使用中断的结构无法正常工作,暂时找不到原因,所以没有使用中断。 使用的是查询模式。 稍后在制作MATLAB模型时会再次提到这一点。 这也是小编在这次调试时遇到的最大漏洞,不知道是否和工具有关。
图形化配置的工作到此结束
和以前一样,建立模型就可以了
请勿在STM32CubeMX中生成代码
请勿在STM32CubeMX中生成代码
请勿在STM32CubeMX中生成代码
构建MATLAB模型所需的功能:封装简单的CAN消息,检测到按键时发送信息,读取CAN模块发送的信息,通过串口将读取的CAN消息数据发送到上位机。
注意:这里是根据前面的工程直接开始的。 如果之前没有工程的话,程序会变得复杂。 请参考前面的文章。 在文章的开头部分添加了链接。 你可以回去看
调用CAN pack的模块。 路径如下。
双击以打开CAN Pack属性设置,然后按如下方式设置属性
输入数据种类选择raw value,这样比较方便地输入一个数据就可以了。 对于信号和dbc文件,相对来说比较麻烦,做真正的工程的时候一定要。 这里只做简单的样品,不用这么复杂的
设定结束后,在CAN Pack的输入端子中追加自由计数的模块
然后,出现在CAN Pack右侧的是CAN的消息,直接传到1
个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消息,都是可以实现的
写在最后这一期更新的太慢了,主要是最近工作有点忙,家里又有一点私事,包括上一次文章提到的会把这一系列内容也录制成视频,以便更全面一点的说明,打字确实太累了,也是因为时间的原因一直没有践行,不过这个工作还是会做的,最近抽空就开始录制,希望有兴趣的小伙伴多多交流哦!
共同学习,共同进步!