STM32 HAL库的CAN总线滤波器设置

本文介绍了如何使用STM32 HAL库进行CAN总线的滤波器设置,从stm32cubemx生成的初始化代码开始,详细讲解了滤波器配置步骤,并探讨了通过CAN发送数据的流程,同时涵盖了CAN总线中断服务函数及数据处理函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32 HAL库的CAN总线滤波器设置

stm32cubemx生成的can初始化代码

#include "can.h"

#include "gpio.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

CAN_HandleTypeDef hcan1;
CAN_HandleTypeDef hcan2;

/* CAN1 init function */
void MX_CAN1_Init(void)
{
   

  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 3;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SJW = CAN_SJW_1TQ;
  hcan1.Init.BS1 = CAN_BS1_9TQ;
  hcan1.Init.BS2 = CAN_BS2_4TQ;
  hcan1.Init.TTCM = DISABLE;
  hcan1.Init.ABOM = ENABLE;
  hcan1.Init.AWUM = DISABLE;
  hcan1.Init.NART = DISABLE;
  hcan1.Init.RFLM = DISABLE;
  hcan1.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
   
    _Error_Handler(__FILE__, __LINE__);
  }

}
/* CAN2 init function */
void MX_CAN2_Init(void)
{
   

  hcan2.Instance = CAN2;
  hcan2.Init.Prescaler = 3;
  hcan2.Init.Mode = CAN_MODE_NORMAL;
  hcan2.Init.SJW = CAN_SJW_1TQ;
  hcan2.Init.BS1 = CAN_BS1_9TQ;
  hcan2.Init.BS2 = CAN_BS2_4TQ;
  hcan2.Init.TTCM = DISABLE;
  hcan2.Init.ABOM = ENABLE;
  hcan2.Init.AWUM = DISABLE;
  hcan2.Init.NART = DISABLE;
  hcan2.Init.RFLM = DISABLE;
  hcan2
### STM32F103 HAL CAN总线 中断接收 示例代码 对于STM32F103系列微控制器,在使用HAL实现CAN总线通信时,中断接收是一种高效的方式处理接收到的数据。下面展示了一个简单的例子,说明如何设置CAN接口以利用中断机制来接收数据。 #### 初始化部分 首先需要在`main.c`文件中的适当位置完成必要的初始化工作: ```c /* Private variables ---------------------------------------------------------*/ CAN_HandleTypeDef hcan; // 定义全局变量存储接收到的信息 extern uint8_t RxData[8]; extern FlagStatus bNewMessageReceived; ``` 接着是在`MX_CAN_Init()`函数内配置CAN硬件抽象层句柄结构体成员以及调用`HAL_CAN_Init(&hcan)`来进行初始化操作[^3]。 为了使能CAN模块的中断功能,还需要修改NVIC优先级组并注册相应的回调函数以便于后续处理接收到的消息: ```c void MX_NVIC_Init(void){ /* CAN_RX0_IRQn interrupt configuration */ HAL_NVIC_SetPriority(CAN_RX0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(CAN_RX0_IRQn); } static void SystemClock_Config(void){...} static void MX_GPIO_Init(void){...} static void MX_CAN_Init(void){ hcan.Instance = CAN1; hcan.Init.Prescaler=16; // 设置预分频系数 hcan.Init.Mode = CAN_MODE_NORMAL;// 正常模式 hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan.Init.TimeSeg1 = CAN_BS1_13TQ; hcan.Init.TimeSeg2 = CAN_BS2_2TQ; hcan.Init.TimeTriggeredMode = DISABLE; hcan.Init.AutoBusOff = DISABLE; hcan.Init.AutoWakeUp = DISABLE; hcan.Init.GatewayOff = DISABLE; hcan.Init.NoAck = DISABLE; hcan.InitReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) { Error_Handler(); } } ``` #### 配置过滤器与启动监听状态 之后应该创建一个或多个标准/扩展ID类型的接受滤波器,并激活RX FIFO缓冲区用于暂存待读取的新到来报文;最后一步就是让CAN进入“运行”态准备就绪等待事件触发了。 ```c static void CAN_FilterConfig(void){ CanFilterConfTypeDef sFilterConfig; sFilterConfig.FilterNumber = 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_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.BankNumber = 14; if(HAL_CAN_ConfigFilter(&hcan,&sFilterConfig)!= HAL_OK ) { Error_Handler(); } } int main(void){ ... CAN_FilterConfig(); if(HAL_CAN_Start(&hcan) != HAL_OK ) {Error_Handler();} if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR) != HAL_OK ){Error_Handler();} while(1){} } ``` #### 实现中断服务例程ISR 当有新消息到达指定的FIFO队列时会自动唤醒CPU执行对应的异常向量表项关联的服务程序(ISR),这里主要是更新标志位通知主线程存在未决事务需及时响应处理。 ```c void CAN_RX0_IRQHandler(void){ HAL_CAN_IRQHandler(&hcan); } void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* hcan){ static CanRxMsgTypeDef pRxMessage; memset(RxData,0,sizeof(uint8_t)*8); HAL_CAN_GetRxMessage(hcan,CAN_FIFO0,&pRxMessage,RxData); bNewMessageReceived = SET ; } ``` 以上就是在STM32F103上基于HAL实现CAN总线中断接收的一个基本框架介绍。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值