赞
踩
在调试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"); } else Usart_SendString("can配置成功\r\n"); if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK) { Error_Handler(); Usart_SendString("开启挂起中断允许失败\r\n"); } else Usart_SendString("开启挂起中断允许成功\r\n"); if(HAL_CAN_Start(&hcan) != HAL_OK) { Error_Handler(); Usart_SendString("can开启失败\r\n"); } else Usart_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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。