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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.