STM32H743板子CANFD中断接收调试过程中的一点问题及解决方法

控制器:STM32H743

功能:双路CANFD

速率:1M_5M

CANFD时钟为20M

采样点数:仲裁场85%,数据场75%。配置如下

hfdcan1.Init.NominalPrescaler = 1;
hfdcan1.Init.NominalSyncJumpWidth = 3; 
hfdcan1.Init.NominalTimeSeg1 = 16;
hfdcan1.Init.NominalTimeSeg2 = 3;
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 2;
hfdcan1.Init.DataTimeSeg2 = 1;

问题:调试STM32H743过程中,参考正点原子的代码,轮询方式两路CANFD接收发送都是OK的,后来使用CUBE改为中断方式然后生成代码,发现不能发送,可以进接收中断,发送32次之后,就出现进不了接收中断,后来手动添加CANFD中断代码,CANFD中断接收/发送成功。(原因可能是CUBE的某些配置和我写的不一样,或者CUBE版本太低导致,具体原因后面排查)

自己添加的CANFD中断代码有

  1.  HAL_FDCAN_MspInit函数里面增加配置:中断优先级、使能FDCAN1中断代码
  2. HAL_FDCAN_MspDeInit函数里面增加:关闭FDCAN1中断代码
  3. 增加CANFD中断调用函数
  4. 增加FIFO调用函数
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
{
    ……
  /* USER CODE BEGIN FDCAN1_MspInit 1 */
	HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
  /* USER CODE END FDCAN1_MspInit 1 */
}
void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
{
    ……
    /* USER CODE BEGIN FDCAN1_MspDeInit 1 */
	HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
    /* USER CODE END FDCAN1_MspDeInit 1 */
}  
/* USER CODE BEGIN 1 */
void FDCAN1_IT0_IRQHandler(void)
{
    HAL_FDCAN_IRQHandler(&hfdcan1);
}
/* USER CODE END 1 */

​
//FIFO0回调函数
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
  if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE)!=RESET)   //FIFO1新数据中断
  {
    if(hfdcan == &hfdcan1)//CANFD1中断
    {				                  
      HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,canbuf_Rec);
      CANFD1_Rce_Flag=1;
      HAL_FDCAN_ActivateNotification(&hfdcan1,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
    }
  }
}

 

你可能感兴趣的:(STM32,stm32)