打印
[应用相关]

CubeMX-两路FDCAN同时工作的终极方案(RTX5)

[复制链接]
668|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
晓伍|  楼主 | 2021-9-4 16:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、前言
终极方案的配置如下:

FDCAN1与FDCAN2同时工作
FDCAN的工作模式为普通CAN(可以跑CANopen协议)
每路FDCAN有32个接收FIFO
每路FDCAN有32个发送FIFO
通讯波特率:1M
接收中断+水印中断(防止FIFO溢出)
滤波器设置:接收标准帧,接收所有范围的ID
STM32工程:
链接:https://pan.baidu.com/s/1eo-ob49Vt-MGZFVzN0gRcg
提取码:9u9a

二、CubeMX
2.1、Clock Configuration
系统时钟设置480M。

通过分频,将FDCAN的时钟源设置成20M。



使用特权

评论回复
沙发
晓伍|  楼主 | 2021-9-4 16:14 | 只看该作者
2.2、FDCAN1




使用特权

评论回复
板凳
晓伍|  楼主 | 2021-9-4 16:15 | 只看该作者
FDCAN2




使用特权

评论回复
地板
晓伍|  楼主 | 2021-9-4 16:15 | 只看该作者
三、代码3.1、添加BSP

之前写好的代码,封装成BSP(在STM32工程里复制即可)。往工程添加如下文件:

  • bsp_fdcan.c(中断回调函数,中断配置等代码都在这个文件里)
  • bsp_fdcan.h
  • bsp.c
  • bsp.h


使用特权

评论回复
5
晓伍|  楼主 | 2021-9-4 16:16 | 只看该作者
fdcan.c

首先,在CubeMX生成的函数MX_FDCAN1_Init( )设置水印。计算FDCAN2的messageRAMOffset是可选的,不一定要加这个代码。



使用特权

评论回复
6
晓伍|  楼主 | 2021-9-4 16:17 | 只看该作者
3.3、main.c
在main.c里运行了如下代码:

初始化FDCAN滤波器。
开启FDCAN控制器。
初始化FDCAN中断。



因为这个工程运行了RTOS,开启FDCAN中断必须在消息队列后面。所以如果没有RTOS的话,直接在fdcan1.rx_Filter_Init( )后直接调用fdcan1.rx_Interrupt_Init()即可。



使用特权

评论回复
7
晓伍|  楼主 | 2021-9-4 16:18 | 只看该作者
四、调试FDCAN4.1、测试发送CAN报文

thread_LED_App函数每500ms执行一次。

从CAN分析仪观察是否收到报文。

从以上的测试看来,FDCAN1与FDCAN2都正常发送CAN报文了。


使用特权

评论回复
8
晓伍|  楼主 | 2021-9-4 16:19 | 只看该作者
4.2、测试接收CAN报文
4.2.1、FDCAN1接收
使用CAN分析仪的CAN0(连接FDCAN1)发送报文。在Keil软件上将fdcan1添加到Wathc1窗口上,可以从变量fdcan1看到CAN报文的内容,跟CAN分析仪上的一样。所以,FDCAN1成功接收CAN报文。



使用特权

评论回复
9
晓伍|  楼主 | 2021-9-4 16:20 | 只看该作者
4.2.2、FDCAN2接收

使用CAN分析仪的CAN1(连接FDCAN2)发送报文,在Keil软件上将fdcan2添加到Watch1窗口上,可以从变量fdcan2里看到CAN报文的内容,跟CAN分析仪上的一样。所以,FDCAN2成功接收CAN报文。


使用特权

评论回复
10
晓伍|  楼主 | 2021-9-4 16:21 | 只看该作者
五、细节补充5.1、FDCAN中断回调函数

在接收中断函数里,如果是裸机的话(没有RTOS系统),直接将这些代码删除即可。以FDCAN1的接收中断函数为例:


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

4113

帖子

1

粉丝