Forum: Mikrocontroller und Digitale Elektronik STM32F4 EXTI Problem


von Gabriel (Gast)


Lesenswert?

Hallo,

bin gerade dabei mich mit dem STM32F4 Discovery Board anzufreunden. 
Stehe jetzt vor einem Problem, bei dem ich nicht unbedingt weiter weiß. 
Und zwar will ich sobald der USER-Button gedrückt wird, eine LED toggeln 
lassen und einen Zahl inkrementieren und diese via USB-Schnittstelle 
ausgeben. Alles soll über einen IRQHandler laufen. (Im Beispiel ist der 
Code für die USB-Kommunikation nicht enthalten. Die hab ich aus dem 
ST-Beispielprogramm genommen und ist auch funktionstüchtig).
1
#include "ch.h"
2
#include "hal.h"
3
#include "test.h"
4
5
#define ARM_MATH_CM4
6
#include "arm_math.h"
7
8
#include "irqconf.h"
9
#include "usbcfg.h"
10
11
// Code für USB-Kommunikation nicht enthalten
12
13
// Declare & initialize IRQ counter
14
static uint32_t irq_cnt = 0;
15
16
// IRQ function
17
void EXTI0_IRQHandler(void) {
18
  palSetPad(GPIOD,GPIOD_LED3);
19
  /* Make sure that interrupt flag is set.
20
   ((uint32_t)0x00001) equals EXTI Line 0*/
21
  if ((EXTI->PR & (uint32_t)0x00000001) != (uint32_t)RESET){
22
    palTogglePad(GPIOD,GPIOD_LED5);
23
    // Do the actual work
24
    irq_cnt++;
25
    // Clear interrupt flag for EXTI0
26
    EXTI->PR |= EXTI_PR_PR0;
27
  }
28
}
29
30
int main(void) {
31
  
32
  halInit();
33
  chSysInit();
34
35
  palSetPadMode(GPIOA, GPIOA_BUTTON, PAL_MODE_INPUT);
36
  irq_init();
37
38
  while (true) {
39
    chprintf((BaseSequentialStream *)&SDU1,"IRQcounter: %u \r\n", IRQcounter);
40
    }
41
    chThdSleepMilliseconds(500);
42
  }
43
}

In irq_conf.c ist folgender Code enthalten:
1
#include "ch.h"
2
#include "hal.h"
3
4
void irq_init(void)
5
{
6
  // IO port A clock enable
7
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
8
  // System configuration controller clock enable
9
  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
10
11
  // Enable IRQ for ext. signals, line EXTI0_IRQn. Enables the handling for the
12
  // given interrupt request (IRQ#)
13
  NVIC_EnableIRQ(EXTI0_IRQn);
14
15
  // Clear EXTI0 bit field
16
  SYSCFG->EXTICR[0] &= ~(SYSCFG_EXTICR1_EXTI0);
17
  // EXTI x configuration. Select PA to make IRQ EXTI0
18
  SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA;
19
20
  // Rising trigger event configuration bit of line A
21
  EXTI->RTSR |= EXTI_RTSR_TR0;
22
23
  // Enable interrupt on EXTI0
24
  EXTI->IMR |= EXTI_IMR_MR0;
25
26
//  EXTI->SWIER |= EXTI_SWIER_SWIER0;
27
28
  //END OF IRQ STUFF
29
}

In irq_conf.h:
1
#ifndef IRQ_H
2
#define IRQ_H
3
4
void irq_init(void);
5
6
#endif /* IRQ_H */

Zum Problem: Sobald ich den USER-Button drücke, "hängt" sich die 
USB-Kommunikation auf (IRQcounter: wird nicht mehr ausgegeben). Zudem 
wird die IRQ Funktion nicht aufgefrufen (sonst würde LED3 leuchten). 
Auch wenn ich einen Software-Interrupt generiere, passiert genau das 
selbe wie beim Hardware-Interrupt über den USER-Button. Vielleicht kann 
mir jemand weiterhelfen. Bin über jede Hilfe dankbar. Ich versuche alles 
ohne die stm32f4xx libraries zu lösen.

