小工具知识网

当前位置: 首页 > 行业知识 > STM32 HAL库 CAN双机通信接收无法进入中断、中断没有反应的解决方法

行业知识

STM32 HAL库 CAN双机通信接收无法进入中断、中断没有反应的解决方法

2026-11-04 22:24:26 来源:互联网转载

在调试HAL库下的CAN双机(双F103ZET6)通信时,阻塞轮询接收完全正常,但是中断接收没有反应。翻看了GL的烧脑之路总结(一):Cubemx创建CAN通信工程,无法进入CAN中断的原因这篇文章以后,核实自己的硬件电路没有问题,于是对自己的工程文件进行整理,把

①HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig)//配置can

②HAL_CAN_Start(CAN_HandleTypeDef *hcan)//开始can

③HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)//使能can

三个函数放在一起后,成功实现了CAN中断接收,下面是我在工程中的配置源码:

void can_filterconfig_and_init(void){CAN_FilterTypeDef filter;filter.FilterIdHigh = 0x0000;filter.FilterIdLow = 0x0000;filter.FilterMaskIdHigh = 0x0000;filter.FilterMaskIdLow = 0x0000;//不过滤filter.FilterFIFOAssignment = CAN_FILTER_FIFO1;filter.FilterActivation = ENABLE;filter.FilterMode = CAN_FILTERMODE_IDMASK;filter.FilterScale = CAN_FILTERSCALE_32BIT;filter.FilterBank = 0;//filter.SlaveStartFilterBank =14;if(HAL_CAN_ConfigFilter(&hcan,&filter) != HAL_OK){Error_Handler();Usart_SendString("can配置失败\r\n");}elseUsart_SendString("can配置成功\r\n");if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK){Error_Handler();Usart_SendString("开启挂起中断允许失败\r\n");}elseUsart_SendString("开启挂起中断允许成功\r\n");if(HAL_CAN_Start(&hcan) != HAL_OK){Error_Handler();Usart_SendString("can开启失败\r\n");}elseUsart_SendString("can开启成功\r\n");}

最终在main函数中调用:

(中断回调函数我就不写了,教程很多)

int main(void){  /* USER CODE BEGIN 1 */  /* USER CODE END 1 */  /* MCU Configuration--------------------------------------------------------*/  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */  HAL_Init();  /* USER CODE BEGIN Init */  /* USER CODE END Init */  /* Configure the system clock */  SystemClock_Config();   /* USER CODE BEGIN SysInit */  /* USER CODE END SysInit */  /* Initialize all configured peripherals */  MX_GPIO_Init();  MX_CAN_Init();  MX_USART1_UART_Init();  /* USER CODE BEGIN 2 */can_filterconfig_and_init();//*这儿!不要忘记声明哦。*   /* USER CODE END 2 */   /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */}

最终代码运行结果(串口助手中):

花了很长时间踩了这个坑,之前的原因应该是把这三个函数分开了,建议这三个函数一辈子捆绑在一起!谢谢大家能看到这里!

源码自取,开源万岁!

链接:https://pan.baidu.com/s/1jQTEc2XtnRRcrEVfafYuWg?pwd=ivml

提取码:ivml

上一篇:Android网页源码获取解析攻略,轻松实现网页内容解析与源码获取秘籍!

下一篇:播放模块怎么下载?