历史上的今天
今天是:2025年04月12日(星期六)
2019年04月12日 | cubemx+stm32f407+双Can通信
2019-04-12 来源:eefocus
最近几天在用CUBEMX实现stm32f407zgt6的双can通讯,中间走了一些弯路,记录下来供需要的人参考借鉴,希望可以帮助大家节省开发周期。
准备工作:
一、硬件
使用启明高配版开发板,因为启明的板子上有两个can可以使用,在调试之前,需要先将can1_H连接can2_H,can1_L连接can2_L,并且需要将P15和P21跳线帽连接好。


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

![]()
2.keil版本

程序编写
can在网上有很多介绍,可以在网上搜索一些基础介绍,之前调试can主要是卡在了新的库包里对滤波器以及FIFO和回调函数的设置上出现一些问题。
一、cubemx设置
1.Pinout部分
使能RCC,CAN1,CAN2以及开发板的PE3,PE4,PG9,SYS可以选择SW模式。点亮灯主要是想在调试的时候使用方便


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

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


can2设置和can1相同


NVIC部分


点击生成代码

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

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

完成配置后生成代码
二、代码编写
点开工程目录中的MDK-ARM文件夹中的MDK工程

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

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

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

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

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

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

can.h部分
主要是声明几个结构体和两个函数


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

到此,配置完成,下载到开发板中即可实现can之间的通信,实验成功的现象是led1和led2灯亮起
史海拾趣
|
这两天下了那个什么STM8的库按照一些说明把该加的加,就是有一个中断我记得是STM8-interrupt-vector.c,总是自动加进而且编译出错,我试了两天都一样,用的是库里带的GPIO例程第一例,第二例,实用的就是好的,STM8这么个库我想不但不快速开发而且阻 ...… 查看全部问答> |
|
最近一个星期,用EP1C3T144C8这个FPGA嵌入NIOS2,研究了一下FLASH和SDRAM的驱动,最后终于是好用了,但中间遇到了不少曲折,现在就把我的一些经验分享给大家,希望大家以后在这方面不要走弯路。 首先,先提一个名词--SOPC.任何一本 ...… 查看全部问答> |
|
中心议题: 电磁干扰滤波器的构造原理及应用EMI滤波器在[url=]开关[/url]电源中的应用EMI滤波器的技术参数及测试方法 随着电子设备、计算机与家用电器的大量涌现和广泛普及,电网噪声干扰日益严重并形成一种公害。特别是瞬态噪声干扰,其上升速度 ...… 查看全部问答> |
|
以前听说前后台的操作模式,一般不在中断服务程序里写复杂的算法,即使各个中断协调的很好。说是因为进中断的时候CPU不一定将全部的寄存器保护,所以会影响程序正确性。请问STM32有这样的问题吗?期待DX们来交流!… 查看全部问答> |
|
大电阻的测量2—低功率纳米技术[1]及其它敏感器件的交流与直流测量方法的比较 相比之下,纳伏表[2]具有1000倍高的输入阻抗(也就是10GΩ),因此它可以以±1%精度来测量高于1GΩ的电阻。(消除10GΩ的负载影响只需将输入阻抗精确到±10%,以开路作为测试对象,通过直流反转测量的方法即可得到。)此外,一些电流源提 ...… 查看全部问答> |
|
使用GPIO读写eeprom没问题后 想学习I2C mode 下了TI的SLAA208c范例來调适 其中 void EEPROM_ByteWrite(unsigned int Address, unsigned char Data) { unsigned char adr_hi; unsigned char adr_lo; wh ...… 查看全部问答> |




