STM32按键中断函数中调用HAL_Delay卡死解决方案

在实现通过按键控制LED闪烁时遇到了一旦按下按键程序不在执行,好像是卡死在某处位置。

通过添加printf打印最终定位是卡在了HAL_Delay调用处。

//按键回调
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	//判断是否按下key1
	if (Key1_Pin == GPIO_Pin) {

		if (HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) == GPIO_PIN_RESET) {
			//防抖
			HAL_Delay(10);
			if (HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) == GPIO_PIN_RESET) {
				printf("key1 is down \r\n");
				KeyStatus = KEY_DOWN;
			}
		
		} else {
			//防抖
			HAL_Delay(10);
			if (HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin) == GPIO_PIN_SET) {
				printf("key1 is up \r\n");
				KeyStatus = KEY_UP;
			}
		}
	}
	printf("Key1_Pin is exit \r\n");
}
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

在使用CubeMX创建工程时我们使用的Timebase Source为TIM2,默认情况下TIM2的中断优先级是15,是低于按键的中断优先级的,所以在按键中断中调用HAL_Delay,HAL_Delay将一直处于while循环中不能返回。

 解决方案是把TIM2的优先级调高,重新生成代码即可。


版权声明:本文为lgdlchshg原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。