STM32H743 FDCAN通信 接收中断如何实现

MCU:野火H743挑战者

中断处理函数

在STM32CubeMX使能FDCAN1中断0,生成keil工程。
在这里插入图片描述
在工程里的stm32h7xx_it.c会出现这样一个函数,这个函数其实是FDCAN1的所有类型中断都会进入的,然后在HAL_FDCAN_IRQHandler(&hfdcan)这个函数进行判断,从而进入对应的回调函数。
在这里插入图片描述
我们进入这个函数,看看它是怎么实现的。这个函数位于stm32h7xx_hal_fdcan.c文件,也就是FDCAN的HAL驱动库文件。由于此次使用的是出现新消息出现中断,我们重点关注这一部分。这个函数非常大,包含很多内容,英语注释为官方注释,中文注释为自己添加的注释。

这一部分对应的就是Rx FIFO 0 interrupts management,也就是RX FIFO 0的重点管理。接收数据有3个区域,RX 缓冲区、RX FIFO0和RXFIFO1,这个是可以选择的。具体有何区别这里不作介绍。

我们可以看到从主函数进来之后,第一步先失能FIFO 0所有中断,这句隐藏在背后的话把我折磨了好久,因为之前发现读取中断进一次去失效了,现在才明白它处理的时候把所有中断都关了,怪不得失效了。所以每次处理完都要重新开一次中断。第二步,清除标志位。第三步就是调用回调函数,具体回调函数是什么也可以百度一下。这里我们只要明白,中断最后都会进入到这个回调函数,需要中断后实现什么功能,把代码写进回调函数就可以了。
在这里插入图片描述
我自己在main.c文件定义了回调函数,这个是没有的,需要自己编程。中断处理先讲到这里,先看看中断的初始化。
在这里插入图片描述

中断配置函数

在这里插入图片描述
因为之前我们在CubeMX设置的就是FDCAN1的中断0,所以这里前两句设置优先级和使能中断都是自动生成的。
在这里插入图片描述

配置过滤器

在这里插入图片描述

图片中注释已经很清楚了,滤波器模式主要是掩码模式,ID1是想要收到的ID,ID2是掩码,0X7FF代表需要全部满足。

在前面中断初始化函数已经开启了中断,这里又激活了一次中断,两次有什么区别呢?笔者认为前者开了中断0,但是中断0内还是存在很多中断,所以需要再次开子中断。在stm32h7xx_hal_fdcan.h文件,我们可以看到以下内容。上面部分是FIFO 0中断类型,下面部分是FIFO 1中断类型。两者类型是一致的,包括信息丢失中断、满溢中断、水印中断、写入新消息中断。

其他三个中断都好了解,那水印中断是什么意思。水印中断可以理解为,当FIFO内消息到达x条时,触发中断。那怎么去设置这个具体的x,在配置函数里两行被注释掉的代码,用的是HAL_FDCAN_ConfigFifoWatermark函数。如果设置为2层,意味着收到两条消息就发起中断。

这次实例使用的主要是写入新消息中断,所以前面激活的是FDCAN_IT_RX_FIFO0_NEW_MESSAGE。
在这里插入图片描述
在这里插入图片描述

主函数实现

在这里插入图片描述
当收到新消息,进入回调函数,首先判断是哪种类型中断,前面讲过有4钟类型中断。假如是新消息中断,标志位置1。然后主函数的部分就会运行,利用HAL库自带GetRxMessage从FIFO0取出数据。然后重置标志位,重新激活中断。

演示

在这里插入图片描述
用ZCANPRO软件+USB-CAN转换器可以实现PC发送消息给MCU,发送标准帧,ID为111。MCU会把收到的信息通过串口打印出来。
在这里插入图片描述
实验成功!

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 要在STM32H743实现以太网通信的TCP客户端,可以按照以下步骤进行操作: 1. 配置系统时钟:使用STM32CubeMX工具来配置系统时钟,确保以太网接口(ETH)和外设电源使能。 2. 配置以太网接口:使用STM32CubeMX工具选择以太网模块(ETH)并配置相应的参数,如MAC地址、速度和工作模式等。 3. 初始化TCP/IP协议栈:使用lwIP(轻型IP协议栈)作为TCP/IP协议栈,并进行相应的初始化。可以使用STM32CubeMX工具生成代码并进行初始化设置。 4. 创建TCP客户端:使用lwIP API函数创建一个TCP客户端实例,并指定目标IP地址和端口号。 5. 连接服务器:使用lwIP API函数进行TCP连接服务器。可以在连接成功前进行超时处理。 6. 发送数据:使用lwIP API函数发送需要传输的数据,可以使用lwIP的TCP发送缓冲区管理机制来实现数据传输。 7. 接收数据:使用lwIP API函数接收服务器传回的数据,可以通过轮询的方式获取接收缓冲区中的数据。 8. 关闭连接:使用lwIP API函数关闭TCP连接。 9. 错误处理:在代码中需要添加适当的错误处理机制,处理连接和数据传输过程中可能出现的错误。 10. 编译和下载:使用IAR Embedded Workbench进行编译和下载,确保代码能够正常运行。 通过以上步骤,可以在STM32H743实现以太网通信的TCP客户端。请根据具体需求和环境进行适当的配置和调整。 ### 回答2: STM32H743是意法半导体推出的高性能微控制器系列之一。它提供了以太网通信功能,并且可以通过TCP协议实现客户端通信。 在IAR环境中实现STM32H743以太网通信TCP客户端,首先需要配置以太网外设。可以通过STM32CubeMX等工具进行配置,选择以太网模块并进行相应的引脚映射与参数配置。配置完成后,将生成的代码导出到IAR工程中。 在IAR工程中,引入以太网库文件和TCP/IP协议栈相关的库文件。在主函数中,初始化以太网外设,并进行TCP客户端的配置,包括设置服务器IP地址、端口号等参数。 接下来,创建一个TCP套接字,并连接到服务器。可以使用标准的套接字API函数,如socket()、connect()等。连接成功后,可以通过send()函数发送数据给服务器,通过recv()函数接收服务器返回的数据。 在具体的应用中,可以根据需求,不断地发送和接收数据。发送数据可以使用send()函数将数据发送给服务器,接收数据可以使用recv()函数从服务器接收数据。可以根据自己的应用场景,选择阻塞式或非阻塞式的函数,并结合相关的状态判断来保证通信的稳定性。 当通信结束或需要断开连接时,可以使用close()函数关闭套接字,并释放相关资源。 需要注意的是,在实现STM32H743以太网通信TCP客户端时,要确保网络环境的正常。此外,可能需要针对具体的需求进行相应的错误处理,例如处理连接超时、连接错误等情况。 综上所述,通过以上步骤和相关函数,我们可以在IAR环境中实现STM32H743的以太网通信TCP客户端。通过配置参数、发送和接收数据,实现与服务器的通信。这样可以使STM32H743在网络应用中具备较强的通信能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值