Forum: Mikrocontroller und Digitale Elektronik STM32F103 Hardfault


von Peter K. (peterka2000)


Angehängte Dateien:

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:
1
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:
1
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:
1
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?

von MaWin (Gast)


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.

von Peter K. (peterka2000)


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.

von Dennis H. (c-logic) Benutzerseite


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.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


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.

von Bauteiltöter (Gast)


Lesenswert?

Das hier führt sicher zum Hardfault:
1
void(*fail) (void);
2
fail=0;
3
fail();

Gibt aber eine Compilerwarnung, denke ich.

von Peter K. (peterka2000)


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:
1
__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

von Reginald L. (Firma: HEGRO GmbH) (reggie)


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!"

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

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

von Dennis H. (c-logic) Benutzerseite


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.

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.