能动了!(小板凳)但是还是很抖

This commit is contained in:
TuxMonkey
2026-07-15 13:40:54 +08:00
parent 8a13444e48
commit b3da53745d
5 changed files with 74 additions and 65 deletions

View File

@@ -11,6 +11,11 @@
static CANInstance *can_instance[CAN_MX_REGISTER_CNT] = {NULL};
static uint8_t idx; // 全局CAN实例索引,每次有新的模块注册会自增
static uint8_t CANBusIndex(CAN_HandleTypeDef *hcan)
{
return hcan == &hcan1 ? 0u : 1u;
}
/* ----------------two static function called by CANRegister()-------------------- */
/**
@@ -28,18 +33,26 @@ static uint8_t idx; // 全局CAN实例索引,每次有新的模块注册会自
*/
static void CANAddFilter(CANInstance *_instance)
{
CAN_FilterTypeDef can_filter_conf;
static uint8_t can1_filter_idx = 0, can2_filter_idx = 14; // 0-13给can1用,14-27给can2用
static uint8_t all_pass_filter_configured[DEVICE_CAN_CNT] = {0};
uint8_t bus = CANBusIndex(_instance->can_handle);
can_filter_conf.FilterMode = CAN_FILTERMODE_IDLIST; // 使用id list模式,即只有将rxid添加到过滤器中才会接收到,其他报文会被过滤
can_filter_conf.FilterScale = CAN_FILTERSCALE_16BIT; // 使用16位id模式,即只有低16位有效
can_filter_conf.FilterFIFOAssignment = (_instance->tx_id & 1) ? CAN_RX_FIFO0 : CAN_RX_FIFO1; // 奇数id的模块会被分配到FIFO0,偶数id的模块会被分配到FIFO1
can_filter_conf.SlaveStartFilterBank = 14; // 从第14个过滤器开始配置从机过滤器(在STM32的BxCAN控制器中CAN2是CAN1的从机)
can_filter_conf.FilterIdLow = _instance->rx_id << 5; // 过滤器寄存器的低16位,因为使用STDID,所以只有低11位有效,高5位要填0
can_filter_conf.FilterBank = _instance->can_handle == &hcan1 ? (can1_filter_idx++) : (can2_filter_idx++); // 根据can_handle判断是CAN1还是CAN2,然后自增
can_filter_conf.FilterActivation = CAN_FILTER_ENABLE; // 启用过滤器
if (all_pass_filter_configured[bus])
return;
HAL_CAN_ConfigFilter(_instance->can_handle, &can_filter_conf);
CAN_FilterTypeDef accept_all_filter = {0};
accept_all_filter.FilterActivation = CAN_FILTER_ENABLE;
accept_all_filter.FilterMode = CAN_FILTERMODE_IDMASK;
accept_all_filter.FilterScale = CAN_FILTERSCALE_32BIT;
accept_all_filter.FilterIdHigh = 0x0000;
accept_all_filter.FilterIdLow = 0x0000;
accept_all_filter.FilterMaskIdHigh = 0x0000;
accept_all_filter.FilterMaskIdLow = 0x0000;
accept_all_filter.FilterBank = _instance->can_handle == &hcan1 ? 0 : 14;
accept_all_filter.FilterFIFOAssignment = CAN_RX_FIFO0;
accept_all_filter.SlaveStartFilterBank = 14;
HAL_CAN_ConfigFilter(_instance->can_handle, &accept_all_filter);
all_pass_filter_configured[bus] = 1;
return;
}
/**
@@ -163,7 +176,7 @@ static void CANFIFOxCallback(CAN_HandleTypeDef *_hcan, uint32_t fifox)
memcpy(can_instance[i]->rx_buff, can_rx_buff, rxconf.DLC); // 消息拷贝到对应实例
can_instance[i]->can_module_callback(can_instance[i]); // 触发回调进行数据解析和处理
}
return;
break;
}
}
}