STM32 Interrupt Handler wird nicht aufgerufen

Gast #4201568
Lesenswert?

Hey,

ich habe einen STM32F10x Controller und bekomme auf meinen GPIO PB9 ein 
Interrupt Signal. Mein Code dafür sieht so aus:

1
GPIO_InitTypeDef GPIO_InitStructure;
2
  EXTI_InitTypeDef EXTI_InitStructure;
3
  NVIC_InitTypeDef NVIC_InitStructure;
4

5
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
6

7
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
8
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
10
  GPIO_Init(GPIOB, &GPIO_InitStructure);
11

12
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
13

14
  EXTI_InitStructure.EXTI_Line = EXTI_Line9;
15
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
16
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
17
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
18
  EXTI_Init(&EXTI_InitStructure);
19

20
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
21

22
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
23
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
24
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
25
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
26
  NVIC_Init(&NVIC_InitStructure);
27

28
  while(1) {
29

30
  }

Der Handler in der Datei "stm32f10x_it.c" sieht so aus:
1
void EXTI9_5_IRQHandler(void)
2
{
3
  int i = 0;
4
  i = 2;
5
  print_text("a");
6
}

Leider wird der Handler nicht aufgerufen, wenn das Interrupt Signal 
kommt.
Weiß da jemand weiter?
Gast #4201575
Lesenswert?

Hallo;


stm32int schrieb:
> while(1) {
>
>   }




1. Bau hier mal eine "Zwangspause ein"
   Beispiel ein "ToggleBit" mit 2 Sekunden Intervall
Ich wei0 nicht wie sich das verhält, wenn "Main" leer ist.

2. Den Nichtaufruf deiner Routine hast du sicher mit einem Debugger 
geprüft ? --> Brakepoint ?
Gast #4201692
Lesenswert?

Uwe schrieb:
> versuchs mal damit:
> EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

Das war der Fehler, jetzt geht es.
Mich interessiert jetzt noch wieso. Ich dachte die vorherige Option war 
dafür da in beiden Fällen (rising/falling) zu funktionieren?
Gast #4201706
Lesenswert?

stm32int schrieb:
> Das war der Fehler, jetzt geht es.
> Mich interessiert jetzt noch wieso. Ich dachte die vorherige Option war
> dafür da in beiden Fällen (rising/falling) zu funktionieren?

Hatte ich auch schon das Problem. Musste dann manuell hin und her 
schalten zwische rising und falling edge detection. Habs auch nicht 
verstanden...
Gast #4201768
Lesenswert?

Ich schalte die Triggerflanke im IRQ um. Ich beginne bei der 
Initialisierung mit TriggerRising und setzt die Hilfsvariable auf 1.
1
void EXTI0_IRQHandler(void) {
2
  uint16_t cnt;
3
  static uint8_t triggerRising = 1;
4

5
        // Zu Beginn das Interrupt Flag loeschen
6
  EXTI_ClearITPendingBit(EXTI_Line0);
7
  cnt =  TIM_GetCounter(TIM4);
8
        
9
        // do something
10

11
  if (triggerRising) {
12
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
13
    triggerRising = 0;
14
  } else {
15
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
16
    triggerRising = 1;
17
  }
18
  EXTI_Init(&EXTI_InitStructure);
19

20
}

Btw. wie kann ich in dem Eingabefeld hier ein "TAB" eingeben?

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