STM32的CAN总线的接收双FIFO使用方法

通过下面的框图我们可以看到,STM32F013有两个接收FIFO


但是实际的使用中如何让着两个FIFO都被使用呢,解决办法就在这里,
1. STM32F103有0-13共14个过滤器组,每个过滤器组都可以绑定指定的FIFO。



2. 特别需要注意的一点是,FIFO0和FIFO1的接收对应不同的中断入口,切记。
分别是

DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1

=========================================================================
下面的截图就是将过滤器分配给不同FIFO的一个简单例子框图

### STM32 CAN总线FIFO的工作原理 #### FIFO概述 STM32CAN 控制器支持两种消息接收模式:通过两个独立的 FIFO(First In First Out)缓冲区来管理接收到的消息。这两个 FIFO 分别称为 FIFO0FIFO1[^1]。 #### FIFO工作条件 对于 CAN1FIFO0 来说,要触发接收中断需满足以下三种情况之一: - 当 `FMPIE0` 被设置为 1 并且 `FMP0` 表明有未处理的消息时; - 如果 `FFIE0` 设置为 1 并且 FIFO 缓冲已满 (`FULL`) 则会触发中断; - 若 `FOVIE0` 设定为 1 同时发生溢出(`FOVR0`)则也会引发中断信号[^2]。 #### 配置过程 利用STM32CubeMX工具可以简化CAN外设初始化流程,在图形界面下完成基本参数设定之后生成相应代码框架以便进一步开发应用层功能。 以下是基于STM32CubeIDE环境下实现CAN中断接收的一个简单例子: ```c // 初始化结构体定义部分省略... /* CAN filter configuration */ Can_FilterTypeDef sFilterConfig; sFilterConfig.FilterBank = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK){ Error_Handler(); } // 中断回调函数示例 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanHandle){ uint32_t fifo0itflags = __HAL_CAN_GET_IT_SOURCE(CanHandle, CAN_IT_FMPIE0); if(fifo0itflags && (__HAL_CAN_GET_FLAG(CanHandle,CAN_FLAG_FMP0))){ /* 处理接收到的数据包 */ } } ``` 上述代码片段展示了如何配置过滤器以及编写用于响应来自FIFO0的新消息到达事件的中断服务程序(ISR)[^1]。 ###
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值