在实现通过按键控制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版权协议,转载请附上原文出处链接和本声明。