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;
}