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!
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.