STM32 WWDG-Interrupt ausgelöst, wenn nicht konfiguriert

8

Ich habe eine Anwendung, die ich von der Kieler IDE portiere, um mit der GNU-Werkzeugkette aufgrund von Lizenzproblemen zu bauen. Ich konnte die Anwendung erfolgreich auf dem Gerät einrichten, erstellen, flashen und ausführen.

Die Anwendung auf der GNU-Seite ist aus irgendeinem Grund in dem schwach verknüpften IRQ-Handler für die WWDG stecken geblieben, die eine Endlosschleife ist. Die Anwendung aktiviert die WWDG nicht, und sie ist beim Zurücksetzen standardmäßig deaktiviert. Ich habe auch überprüft, dass die Konfigurationsregister ihre Standard-Startwerte haben.

Der einzige Unterschied, abgesehen von Compilern, sind die Linker und Startup-Dateien. Sowohl die Startdateien als auch die Linkerdateien, die von beiden Toolketten verwendet werden, sind jedoch Standardwerte, die von STM generiert werden.

Irgendeine Idee, was das verursachen könnte? Ich bin hier ungefähr am Ende.

Lassen Sie mich wissen, ob andere Informationen hilfreich sein könnten.

BEARBEITEN: Mit den folgenden Kommentaren konnte ich feststellen, dass tatsächlich der HardFault_Handler ausgelöst wird. Ich habe die Backtrace-Ausgabe unten enthalten, wenn das hilfreich sein kann

GDB BT:

0 HardFault_Handler ()

1 (Signalhandler genannt)

2 0x720a3de in ?? ()

3 0x80005534 in foo ()

Backtrace gestoppt: Vorheriger Frame identisch mit diesem Frame (beschädigter Stack?)

2 Dinge fallen mir auf, obwohl ich kein Gdb-Experte bin. 1) foo ist keine Funktion, es ist eine Konstante Array von Zeichen und 2) 0x0720a3de ist keine gültige Speicheradresse der Flash-Adressbereich beginnt bei 0x08000000

    
gettingSmarter 23.12.2014, 16:04
quelle

4 Antworten

7

Also dank dem Tritt in die Hose von D Krüger. Ich konnte feststellen, dass HardFault_Handler das war, was tatsächlich aufgerufen wurde. Wer also in diesem Post stolpert, verifiziert, welcher IRQ wirklich aufgerufen wird, indem er temporäre Funktionen schreibt, um die wahrscheinlichen Täter, d. H. HardFault, abzudecken. Das wahre Problem für den IRQ-Aufruf ist ein schlechter Speicherzugriff durch memcpy, auf dem ich mich auf dem Weg zur nächsten Lösung befinde.

    
gettingSmarter 23.12.2014 17:54
quelle
4

Ich hatte genau den gleichen Fehler wie OP (scheinbarer WWDG-Interrupt, aber eigentlich HardFault_Handler feuern), wenn ich ein Beispiel für die STM32F3-Discovery-Karte portierte, um sie in CooCo1 CoDe 1.7.7 mit STM32Cube F3-Bibliotheken (v1.1.0) zu kompilieren. Der Code lief einwandfrei, solange ich keine Interrupts verwendete, aber sobald ich den SysTick-Timer-Interrupt einschaltete, wurde die HardFault-Ausnahme ausgelöst.

Das Problem war, dass ich es versäumt habe, die Dateien stm32f3xx_it.h und stm32f3xx_it.c in das Projekt aufzunehmen. Ihre Abwesenheit verursachte keine Compiler-Warnungen / Fehler. Sobald sie zusammengestellt wurden & amp; verlinkt, lief der Code mit Interrupts gut.

    
Bjarne Hansen 02.02.2015 02:34
quelle
0

Ich hatte ein sehr ähnliches Problem beim Zusammenführen von zwei Projekten, die von STM32CubeMX für einen STM32F2XX-Prozessor separat generiert wurden. Ein Projekt verwendete das Ethernet-Peripheriegerät, das andere nicht. Abgesehen von diesem einen Unterschied verwendeten die beiden Projekte den gleichen Satz von Peripheriegeräten.

Nach der Integration der beiden Projekte durch manuelles Kopieren von Dateien würde die Anwendung nach dem Start der ersten Aufgabe (wenn Interrupts zum ersten Mal aktiviert werden) im WWDG_IRQHandler enden. Ich habe zuerst bestätigt, dass das WDGA-Bit des WWDG-Registers tatsächlich nicht gesetzt war und daher das WWDG-Peripheriegerät deaktiviert wurde. Als nächstes verifizierte ich, dass die Interrupt-Vektortabelle korrekt initialisiert wurde. Endlich, nach mehreren Stunden des Grabens, wurde mir klar, dass ich die ETH_IRQHandler-Funktion in stm32f2xx_it.c nicht definiert hatte, was dazu führte, dass der Ethernet-Interrupt vom Standard-Handler behandelt wurde und sich als WWDG_IRQHandler maskierte - wahrscheinlich aufgrund der Optimierung. p>     

awilhite 20.10.2017 13:34
quelle
0

Ich hatte dieses Problem aufgrund der gleichen Ursache wie awilhite . Ich verwende Atollic TrueStudio 8.0.0. Ich habe es verwendet, um ein Projekt für STM32F030 und (wahrscheinlich manuell) hinzugefügt Bibliotheken Ordner mit stm32f0xx.h, die ADC1_IRQn definiert (IRQ Kanalnummer in NVIC-Setup verwendet).

Und ich habe ADC1_IRQHandler (void) in meiner main.c implementiert (wie ich es gewohnt bin und es hat immer so weit funktioniert - x_IRQn - & gt; x_IRQHandler)

Aber nach zwei Tagen Frustration fand ich heraus, dass startup_stm32f0xx.s in meinem Projekt ADC1_COMP_IRQHandler definiert.

Letztendlich war mein ADC-Interrupt-Handler undefiniert und als der ADC den Interrupt erzeugte, stürzte das Programm ab (WWDG-Interrupt).

Ich hoffe, dass dies Leuten wie mir hilft, die denken, dass sie ihren Handler implementiert haben, aber tatsächlich nicht.

    
Mike 30.10.2017 08:28
quelle

Tags und Links