cubemx+stm32f407+双Can通信

最近几天在用CUBEMX实现stm32f407zgt6的双can通讯,中间走了一些弯路,记录下来供需要的人参考借鉴,希望可以帮助大家节省开发周期。

准备工作:

一、硬件

使用启明高配版开发板,因为启明的板子上有两个can可以使用,在调试之前,需要先将can1_H连接can2_H,can1_L连接can2_L,并且需要将P15和P21跳线帽连接好。

cubemx+stm32f407+双Can通信_第1张图片

cubemx+stm32f407+双Can通信_第2张图片

二、软件工具

1.我使用的软件版本是CUBEMX4.27,使用的库为fw_f4_v1210。

cubemx+stm32f407+双Can通信_第3张图片

 

2.keil版本

cubemx+stm32f407+双Can通信_第4张图片

程序编写

 

can在网上有很多介绍,可以在网上搜索一些基础介绍,之前调试can主要是卡在了新的库包里对滤波器以及FIFO和回调函数的设置上出现一些问题。

一、cubemx设置

1.Pinout部分

使能RCC,CAN1,CAN2以及开发板的PE3,PE4,PG9,SYS可以选择SW模式。点亮灯主要是想在调试的时候使用方便

cubemx+stm32f407+双Can通信_第5张图片

cubemx+stm32f407+双Can通信_第6张图片

2.Clock Configuration,建议将系统时钟设置为168

cubemx+stm32f407+双Can通信_第7张图片

3.configuration设置

can1设置,波特率设置为500并勾选RX0中断

cubemx+stm32f407+双Can通信_第8张图片

cubemx+stm32f407+双Can通信_第9张图片

can2设置和can1相同

cubemx+stm32f407+双Can通信_第10张图片

cubemx+stm32f407+双Can通信_第11张图片

NVIC部分

cubemx+stm32f407+双Can通信_第12张图片

cubemx+stm32f407+双Can通信_第13张图片

点击生成代码

cubemx+stm32f407+双Can通信_第14张图片

建议勾选下图中选项,生成的代码各部分会更清晰

cubemx+stm32f407+双Can通信_第15张图片

因为使用的是MDK5,所以我勾选图中选项

cubemx+stm32f407+双Can通信_第16张图片

完成配置后生成代码

二、代码编写

点开工程目录中的MDK-ARM文件夹中的MDK工程

cubemx+stm32f407+双Can通信_第17张图片

用cubemx生成的代码是基础配置代码,里面一些具体的服务函数和配置仍需要我们添加,主要有以下几个部分

can.c部分。

 

 cubemx+stm32f407+双Can通信_第18张图片

添加接收和发送函数句柄

在can的初始化函数中添加对滤波器的配置,SlaveStartFilterBank为从过滤器配置,用来选择从过滤器的寄存器编号。当选择双can模式时,这个参数要跟can2的FilterBank一致。

以下是can1的滤波器配置

cubemx+stm32f407+双Can通信_第19张图片

以下是can2的配置,HAL_CAN_ConfigFilter的第一个参数可以是can1也可以是can2

cubemx+stm32f407+双Can通信_第20张图片

接下来编写两个发送函数CAN_TRANSMIT1和CAN_TRANSMIT2

以下是CAN_TRANSMIT1函数

cubemx+stm32f407+双Can通信_第21张图片

以下是CAN_TRANSMIT2,因为我想实现的是can2接收的数据在发回给can1,所以我将can2接收的数据在赋值给can1

cubemx+stm32f407+双Can通信_第22张图片

 

书写回调函数,因为我将can1和can2都绑定在FIFO0上,所以只写了一个回调函数(也可以将can1绑定FIFO0,can2绑定FIFO1,写两个回调函数)

cubemx+stm32f407+双Can通信_第23张图片

can.h部分

主要是声明几个结构体和两个函数

cubemx+stm32f407+双Can通信_第24张图片

 

 

main.c部分,调用传递函数即可

cubemx+stm32f407+双Can通信_第25张图片

 

到此,配置完成,下载到开发板中即可实现can之间的通信,实验成功的现象是led1和led2灯亮起

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(cubemx+stm32f407+双Can通信)