...
/* USER CODE BEGIN 1 */
void User_Config_Filter(void)
{
  // 給FIFO0配置一個過濾器0
  CAN_FilterTypeDef filter_config;
  filter_config.FilterBank = 0;
  filter_config.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  filter_config.FilterMode = CAN_FILTERMODE_IDMASK;
  filter_config.FilterScale = CAN_FILTERSCALE_32BIT;
  filter_config.FilterIdLow = 0;
  filter_config.FilterIdHigh = 0;
  filter_config.FilterMaskIdHigh = 0;
  filter_config.FilterMaskIdLow = 0;
  filter_config.FilterActivation = CAN_FILTER_ENABLE;
  HAL_CAN_ConfigFilter(&hcan, &filter_config);
}

void User_CAN_SendMsg(uint16_t stdId, uint8_t data[], uint8_t length)
{
  /* 1.讀取當前發送郵箱的狀態 */
  // 得到空閒的發送郵箱的個數
  uint32_t freeBoxesNum = HAL_CAN_GetTxMailboxesFreeLevel(&hcan);

  /* 2.使用封裝好的方法發送報文 */
  if (freeBoxesNum > 0)
  {
    CAN_TxHeaderTypeDef header_type;
    header_type.IDE = CAN_ID_STD;
    header_type.RTR = CAN_RTR_DATA;
    header_type.StdId = stdId;
    header_type.DLC = length;
    // 自動尋找空閒的郵箱 存放對應的發送郵箱編號
    uint32_t boxNum;
    HAL_CAN_AddTxMessage(&hcan, &header_type, data, &boxNum);
  }
  else
  {
    // 當前郵箱沒有空閒 等會再發
    printf("當前郵箱沒有空閒 等會再發\n");
  }
}
void User_CAN_ReceiveMsg(RxDataStruct rxDataStruct[], uint8_t *msgCount)
{
  /* 1. 獲取接收隊列中的報文數 */
  *msgCount = HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0);
  /* 2. 將報文數據賦值到結構體數組中 */
  for (uint8_t i = 0; i < *msgCount; i++)
  {
    // 提前聲明結構體  用於接收報文數據的頭信息
    CAN_RxHeaderTypeDef header_tyep;
    RxDataStruct *msg = &rxDataStruct[i];
    memset(msg->data, 0, 8);
    HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &header_tyep, msg->data);

    // 補全頭信息
    msg->stdId = header_tyep.StdId;
    msg->length = header_tyep.DLC;
  }
}
/* USER CODE END 1 */