本例程采用的芯片是STM32F103RET6,其中CAN通信部分硬件电路连接如下图所示,CAN_P和CAN_N分别连接到芯片的PA11和PA12引脚上,PCB布线时,尽量走差分等长线。
STM32CubeMX配置如下:
时钟及下载方式根据个人的实际情况进行选择。CAN参数配置如下:
模式选择回环模式,并打开RX0中断(接收中断)。时钟配置如下:
主要配置就这些,点击生成代码即可。main函数中主要代码如下:
紫色框标注的部分是发送数据的帧头,新版本的发送数据函数跟老版本有差异,老版本的发送函数:
CAN_Transmit(CAN1, &CanTxMessage); //发送CAN报文
新版本的发送函数:
HAL_CAN_AddTxMessage(&hcan,&Can_Tx,txdata,&pTxMailbox); //发送CAN报文
在本例中使用的是新版本的函数,目前网上多数的都是老版本的,新版本的教程很少,因此写这篇笔记的另一个目的也是方便大家查阅资料(因为目前使用STM32CubeMX生成的代码以及库文件都是新版本的)。
STM32CubeMX自动生成的代码中没有配置过滤器,因此过滤器需要手动配置,添加在初始化函数中。配置代码在can.c中,注意代码要添加在BEGIN和END之间,否则重新生成代码时,会被覆盖掉,所有自行添加的代码都要遵守这个原则。
关于开启接收中断函数的说明,在这个函数中已经开启了中断,所以不需要再添加开启中断的代码。
新版本的库文件,发送函数中,将帧头和数据合并到一个函数中了,while循环中不断发送数据,中断服务函数接收数据。
主函数中发送的数据,回环模式即自发自收。不需要借助外部的硬件。
调试模式下查看接收的数据:
接收与发送的数据一致,说明回环模式测试成功。