芯片: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的要低