STM32的hal库CAN开发指南

1.介绍

最近在学习CAN通讯协议的时候,发现许多文章在介绍协议时介绍的非常详细,可是在具体的MCU上进行应用时,就变得马马虎虎了。因此将自己的所学所想记录分享出来,抛砖引玉。
本文着重讲解CAN协议在stm32上面的应用,对于理论知识不做过多的讲解,
在这里推荐一篇博客,写的非常棒,将CAN讲解的深入浅出,强烈推荐,附上链接
博客1:https://blog.csdn.net/weixin_40528417/article/details/79476186博客网址

博客2:https://wlink.blog.csdn.net/article/details/116206252博客网址
建议先学习以上两篇博客的内容,在继续读接下来的内容。
在这里插入图片描述

2.前期的准备工作

主控MCU使用的是stm32f103c8t6,
编译器使用的是 sum32cubeide,
hal库版本使用的是最新的1.8.3,目前网上的许多资料使用的都是比较老的版本了,所以在实际使用时,会有些许不同。
同时也需要一个CAN协议的收发器,就类似于使用的usb转ttl模块,这个在网上可以买得到,就不做单独的介绍了,我使用的是致远电子的一款。

3.开始撸代码

3.1:时钟配置

CAN的时钟是挂载在APB1外设时钟上的,因此时钟的配置对CAN总线波特率的配置有一定影响。

STM32的hal库CAN开发指南
时钟配置图

3.2:CAN总线配置

STM32的hal库CAN开发指南
按照上图,将CAN总线配置成波特率500K,模式设置为正常模式。(如果你的APB1时钟配置的不是32m,波特率将不是500k,切记)。

STM32的hal库CAN开发指南
不要忘记了,也要打开CAN总线的接受中断,因为我们要完成一个完整的收发收发实验。

记得也要打开一个串口,用来观察我们收发的数据。关于使用串口,与本文无关,就不在此赘述了。

3.4:发送数据

使用CAN进行发数据比较简单,在cubeide生成的工程基础上进行简单修改即可。
第一步:使用**HAL_CAN_Start()**函数 ,使能CAN,
第二步:CAN_TxHeaderTypeDef CAN_tx;配置发送数据的ID,数据等内容。
第三步:使用 **HAL_CAN_AddTxMessage()**函数发送数据

CAN_TxHeaderTypeDef CAN_tx;//发送数据结构体
uint8_t tx_data[]={3,4,5,6,43,54,56,67};//待发送的数据
uint32_t tx_mailbox;//配置发送邮箱,定义一个变量就行,不用赋值
uint32_t std_id=0x601;//配置发送id

MX_CAN_Init(); //CAN初始化

HAL_CAN_Start(&hcan);//打开CAN
  CAN_tx.DLC=8; //发送数据长度
  CAN_tx.StdId=std_id;//发送数据的ID
  CAN_tx.IDE=CAN_ID_STD;//标准帧
  CAN_tx.TransmitGlobalTime=DISABLE;
  CAN_tx.RTR=CAN_RTR_DATA;//数据帧
  
  HAL_CAN_AddTxMessage(&hcan,&CAN_tx,tx_data,&tx_mailbox);//发送数据

代码如上图,为了看起来简洁,我将其他部分进行了省略,在实际使用时,按照这个顺序就能正常的发送数据了。
STM32的hal库CAN开发指南
上图为电脑上位机的显示,可以看到接受到了正确的数据,注意ID,就是我们在程序中配置的发送ID,0x601。
到这一步,就可以实现CAN的发送数据了。

结束

因为这篇博客是我上班的时候写的,而马上就要下班了,所以CAN的接受数据,我只能下次补上了。
谢谢观看 。

上一篇:bfs搜索


下一篇:Asp.Net Mvc自定义控件之树形结构数据生成表格 - WPF特工队内部资料