Interrupts bei discoveryf4

Gast #4003104
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);
        }
}
Gast #4003165
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren