STM32 CAN 过滤器设置

做个笔记吧 ,免得以后忘记了

芯片是stm32F207  ,用cubeMX 6.80 版本生成

CAN 的使用总体包含4个部分

第一步:CAN初始化,配置波特率  (cubeMX 里面配置好后自动生成,不需要手动添加)

MX_CAN1_Init();

第二步:接收部分的滤波器代码需要单独配置,CUBEMX未生成此部分代码。

 CAN_SetFilters();

第三步:

//使能CAN

HAL_CAN_Start(&hcan1);
//激活接收
 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) ;

第四步

//实现接收回调函数

HAL_CAN_RxFifo0MsgPendingCallback();
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanHandle)
{
    CAN_RxHeaderTypeDef    RxHeader;     
    if(HAL_CAN_GetRxMessage(CanHandle, CAN_RX_FIFO0, &RxHeader, RX_data)   !=HAL_OK)
    {
      Error_Handler();
    }
    /*
    处理接收到的数据
    */    

    if (hcan->Instance == CAN1) {
            // user to do 
    }
}

这里重点记录CAN 的过滤器配置

HAL_StatusTypeDef CAN_SetFilters(void)
{

    CAN_FilterTypeDef    canFilter;
    HAL_StatusTypeDef result;
     //1. 设置FIFO 0 的筛选器
    uint32_t StdId = 0x50A;            //标准CAN ID 是11位
    canFilter.FilterBank = 0;        //筛选器组编号
    canFilter.FilterMode = CAN_FILTERMODE_IDMASK;    //ID掩码模式
    canFilter.FilterScale = CAN_FILTERSCALE_32BIT;    //32位长度

    canFilter.FilterIdHigh = StdId<<5;        //CAN_FxR1 寄存器的高16位
    canFilter.FilterIdLow = 0x0000;            //CAN_FxR1 寄存器的低16位
    canFilter.FilterMaskIdHigh = 0xFFE<<5;//最后一位不需匹配,其余位完全匹配 //CAN_FxR2寄存器的高16位
    canFilter.FilterMaskIdLow = 0xFFFF;//0x0000; 完全匹配        //CAN_FxR2寄存器的低16位
    
    canFilter.FilterFIFOAssignment = CAN_RX_FIFO0;        //应用于FIFO 0
    canFilter.FilterActivation = ENABLE;        //使用筛选器
    canFilter.SlaveStartFilterBank = 0;        //从CAN控制器筛选器起始的Bank
 
    result=HAL_CAN_ConfigFilter(&hcan1, &canFilter);

    //add 
    HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
    HAL_CAN_Start(&hcan1);

    return result;
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机)