1.介绍

最近在学习CAN通讯协议的时候,发现许多文章在介绍协议时介绍的非常详细,可是在具体的MCU上进行应用时,就变得马马虎虎了。因此将自己的所学所想记录分享出来,抛砖引玉。
本文着重讲解CAN协议在stm32上面的应用,对于理论知识不做过多的讲解,

2.前期的准备工作

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

3.开始撸代码

3.1:时钟配置

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

stm32 hal库移植freemodbus stm32 hal库 can_数据


时钟配置图

3.2:CAN总线配置

stm32 hal库移植freemodbus stm32 hal库 can_时钟配置_02


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

stm32 hal库移植freemodbus stm32 hal库 can_ide_03


不要忘记了,也要打开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库移植freemodbus stm32 hal库 can_ide_04


上图为电脑上位机的显示,可以看到接受到了正确的数据,注意ID,就是我们在程序中配置的发送ID,0x601。

到这一步,就可以实现CAN的发送数据了。

结束

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


pgsql serial 创建索引

postgres简称为pgpostgres中的btree索引结构在pg中的btree特性postgresql-12-US.pdf 中 421 页11.2. Index Types PostgreSQL provides several index types: B-tree, Hash, GiST, SP-GiST, GIN and BRIN. Each index type uses a dif

1、SQL语言具有数据操作功能,SQL语言的一次查询的结果是一个___D___ A) 数据项 B) 记录 C) 元组 D) 表 2、如果学生表st是使用以下SQL语句创建的: CREATE TABLE st (sno CHAR(4) not null,sn CHAR(8),sex

--省-- IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[S_Province]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[S_Province]( [ProvinceID] [bigint] IDENT