ST意法半导体
直播中

卢表镜

7年用户 1007经验值
私信 关注
[问答]

STM32G431KBT6为什么无法调用FDCAN回调函数呢?

我正在尝试在两个 STM32G431KBT6 之间建立 FDCAN 通信
Tx 部分似乎工作得很好,但我在接收层面遇到了问题。
一般信息:我使用 CAN-FD 作为标准 CAN 2.0B(扩展 ID),波特率为 500 kbit/s。这两块板完全相同,基本配置相同。
这是我由 STM32CubeMX 生成的初始化 CAN 函数:
  • /* FDCAN1 init function */
  • void MX_FDCAN1_Init(void)
  • {
  •   hfdcan1.Instance = FDCAN1;
  •   hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
  •   hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  •   hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  •   hfdcan1.Init.AutoRetransmission = DISABLE;
  •   hfdcan1.Init.TransmitPause = DISABLE;
  •   hfdcan1.Init.ProtocolException = DISABLE;
  •   hfdcan1.Init.NominalPrescaler = 2;
  •   hfdcan1.Init.NominalSyncJumpWidth = 1;
  •   hfdcan1.Init.NominalTimeSeg1 = 13;
  •   hfdcan1.Init.NominalTimeSeg2 = 2;
  •   hfdcan1.Init.DataPrescaler = 1;
  •   hfdcan1.Init.DataSyncJumpWidth = 1;
  •   hfdcan1.Init.DataTimeSeg1 = 1;
  •   hfdcan1.Init.DataTimeSeg2 = 1;
  •   hfdcan1.Init.StdFiltersNbr = 0;
  •   hfdcan1.Init.ExtFiltersNbr = 1;
  •   hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_QUEUE_OPERATION;
  •   if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  • }
这在两个 MCU 上完全相同。
这是我在 Init 函数之后调用的“自制”配置函数:
  • /**
  • * @brief  Configures the FDCAN.
  • * @param  None
  • * @retval None
  • */
  • void FDCAN_Config(void) {
  •   FDCAN_FilterTypeDef sFilterConfig;
  •   /* Configure Rx filter */
  •   sFilterConfig.IdType = FDCAN_EXTENDED_ID;
  •   sFilterConfig.FilterIndex = 0;
  •   sFilterConfig.FilterType = FDCAN_FILTER_MASK;
  •   sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  •   sFilterConfig.FilterID1 = 0x10; // Filter bits
  •   sFilterConfig.FilterID2 = 0; // Mask bits
  •   if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  •   {
  •     /* Filter configuration Error */
  •     Error_Handler();
  •   }
  •   /* Configure global filter:
  •      Filter all remote frames with STD and EXT ID
  •      Reject non matching frames with STD ID and EXT ID */
  •   if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* Start the FDCAN module */
  •   if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
  •   {
  •     /* Start Error */
  •     Error_Handler();
  •   }
  •   /* Enable interrupts */
  •   if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
  •   {
  •     /* Notification Error */
  •     Error_Handler();
  •   }
  • }
我将掩码 (sFilterConfig.FilterID2) 设置为 0 以接受所有消息。
最后这是我的回调函数:
  • /**
  •   * @brief  Rx FIFO 0 callback.
  •   * @param  hfdcan: pointer to an FDCAN_HandleTypeDef structure that contains
  •   *         the configuration information for the specified FDCAN.
  •   * @param  RxFifo0ITs: indicates which Rx FIFO 0 interrupts are signalled.
  •   *         This parameter can be any combination of @arg FDCAN_Rx_Fifo0_Interrupts.
  •   * @retval None
  •   */
  • void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
  • {
  •   if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
  •   {
  •     /* Retrieve Rx messages from RX FIFO0 */
  •     if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, fdcan_RxData) != HAL_OK)
  •     {
  •       /* Reception Error */
  •       Error_Handler();
  •     }
  •     /* Toggle LED */
  •     if (RxHeader.IdType == FDCAN_EXTENDED_ID)
  •     {
  •       HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin);
  •     }
  •     if (HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
  •     {
  •       /* Notification Error */
  •       Error_Handler();
  •     }
  •   }
  • }
首先,我尝试为每个接收到的帧切换一个 LED(Tx MCU 每秒发送一个帧)。
我使用逻辑分析仪检查了 Rx MCU 上的 Rx 引脚,帧顺利到达。因此,我认为问题出在 MCU 永远不会去的回调函数级别。(我测试在它的开头放置一个断点)。
在STM32上使用CAN的新手



回帖(1)

李燕梅

2023-1-6 11:06:29
固定的。
我忘了初始化中断:


  • /* FDCAN1 interrupt Init */
  • HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);
  • HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);

在 HAL_FDCAN_MspInit 函数中。
通过在 STM32CubeMX 的FDCAN1 配置窗口的NVIC 设置窗格中选中框FDCAN1 中断 0来完成。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分