Forum: Compiler & IDEs Interrupts bei discoveryf4


von Alex (Gast)


Lesenswert?

Hey,
ich habe ein kleines problem mit den interrupts bei meinem discovery.
ich habe auf 2 pins einen interrupt auf toggle gesetzt. wenn ich jetzt 
mit einem kabel GND verbinde, ändert eine LED die beim interrupt 
ausgelöst wird, leider nicht jedes mal den zustand. es scheint als 
würden die flanken nicht registriert werden.
hier mal der code:

void Configure_PB15_PB14(void) {
    /* Set variables used */
    GPIO_InitTypeDef GPIO_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    /* Enable clock for GPIOD */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    /* Enable clock for SYSCFG */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    /* Set pin as input */
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);


    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource15);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14);

    EXTI_InitStruct.EXTI_Line = EXTI_Line15 | EXTI_Line14;

    EXTI_InitStruct.EXTI_LineCmd = ENABLE;

    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;

    EXTI_Init(&EXTI_InitStruct);

    /* Add IRQ vector to NVIC */
    /* PD0 is connected to EXTI_Line0, which has EXTI0_IRQn vector */
    NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
    /* Set priority */
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
    /* Set sub priority */
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    /* Enable interrupt */
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    /* Add to NVIC */
    NVIC_Init(&NVIC_InitStruct);
}

void EXTI15_10_IRQHandler(void) {
    /* Make sure that interrupt flag is set */
    if (EXTI_GetITStatus(EXTI_Line15) != RESET) {
        /* Do your stuff when PD0 is changed */


      if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15))
          {
            GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_SET);  //orange
          }
          else
          {
            GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_RESET);
          }

        /* Clear interrupt flag */
        EXTI_ClearITPendingBit(EXTI_Line15);
    }

    if (EXTI_GetITStatus(EXTI_Line14) != RESET) {
            /* Do your stuff when PD0 is changed */

          if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
              {
                GPIO_WriteBit(GPIOD,GPIO_Pin_14,Bit_SET);  //rot
              }
              else
              {
                GPIO_WriteBit(GPIOD,GPIO_Pin_14,Bit_RESET);
              }


            /* Clear interrupt flag */
            EXTI_ClearITPendingBit(EXTI_Line14);
        }
}

von Schaulus Tiger (Gast)


Lesenswert?

Vermutlich werden die Flanken durchaus registriert, sogar viel mehr, als 
dir lieb ist. Wenn z.B. 41 Flanken registriert werden, wechselt die LED 
den Zustand, bei 42 Flanken scheinbar nicht, weil sie am Ende wieder 
im gleichen Zustand ist. Mit "Kabel gegen GND" erzeugt man unfreiwillig 
viel mehr als eine Flanke. Und die EXTI Interrupts werden überhaupt 
nicht gefiltert (zumindest nicht von der STM32F2xx-Hardware).

von Eric B. (beric)


Lesenswert?

Alex schrieb:
> ich habe auf 2 pins einen interrupt auf toggle gesetzt.

Nö. Wenigstens nicht wenn ich das hier richtig interpretiere:

>     EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;

Also kein Interrupt auf der fallende Flanke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.