STM32 STM32CubeMX 使用GPIO中断

芯片:STM32 F412

这里只写GPIO中断相关内容

打开STM32CubeMX,鼠标左键点击需要设置GPIO中断的引脚,选择GPIO_EXTI*,鼠标右键点击可以设置自定义LABEL

STM32 STM32CubeMX 使用GPIO中断_第1张图片

设置GPIO中断触发模式,我这里设置了上升沿和下降沿都触发

STM32 STM32CubeMX 使用GPIO中断_第2张图片

使能GPIO中断

STM32 STM32CubeMX 使用GPIO中断_第3张图片

添加中断函数

/** GPIO中断回调
  * @brief  EXTI line detection callbacks.
  * @param  GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    uint32_t tNow = HAL_GetTick();
    // 上升按钮
    if(GPIO_Pin == BtnUp_Pin)
    {
        static int8_t btnOn = 0;
        GPIO_PinState pinState = HAL_GPIO_ReadPin(BtnUp_GPIO_Port, BtnUp_Pin);
        if(0 == btnOn && GPIO_PIN_RESET == pinState)
        {   // 按下
            {
                // 防抖判断
                for(uint8_t i = 0; i < 8; ++i)
                {
                    if(GPIO_PIN_RESET != HAL_GPIO_ReadPin(BtnUp_GPIO_Port, BtnUp_Pin))
                    {   // 抖动
                        return;
                    }
                    HAL_Delay(50);
                }
                btnOn = 1;
            }
        }
        else if(1 == btnOn && GPIO_PIN_SET == pinState)
        {   // 弹起
            // 防抖判断
            for(uint8_t i = 0; i < 5; ++i)
            {
                if(GPIO_PIN_SET != HAL_GPIO_ReadPin(BtnUp_GPIO_Port, BtnUp_Pin))
                {   // 抖动
                    return;
                }
                HAL_Delay(10);
            }
            btnOn = 0;
        }
        // 清除标志
        //__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    }
}

在中断中使用了HAL_GetTick()和HAL_Delay()函数,这个要求调整中断优先级,否则会在GPIO中卡死

GPIO中断优先级要比Time base的要低

STM32 STM32CubeMX 使用GPIO中断_第4张图片

 

 

你可能感兴趣的:(Stm32)