在是stm32的hal库中定义了一个按键外部中断,可按下后其它程序就不在执行了,定义了一个断点调试,每次按下后都会在这里停下,说明一直处于中断吗?有没有解决方法?
这是中断回调函数,可B1的按键中断是没有问题的
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
for(uint16_t i =0;i<50;i++);
switch(GPIO_Pin)
{
case GPIO_PIN_1:
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==RESET)
// {
// for(uint16_t i =0;i<500;i++);
// while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==RESET);
// HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
//// led1_turn();
// }
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
{
for(uint16_t i =0;i<500;i++);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
// led2_turn();
}
break;
case GPIO_PIN_2:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==RESET)
{
for(uint16_t i =0;i<500;i++);
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
i++;
}
// led1_turn();
break;
default:
return;
}
}
这里是引脚定义PB1,PA2
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 2);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
问题回答:
根据你描述的问题,我了解到你遇到了一个按键中断引起程序无响应的问题。你想知道每次按下按键后是否一直处于中断状态,并且想了解解决这个问题的方法。
首先,我需要看一下你的代码,特别是涉及到中断注册和中断处理的部分。请提供按键中断回调函数的代码,以及相关的中断注册部分的代码。
根据提供的代码,我看到你定义了两个引脚PB1和PA2。你可以尝试将按键中断引脚连接到PB1或PA2引脚,然后重新测试一下。
同时,为了确保程序不会一直停在中断状态,你需要在按键中断回调函数中添加一些处理逻辑。你可以在回调函数中添加一段延时代码(例如使用HAL_Delay函数),让回调函数在处理完中断后延时一段时间再返回。这样可以确保程序能够继续执行其他代码。
以下是对你提供的按键中断回调函数的代码进行修改的示例:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == B1_Pin)
{
// 处理B1按键的中断
// ...
HAL_Delay(500); // 延时500毫秒
}
else if(GPIO_Pin == PB1_Pin)
{
// 处理PB1按键的中断
// ...
HAL_Delay(500); // 延时500毫秒
}
else if(GPIO_Pin == PA2_Pin)
{
// 处理PA2按键的中断
// ...
HAL_Delay(500); // 延时500毫秒
}
}
这样修改后,当按下任意一个按键之后,回调函数会执行相应的处理逻辑,并在处理完后延时500毫秒,然后再返回。这样保证了程序能够继续执行其他代码。
希望这些解决方案能帮助到你。如果你还需要提供更多的信息或者有其他问题,请告诉我。