Forum: Mikrocontroller und Digitale Elektronik STM32 Interrupt Handler wird nicht aufgerufen


von stm32int (Gast)


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?

von Ich selber (Gast)


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 ?

von stm32int (Gast)


Lesenswert?

1) Habe ich gemacht, funktioniert aber trotzdem nicht
2) ja, habe ich

von Uwe (Gast)


Lesenswert?

Schau in Zeile 42 :-)

von stm32int (Gast)


Lesenswert?

Uwe schrieb:
> Schau in Zeile 42 :-)

Wie soll ich das jetzt verstehen? Wenn Informationen fehlen dann einfach 
Bescheid sagen.

von Uwe (Gast)


Lesenswert?

versuchs mal damit:
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

von Uwe (Gast)


Lesenswert?


von Walter T. (nicolas)


Lesenswert?

stm32int schrieb:
> GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

Fehl da nicht noch etwas wie:
1
// Connect Button EXTI Line to Button GPIO Pin
2
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource9);

von stm32int (Gast)


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?

von Bernd (Gast)


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...

von stm32int (Gast)


Lesenswert?

Genau das Problem habe ich jetzt auch. Wie genau hast du das "gelöst"?

von Bernd (Gast)


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?

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.