Ich verwende die STM32F7-Discovery-Karte und habe versucht, den DWT-Zykluszähler zu aktivieren. Von dem, was ich online gesehen haben sollte dies ausreichen, es zu ermöglichen:STM32 - So aktivieren Sie den DWT-Zykluszähler
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;
Wenn jedoch jemals betreibe ich diesen Code die Werte nicht geändert oder die Operationen sind übersprungenen (Ich bin nicht sicher, was passiert ist).
Ich habe versucht, Zeiger auf die Adressen im Speicher zu machen und sie direkt ohne Erfolg auch zu ändern. Ex:
volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000;
volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004;
volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC;
*DEMCR = *DEMCR | 0x01000000;
*DWT_CYCCNT = 0;
*DWT_CONTROL = *DWT_CONTROL | 1;
Derzeit ist die einzige Art, wie ich bekommen habe das ist, wenn sie mit dem Debugger in Visual Studio (mit VisualGDB) Schreiten durch, wenn ich den Wert von DWT-> CTRL auf den ON-Wert ändert sich der Zyklus Zähler beginnt. Abgesehen davon, kann ich nicht den Wert bekommen, den Code zu ändern.
Edit: Was könnte das Verhalten verursachen, wo diese Codezeilen ihre Aufgaben nicht ausführen, aber auch nicht abstürzen und fortfahren.
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;
Nachdem diese Zeilen von Codes ausgeführt wird, alle Werte an diesen Speicherstellen gleich bleiben und nicht mit den Operationen verändert, die durchgeführt werden sollen, um.
Z.B. :
//DWT_CTRL_CYCCNTENA_Msk = 1
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk
Sollten im Wert von DWT-> führen CTRL 0x40000001 zu sein, aber es bleibt bei dem Standardwert 0x40000000
Die folgenden Bilder sind ein Beispiel dafür, was während der Laufzeit auftritt.
"Die Werte werden nicht geändert oder die Operationen werden übersprungen "- Warum erfährst du es nicht bevor du fragst? Und benutze die CMSIS-Header. Definieren Sie keine eigenen Register. Übrigens. Die Definitionen erzeugen viel mehr Code, da Sie die Zeiger als Variablen definieren. (Denken Sie nicht an ybout 'const' Qualifier, sie werden immer noch Variablen sein.) – Olaf
Nun, ich bin durch sie gegangen und die Operationen sehen aus wie sie auftreten, aber die Werte ändern sich nicht für jeden Speicherort, den ich bearbeiten möchte . Ich habe versucht, es ohne viel Nutzen herauszufinden, also dachte ich mir, der logische nächste Schritt wäre, nachzufragen. – KenQueso
Sollte funktionieren nach [dies] (http://stackoverflow.com/questions/13379220/generating-nanosecond-delay-in-c-on-stm32). Beachten Sie, dass der Debugger den DWT für seine eigenen Zwecke verwendet, wenn Sie den Debugger verwenden. Sie können den Debugger daher nicht wirklich mit diesem Code verwenden. – user3386109