控制器: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中断代码有
HAL_FDCAN_MspInit函数里面增加配置:中断优先级、使能FDCAN1中断代码
HAL_FDCAN_MspDeInit函数里面增加:关闭FDCAN1中断代码
增加CANFD中断调用函数
增加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);
}
}
}
|