Lg Gabriel

von Little B. (lil-b)


Lesenswert?

Wenn du ein Discovery Board hast, kannst du das auch debuggen.
Wo bleibt dein Programm denn hängen?

Ich finde in deinem Code kein NVIC Priority Grouping. Die muss 
eingestellt werden, damit es fehlerfrei läuft.

Auch hast du zwar den EXIT0 eingeschaltet, aber keine Priorität 
vergeben.

von Gabriel (Gast)


Lesenswert?

Danke für die schnelle Rückmeldung! Das Programm hängt sich auf, sobald 
ich den USER-BUTTON drücke und beim Software-Interrupt sobald das SWIER 
bit gesetzt ist.

Ok, dann werd ich noch die NVIC und EXTI Prioritäten vergeben.

von Little B. (lil-b)


Lesenswert?

Gabriel schrieb:
> Das Programm hängt sich auf, sobald
> ich den USER-BUTTON drücke und beim Software-Interrupt sobald das SWIER
> bit gesetzt ist.

Das hast du bereits erwähnt.
Ich wollte wissen, wo dein Programm Counter steht, wenn er sich 
aufgehängt hat.
Das klingt aber nach Hard Fault, da ein paar Sachen noch nicht richtig 
eingestellt sind.

von Martin K. (martinko)


Lesenswert?

pack das mal

// Clear interrupt flag for EXTI0
    EXTI->PR |= EXTI_PR_PR0;

an den Anfang der if Bedingung

Gruß Martin

von Gabriel (Gast)


Lesenswert?

@Little Basdart:
Wenn ich das Programm laufen lasse, wird folgendes angezeigt, bis es 
sich aufhängt.
1
target halted due to debug-request, current mode: Thread 
2
xPSR: 0x01000000 pc: 0x080001c0 msp: 0x20000400
3
Info : Padding image section 0 with 4 bytes
4
target state: halted
5
target halted due to breakpoint, current mode: Thread 
6
xPSR: 0x61000000 pc: 0x20000042 msp: 0x20000400
7
target state: halted
8
target halted due to debug-request, current mode: Thread 
9
xPSR: 0x01000000 pc: 0x080001c0 msp: 0x20000400
10
Info : halted: PC: 0x08008784

Persönlich sagt mir das nichts, aber vielleicht dir. Sobald der Button 
gedrückt ist, ist in der Console alles weg. Wie ich da auf den Programm 
Counter zugreifen kann, weiß ich leider nicht (arbeite mit ChibiOS).
Hab noch eine Frage. Wie kann man bei EXTI Prioriäten vergeben? Bei NVIC 
hab ich im PM0214 Datenblatt was gefunden.

@Martin K.:
hat leider auch nichts gebracht. Es tritt der selbe Fehler auf.

von Martin (Gast)


Lesenswert?

Für die Prioritäten kannstu du die CMSIS funktion SetPriority(xxx_IRQn, 
0..16) nutzen.

von Gabriel (Gast)


Lesenswert?

Danke! Werd ich mal versuchen, eventuell funktioniert es dann.

Lg

von Stm M. (stmfresser)


Lesenswert?

Auf Discovery Board läuft µPython
https://github.com/micropython/micropython.

Vielleicht isses was für dich.

von Martin (Gast)


Lesenswert?

Ich denke aber nicht, dass es an den prioritäten liegt. Nach dem Reset 
ist jede Prio auf 0, also nicht maskierbar. Damit wird der Interrupt auf 
jeden fall ausgeführt. Du solltest mal schauen, ob er im Hardfault 
Handler hängen bleibt. Dann ist vielleicht im Startup Code der handler 
nicht richtig definiert. Sonst sollte alles passen.

von Gabriel (Gast)


Lesenswert?

Hallo,

kann es sein, dass es zu irgendwelchen Komplikationen mit ChibiOS kommen 
könnte? Es gibt ja die Driver Configuration Structure (EXTConfig). Oder 
ist das nicht ausschlaggebend?

Lg

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.