HAL_GPIO_EXTI_Callback()中的上升和下降触发边缘

时间:2018-02-09 14:16:48

标签: arm embedded stm32 cortex-m

我有一个数字输入GPIO行,每当输入改变时我需要一个中断。在STM32CubeMX中,我将此引脚设置为EXTI线,并将中断设置为在上升沿和下降沿触发。

当响应函数HAL_GPIO_EXTI_Callback()的上升沿或下降沿时,有没有办法知道它是触发中断的上升沿还是下降沿?或者是否有必要致电HAL_GPIO_ReadPin()来推断这一点?

回调的原型是:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

3 个答案:

答案 0 :(得分:3)

您必须致电HAL_GPIO_ReadPin()

当您在上升沿和下降沿选择中断时,STM32CubeMX实际上会设置Rising trigger selection register (EXTI_RTSRx)Falling trigger selection register (EXTI_FTSRx)中的相应位。

当发生中断时,该中断线的Pending register (EXTI_PRx)中只设置了一位,因此您不知道它是上升沿还是下降沿。

答案 1 :(得分:0)

是的,我就像你说的那样做了。 但是代码无法区分上升沿和下降沿。 这是代码:

   void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
    {
      if (GPIO_PIN_SET! = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_11))
      {// THIS CONNECTION IS ADDED. THEN THE SET TUSUNA CAN BE PERFORMED UP AND UP DOWN PRIOR.
        if (GPIO_Pin == GPIO_PIN_4) // PA4 rising edge or falling edge cut.
        {// Let's say the LCD is inverted. DOWN.
          // if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_SET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)))
          // {

          // A UCU
          if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_SET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4))) // While rising edge on PA4.
          {
            //tsHandle.tsButtonVariables.bButton_A_DusenKenar_B_Logic0 = 0;
            tsHandle.tsButtonVariables.bButton_A_YukselenKenar_B_Logic0 = 1;
            //tsHandle.tsButtonVariables.bButton_B_DusenKenar_A_Logic0 = 0;
            //tsHandle.tsButtonVariables.bButton_B_UpdateKenar_A_Logic0 = 0;
          }
          else if ((GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) && (GPIO_PIN_RESET == HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4))) // PA4 when the falling edge is occurring.
          {
            tsHandle.tsButtonVariables.bButton_A_DusenKenar_B_Logic0 = 1;
            //tsHandle.tsButtonVariables.bButton_A_YukselenKenar_B_Logic0 = 0;
            //tsHandle.tsButtonVariables.bButton_B_DusenKenar_A_Logic0 = 0;
            //tsHandle.tsButtonVariables.bButton_B_UpdateKenar_A_Logic0 = 0;
          }
          else
          {

          }
     }

答案 2 :(得分:0)

插入 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); 在HAL_GPIO_EXTI_Callback函数中。