当前位置:   article > 正文

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

stm32 can 能发送 不能进中断

在调试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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

以上三个函数的位置和顺序建议参考我的代码,下图是以上代码在工程中的位置。
在这里插入图片描述
最终在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 */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

最终代码运行结果(串口助手中):
在这里插入图片描述
花了很长时间踩了这个坑,之前的原因应该是把这三个函数分开了,建议这三个函数一辈子捆绑在一起!谢谢大家能看到这里!

源码自取,开源万岁!
链接:https://pan.baidu.com/s/1jQTEc2XtnRRcrEVfafYuWg?pwd=ivml
提取码:ivml

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/152989
推荐阅读
相关标签
  

闽ICP备14008679号