mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F103 Hardfault


Autor: Peter K. (peterka2000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

zurzeit versuche ich den Timer 1 eines STM32F103C8T6 (auf so einem 
Mini-Development-Board) per DMA zu füttern. Die (glaube ich) wichtigsten 
Quelldateien sind anbei.

Im main rufe ich eine Cube-Methode auf:
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_2, testData, 2);

In der Funktion rutscht der in den Hardfault-Handler. Wenn ich den 
Debugger im Einzelschritt-Modus laufen lasse, sehe ich, dass folgende 
Zeile den Hardfault auslöst:
htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
Eigentlich nur eine Zuweisung eines Funktionszeigers in eine DMA-Handle. 
Danach springt der in den Hardfault.

Das Hardfault Status Register steht an der Stelle auf 0x40000000, was - 
soweit ich weiß - ein Indikator für einen Forced Hardfault ist. 
MemMenage Fault Address Register und BusFault Address Register stehen 
beide auf  0xe000edf8. Wenn ich mir die die Disassembly an der Stelle 
anschaue, steht da:
movs r0, r0
. Das sieht für mich - ohne Assemblerkentnisse - sehr nach nichts tun 
aus.

Könnte mich jemand, der bereits mehr Erfahrung mit solchen Themen und 
Fehlern hat, bei der gezielten Fehlersuche und dem Debugging 
unterstützen? Ist solch ein Fehler schon irgendwie bekannt? Im 
Errata-Sheet habe ich auf die Schnelle nichts gefunden.

Grüße
Peter

PS: Weiß nicht, ob ich es schon geschrieben habe: Das ist so ein 
chinesisches Mini-Board mit dem STM32F103C8T6. Sind eventuell Fakes von 
den Chips bekannt, der irgendwelche Hardware-Bugs hat?

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter K. schrieb:

> PS: Weiß nicht, ob ich es schon geschrieben habe: Das ist so ein
> chinesisches Mini-Board mit dem STM32F103C8T6. Sind eventuell Fakes von
> den Chips bekannt, der irgendwelche Hardware-Bugs hat?

Es gibt jede Menge Fakes der STM-Chips. In praktisch jeder 2. Garage in 
China werden diese ICs auf kleinen Spezialkochern, sogenannten WOKs, 
frittiert & friesiert.

Autor: Peter K. (peterka2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach?! Ich dachte, dass in Woks nur Nudeln gebraten werden :)

Hat denn wenigstens jemand ähnliche Probleme mit den China-Chips? So 
könnte ich wenigstens ruhig schlafen und den Asiaten die Schuld 
zuweisen.

Autor: Dennis Heynlein (c-logic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError

Das ist halt nur keine Adresse in der Peripherie und wird vom 
DMA-IRQ-Handler benutzt.
Die DMA-Hardware kennt keine Callback-Adressen.

Schreibst du vielleicht auf einen Speicherbereich den es nicht 
gibt/geben kann.

Autor: Reginald Leonczuk (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis H. schrieb:
> htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError
>
> Das ist halt nur keine Adresse in der Peripherie und wird vom
> DMA-IRQ-Handler benutzt.
> Die DMA-Hardware kennt keine Callback-Adressen.
>
> Schreibst du vielleicht auf einen Speicherbereich den es nicht
> gibt/geben kann.
Bisher kamen all meine hard faults immer durch selbstverschuldete, 
fehlerhaft Adressenvergaben.

Autor: Bauteiltöter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier führt sicher zum Hardfault:
void(*fail) (void);
fail=0;
fail();

Gibt aber eine Compilerwarnung, denke ich.

Autor: Peter K. (peterka2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dass der Funktionspointer nichts mit der DMA-Peripherie an sich zu tun 
hat, war mir schon klar. Hab ich mich vielleicht ein wenig unglücklich 
ausgedrückt, das ist halt - wie du schon sagtest - nur ein Zeiger auf 
eine Routine, die bei bestimmten Interrupts aufgerufen wird.

Den Hardfault-Fehler habe ich vorerst gelöst. In der 
HAL_TIM_Base_MspInit wird folgendes aufgerufen:
__HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_UPDATE],hdma_tim1_up);

Damit wird die HAL-DMA-Handle mit dem Index TIM_DMA_ID_UPDATE 
initialisiert. In meiner HAL_TIM_PWM_Start_DMA wird aber mit dem Index 
TIM_DMA_ID_CC2 gearbeitet - der zeigt nirgendwo sinnvoll hin. Das gibt 
dann den Hardfault.

Funktional gibt es allerdings noch ein paar Probleme, wahrscheinlich 
auch auf mein Verständnis der HAL-Libraries zurückzuführen. Da kann ich 
aber (vorerst) selber debuggen

Autor: Reginald Leonczuk (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bauteiltöter schrieb:
> void(*fail) (void);
> fail=0;
> fail();
Wow Top! GCC gibt keine Meldung raus, ich bekomme einen zuverläsiggen 
Hardfault :> Klasse Antwort auf meinen Thread:
Beitrag "HardFault will nicht!"

Autor: Dennis Heynlein (c-logic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal das Stückchen Assemblercode mit den passenden Registerinhalten 
wenn du den Teil ausführst der Hardfault gibt

Autor: Dennis Heynlein (c-logic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
movs r0,r0 ist nicht nichts

das s in movs sagt setzte die Application Program Status Bits  N & Z 
passend zum Inhalt von R0.

https://www.mikrocontroller.net/articles/Cortex-M3

Der Befehl vorher kann das scheinbar nicht.

mov r0,r0 wäre der No Operation Befehl.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.