本例程采用的芯片是STM32F103RET6,其中CAN通信部分硬件电路连接如下图所示,CAN_P和CAN_N分别连接到芯片的PA11和PA12引脚上,PCB布线时,尽量走差分等长线。

stm32cubeMX问题_stm32cubeMX问题

 STM32CubeMX配置如下:

stm32cubeMX问题_单片机_02

stm32cubeMX问题_单片机_03

 

stm32cubeMX问题_嵌入式_04

时钟及下载方式根据个人的实际情况进行选择。CAN参数配置如下:

stm32cubeMX问题_嵌入式_05

stm32cubeMX问题_新版本_06

模式选择回环模式,并打开RX0中断(接收中断)。时钟配置如下:

stm32cubeMX问题_stm32cubeMX问题_07

 主要配置就这些,点击生成代码即可。main函数中主要代码如下:

stm32cubeMX问题_新版本_08

紫色框标注的部分是发送数据的帧头,新版本的发送数据函数跟老版本有差异,老版本的发送函数:

 CAN_Transmit(CAN1, &CanTxMessage);       //发送CAN报文

新版本的发送函数:

 HAL_CAN_AddTxMessage(&hcan,&Can_Tx,txdata,&pTxMailbox); //发送CAN报文

在本例中使用的是新版本的函数,目前网上多数的都是老版本的,新版本的教程很少,因此写这篇笔记的另一个目的也是方便大家查阅资料(因为目前使用STM32CubeMX生成的代码以及库文件都是新版本的)。

STM32CubeMX自动生成的代码中没有配置过滤器,因此过滤器需要手动配置,添加在初始化函数中。配置代码在can.c中,注意代码要添加在BEGIN和END之间,否则重新生成代码时,会被覆盖掉,所有自行添加的代码都要遵守这个原则。

stm32cubeMX问题_新版本_09

关于开启接收中断函数的说明,在这个函数中已经开启了中断,所以不需要再添加开启中断的代码。

stm32cubeMX问题_新版本_10

新版本的库文件,发送函数中,将帧头和数据合并到一个函数中了,while循环中不断发送数据,中断服务函数接收数据。

 

stm32cubeMX问题_stm32_11

 主函数中发送的数据,回环模式即自发自收。不需要借助外部的硬件。

stm32cubeMX问题_嵌入式_12

调试模式下查看接收的数据:

stm32cubeMX问题_单片机_13

接收与发送的数据一致,说明回环模式测试成功。