Forum: Mikrocontroller und Digitale Elektronik STM32H7: HRTIM im DMA Burst Mode für PWM Waveform Erzeugung einsetzen


von Chris R. (rodi)


Angehängte Dateien:

Lesenswert?

Hallo Kollegen,

ich versuche seit längerem vergeblich den HRTIM (High resolution timer) 
des STM32H743ZI2 Nucleo Boards dazu zu bringen, mit dem Timer Period 
Event des Master Timers einen synchronen DMA Burst Transfer auf die 
Compare Register der HRTIM TIMA, TIMB und TIMC durchzuführen.

Die Compare Matches setze ich zum Erzeugen dreier unterschiedlicher PWM 
Signale ein, die jeweils ein komplementäres PWM Signal besitzen 
(Deadtime-Funktion).

Die Werte für die Compare Matches liegen in einem DMA Buffer (Lookup 
Table) static uint32_t  lut[1000][3] mit 1000 Einträgen für jeden der 
drei Compare Registers.

Das Problem ist, dass die Compare Match Register nicht aktualisiert 
werden.
Mir kann entweder mit einem funktionierenden Beispiel (HRTIM + DMA Burst 
Mode) oder mit einem Review meines Minimalbeispiels im Anhang geholfen 
werden.

Ich verwende CubeIDE v 1.12.1

Vielen Dank!

von Harry L. (mysth)


Lesenswert?

DMA auf einem F7/H7 mit Cache geht ohne passend konfigurierte MPU 
zwangsläufig in die Hose.

Mach das erstmal mit nem Kleinen ohne Cache (M4) - wenn das funktioniert 
kannst du dich an die Grossen wagen.

von J. S. (jojos)


Lesenswert?

ob es ein Cache Problem ist kann man einfach testen indem man den 
D-Cache deaktiviert. Hier im Code wird er gleich zweimal nacheinander 
aktiviert, doppelt ist besser?
Dann muss man noch kontrollieren ob der DMABuffer auch in einem Speicher 
liegt der vom DMA erreicht werden kann. Deshalb ist es wichtig DMA 
Speicher im Linkerfile auf feste Adressen zu legen.

von Chris R. (rodi)


Lesenswert?

Harry L. schrieb:
> DMA auf einem F7/H7 mit Cache geht ohne passend konfigurierte MPU
> zwangsläufig in die Hose.

Hallo Harry,

vielen Dank für diesen Hinweis. Leider liegt die Auswahl des Controllers 
nicht in meiner Hand und ich habe auch kein weiteres Devboard.

Wie müsste denn die MPU in diesem Fall konfiguriert werden?
Im Cube MX gibt es unter "Cortex Memory Protection Unit Control 
Settings" lediglich vier Auswahlmöglichkeiten.

Hallo J.S.,
J. S. schrieb:
> ob es ein Cache Problem ist kann man einfach testen indem man den
> D-Cache deaktiviert.

Auch dir vielen Dank für die Antwort.

Ich habe nun alle Caches (D & I) deaktiviert. Es funktioniert leider 
noch immer nicht. In welcher Memory Section müssen die Werte liegen? Der 
DMA1 Controller hat meines Wissens über eine Brücke Zugang zum RAM_D1, 
in dem die Werte aktuell gehalten werden.
Muss ich nun:
- Die D1 -> D2 Domainbrücke konfigurieren (Wenn ja, wie?) oder
- Die Werte in Domain D2 legen (Wenn ja, wie?) oder
- DMA2 statt DMA1 verwenden?

Die Problematik der Caches habe ich nach diesem Eintrag 
(https://community.st.com/s/article/FAQ-DMA-is-not-working-on-STM32H7-devices) 
Abschnitt 5 mit dem Befehl -> SCB_CleanDCache_by_Addr zu behandeln 
versucht. Für den DMA des UART Moduls hat das auch bisher funktioniert.

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.