STM32 STM32CubeMX 使用GPIO中斷

芯片:STM32 F412

這裏只寫GPIO中斷相關內容

打開STM32CubeMX,鼠標左鍵點擊需要設置GPIO中斷的引腳,選擇GPIO_EXTI*,鼠標右鍵點擊可以設置自定義LABEL

設置GPIO中斷觸發模式,我這裏設置了上升沿和下降沿都觸發

使能GPIO中斷

添加中斷函數

/** 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的要低

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章