Allen嵌入式 2024-11-21 20:01 采纳率: 33.3%
浏览 4

STM32H750VB

请问各位:
我使用按键控制led的时候,对按键引脚设置下拉,然后中断为上升沿触发,代码可行。但是设置按键为上拉,中断为下降沿触发,按键按动led没反应。中断回调函数中的逻辑我都相应的修改了。我不明白为什么?

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LED_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 15, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == KEY_Pin)
        if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_SET)
        {
            HAL_Delay(30);
            if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_SET)
            {
                HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
                while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_SET);
            }
        }
}

这是按键和led的原理图:

img

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码和原理图,按键控制LED的逻辑看起来是正确的。当按键设置为上拉,中断为下降沿触发时,按键按下时LED无反应的问题可能是由于以下几个原因导致的:

    1. 按键的电路设计可能存在问题。在您的原理图中,按键和LED的连接部分没有明确的电路图,因此无法确定按键电路是否正确连接。请检查按键电路的连接是否正确,特别是上拉电阻和按键的连接是否正确。
    2. 中断配置可能不正确。请确保您的中断配置正确设置为下降沿触发。在STM32中,可以通过设置GPIO的模式和触发方式来配置中断。请检查您的GPIO初始化配置是否正确。
    3. 中断服务函数中的逻辑可能有误。请确保在中断服务函数(HAL_GPIO_EXTI_Callback)中,当按键被按下并且状态从高到低变化时,正确地触发了LED的切换逻辑。您可以尝试在中断服务函数中添加更多的调试信息,以确认中断是否被正确触发。

    针对上述问题,您可以尝试以下解决方案:

    1. 重新检查按键电路的接线,确保上拉电阻和按键的连接正确。
    2. 确保GPIO初始化配置正确,将按键的中断设置为下降沿触发。
    3. 在中断服务函数中添加调试信息,以确认中断是否被正确触发,并且LED的切换逻辑是否正确执行。

    另外,我注意到您的代码中使用了HAL_Delay(30)来消除按键抖动。在某些情况下,这可能不够长,导致无法正确检测到按键的下降沿。您可以尝试增加延迟时间或者采用其他方法来解决按键抖动问题。

    如果问题仍然存在,建议您参考STM32的官方文档和参考手册,或者寻求相关技术支持,以获取更详细的帮助和解决方案。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月21日