STM32F103 Hardfault

OP #4681771
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?
Angehängte Dateien:
Gast #4681783
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.
(Firma: HEGRO GmbH) #4682076
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.
OP #4682257
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren