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