Forum: Compiler & IDEs Debug mit Watchdog STM32+CubeIDE


von Ingo S. (ingo-s)


Lesenswert?

Hi,

laut STM32G0xx Datenblatt hat der Debugger die Möglichkeit den Watchdog 
anzuhalten (DBG APB freeze register 1).
Das wäre eine prima Möglichkeit, auch mit aktivem WatchDog zu debuggen.

Nur finde ich unter Verwendung des ST-Link dazu keine 
Einstellmöglichkeit.
Habe ich da was übersehen oder wird das von der CubeIDE nicht 
unterstützt oder ist nur mit dem SEGGER J-Link möglich?

Gruß Ingo

von Bauform B. (bauformb)


Lesenswert?

Bei meinem L451 kann ich das Bit einfach wie jedes andere setzen. Die 
Frage ist nur, wie Register und Bit bei dir heißen. Aber Bit 11 oder 12 
für den WWDG bzw. IWDG im DBG APB freeze register 1 ist eigentlich 
eindeutig.

Anders gesagt: das muss ja nicht der Debugger machen, eine Zeile am 
Anfang von main() sollte auch reichen.

von Ingo S. (ingo-s)


Lesenswert?

Danke,
ich habe das mal ausprobiert, es lässt sich nicht per code setzen.
LL_DBGMCU_APB1_GRP1_FreezePeriph(LL_DBGMCU_APB1_GRP1_IWDG_STOP);

Leider stimmt die Datenblatt Einschränkung:
"It can be written by the debugger under system reset."

der Zusatz:
"it is still possible to write this register by software."
fehlt bim STM32G0xx leider.

von pegel (Gast)


Lesenswert?

Kannst ja mal versuchen, ob im Debug Fenster unter SFRs -> IWDG irgend 
etwas änderbar ist.

von Ingo S. (ingo-s)


Lesenswert?

Einfache Register, wie GPIOn lassen sich zwar nicht beim Debug Start at 
main() ändern, aber nach dem GPIO_Init(), das könnte am fehlenden Clock 
liegen.
Das freeze register lässt sich leider nicht ändern, bzw. man kann zwar 
einen Wert eintragen, der aber beim Abschluss der Eingabe wieder 
gelöscht wird.

von RAc (Gast)


Lesenswert?

ich weiss nicht ob das beim M0+ auch geht, aber beim M3/M4/M7 kannst Du 
in deiner Firmware herausfinden, ob ein Debugger angeschlossen ist (bit 
0 im DHCSR Register), damit kannst Du zum Startup entscheiden, ob der 
Watchdog aktiv sein soll oder nicht. Funktioniert wunderbar bei uns...

von pegel (Gast)


Lesenswert?

Zur Not kann man den Wachhund und alles was er so braucht in ein 
einfaches #ifdef einsperren.

von RAc (Gast)


Lesenswert?

Klar, das geht immer. Die dynamische Variante hat aber den Charme, dass 
sich die Release Version (notfalls im Feld) debuggen lässt, ohne eine 
Debug Firmware einspielen zu müssen.

von Haha (Gast)


Lesenswert?

Wer einen Debugger benötigt kann nicht programmieren. Such dir ein 
anderes Hobby.

von Ingo S. (ingo-s)


Lesenswert?

Das mit dem #ifdef habe ich bisher gemacht, ist ja auch kein Problem.

Mir ist nur aufgefallen, das man ja auch ganz gezielt andere Timer beim 
debuggen anhalten kann. Das könnte ja mal in speziellen Fällen hilfreich 
sein, wenn man dann die Information direkt zur Umsetzung zur Verfügung 
hat und nicht mühsam suchen muss.

Im Moment habe ich da kein Problem, aber vorher schlau machen für den 
Fall des es mal hilfreich ist, ist ja nicht verkehrt.

Auf der embedded sollte man die fehlende Info bekommen können.

von Bernd K. (prof7bit)


Lesenswert?

Haha schrieb:
> Wer einen Debugger benötigt kann nicht programmieren. Such dir ein
> anderes Hobby.

Ja. Und wer eine Wasserwaage braucht um ein Regal aufzuhängen hat nen 
Knick in der Optik, wer einen Bagger benutzt um ein Loch zu graben ist 
nur zu faul zum Schaufeln, wer ein Mikroskop zur Sichtkontrolle von 0201 
benötigt sollte mal mit seinem Augenarzt sprechen, wer 
Qualitätssicherung betreibt hat einfach nur seine Produktion nicht im 
Griff und wer einen Schraubendreher braucht um Schlitzschrauben 
festzuziehen sollte lieber mal rausfinden warum die Fingernägel so 
brüchig sind, Vielleicht liegts an der Ernährung?

von Haha (Gast)


Lesenswert?

Bernd K. schrieb:
> Ja. Und wer eine Wasserwaage braucht um ein Regal aufzuhängen hat nen
> Knick in der Optik

Die Diskussion hatten wir ja erst kürzlich und alles wurde widerlegt. 
Hier nachzulesen, warum ein Debugger nur was für Anfänger ist:

Beitrag "Re: Weg von Arduino - Beratung"

von Nop (Gast)


Lesenswert?

Haha schrieb:
> Wer einen Debugger benötigt kann nicht programmieren. Such dir ein
> anderes Hobby.

Dazu auch interessant, wieso Torvalds und Robert C. Martin keine 
Debugger mögen:
https://lwn.net/2000/0914/a/lt-debugger.php3
https://www.artima.com/weblogs/viewpost.jsp?thread=23476

Aber klar, wer sich erstmal von nem Debugger abhängig gemacht hat, kann 
sich gar nicht mehr vorstellen, ohne zu arbeiten und kommt sich damit 
wahrscheinlich auch noch professionell vor.

von Ingo S. (ingo-s)


Lesenswert?

Die Notwendigkeit hängt doch auch vom Projekt ab.

Hier geht es doch nicht um Betriebssysteme oder deren Anwendungen, 
sondern um uControler in realtime Anwendungen, die oft nicht mal eine 
freie Schnittstelle für ein Logging bieten.
Da bin ich froh, wenigstens mal einen Breakpoint setzen zu können, um 
mir interne Zustände ansehen zu können.

von Haha (Gast)


Lesenswert?

Ingo S. schrieb:
> Da bin ich froh, wenigstens mal einen Breakpoint setzen zu können, um
> mir interne Zustände ansehen zu können.

Da sind große Datenmengen in Form von Logging über eine Uart besser 
geeignet als Debugging. Muss man halt einplanen.

von Ingo S. (ingo-s)


Lesenswert?

Heh,
erst lesen, dann Antworten.

Logging ohne freie Schnittstelle per Gedankenübertragung?

von Haha (Gast)


Lesenswert?

Ingo S. schrieb:
> ogging ohne freie Schnittstelle per Gedankenübertragung?

Designfehler, schlechte Planung. Lieber auf Debugger verzichten und 
stattdessen eine UART nach außen führen. Kein guter Programmierer 
braucht einen Debugger.

von Hihi (Gast)


Lesenswert?

Haha schrieb:

>
> Designfehler, schlechte Planung. Lieber auf Debugger verzichten und
> stattdessen eine UART nach außen führen. Kein guter Programmierer
> braucht einen Debugger.

Achso, aber jeden Sch... auf einer Loggingschnittstelle auszugeben macht 
einen guten Programmierer?

von Bernd K. (prof7bit)


Lesenswert?

Haha schrieb:

> Designfehler, schlechte Planung. Lieber auf Debugger verzichten und
> stattdessen eine UART nach außen führen. Kein guter Programmierer
> braucht einen Debugger.

Was für ein Bullshit! Und griffbereit in der Schublade dann auch immer 
gleich die Neunschwänzige zur stündlichen Selbstgeiselung bereitliegen 
haben oder was?

von Jan K. (jan_k)


Lesenswert?

Was ist wenn UART zu lahm? Schonmal was von coverage + tracing gehört? 
ITM debugging/streaming? Profiling?

Das läuft nicht ohne debugger.

@topic,
Das ist eigentlich unabhängig vom Debugger. Wir haben den Watchdog immer 
eingeschaltet, damit man nicht auf blöde Gedanken kommt. Beim STM32F103 
(ich weiß, andere MCU) geht das über das DBGMCU -> CR Register. Da muss 
man z.B. das Bit 8 ("DBGMCU_CR_DBG_IWDG_STOP") setzen, damit der 
watchdog auch anhält, wenn die MCU im Stopp mode ist und das 
funktioniert.

Manchmal möchte die IDE aber auch solche Sachen überschreiben, gbits da 
vielleicht Optionen beim Debugger? Wenn ja alles ausschalten und per 
Sofwtare das Bit setzen.

Ich sehe gerade, das gibts beim STM32G0x1 auch: 
https://www.st.com/content/ccc/resource/technical/document/reference_manual/group0/2f/21/cb/33/78/80/42/64/DM00371828/files/DM00371828.pdf/jcr:content/translations/en.DM00371828.pdf 
Abschnitt 37.9.2 und später. Heißt wie du sagst allerdings DBG_APB_FZ1 
und nicht CR. Wenn du bit 12 setzt, resettet er trotz vom Debugger 
gestoppten Core?

edit: scheiße du hast Recht. Kann nur vom Debugger unter Reset 
geschrieben werden, was ist das denn fürn quark. Hat dein Debugger sowas 
wie eine Kommandozeile oder irgendeine API? Ich gehe davon aus, sonst 
könnte ja die IDE nicht mit ihm reden. Falls die öffentlich ist kannst 
du es darüber versuchen. Bits setzen kann er mit Sicherheit.
Ansonsten mal versuchen, unter reset zu verbinden und dann per Register 
view das Bit zu setzen.

: Bearbeitet durch User
von Ingo S. (ingo-s)


Lesenswert?

Es geht DOCH!

Bei der Suche im Inet bin ich auf den Hinweis gestoßen, das man den 
Clock für das Debug Register zuerst aktivieren muss.

Beim STM32G031 funktioniert folgendes als erste Anweisung im Main:

  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DBGMCU);
  DBG->APBFZ1 = 0x00001000; (Beispiel Watchdog-Bit setzen)

Fazit: traue keinem Manual (von wegen nur der Debugger kann das)

von W.S. (Gast)


Lesenswert?

Bernd K. schrieb:
>> Designfehler, schlechte Planung. Lieber auf Debugger verzichten und
>> stattdessen eine UART nach außen führen. Kein guter Programmierer
>> braucht einen Debugger.
>
> Was für ein Bullshit!

"Bullshit?"

Du rüpelst wieder mal herum.

Der "Haha" hat im Grunde durchaus Recht - und du eben nicht. Mal wieder.

Aber so polarisiert sollte man da nicht sehen, sondern es eher so sagen:

Wer den Debugger so dringend braucht, daß er ohne ihn nicht auskommt, 
der ist tatsächlich ein schlechter Entwickler/Programmierer, weil er 
im Vorfeld gravierende Fehler gemacht hat, als da wären:
1. fehlende oder mangelhafte Modularisierung der Firmware
2. fehlende oder mangelhafte Kapselung von modulinternen Daten
3. schlecht definierte firmwareinterne Schnittstellen
4. für den Anwendungsfall ungeeignete Verwendung von µC-internen 
Ressourcen.
5. "Kunststückchen" beim Schreiben der Quellcodedateien, anstatt sich 
simpel und bieder auszudrücken und dem Compiler das Optimieren zu 
überlassen.
5a. extensives Verwenden von Casts
6. im Schaltungsentwurf nicht an irgendwelche Service-Zugänge gedacht
7. sich auf irgendwelche zugelieferten Programmteile verlassen ohne 
selbige verstanden und kontrolliert (und zuvor ausgetestet) zu haben

So. Wer so beim Entwickeln vorgeht, daß all diese Punkte NICHT 
zutreffen, der kommt mit 99.9% Wahrscheinlichkeit ohne jeglichen 
Debugger aus und braucht z.B. ein SWD-Geschirre nur, um den 
Maschinencode in den Chip zu kriegen.

W.S.

von Ingo S. (ingo-s)


Lesenswert?

Könnt ihr bitte mal beim THEMA bleiben!!!

von Jan K. (jan_k)


Lesenswert?

Ingo S. schrieb:
> Es geht DOCH!
>
> Bei der Suche im Inet bin ich auf den Hinweis gestoßen, das man den
> Clock für das Debug Register zuerst aktivieren muss.
>
> Beim STM32G031 funktioniert folgendes als erste Anweisung im Main:
>
>   LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DBGMCU);
>   DBG->APBFZ1 = 0x00001000; (Beispiel Watchdog-Bit setzen)
>
> Fazit: traue keinem Manual (von wegen nur der Debugger kann das)

Gut zu wissen, danke!
Die Frage jetzt ist aber ob es ein Bug ist und es einen Grund hat, dass 
nur der Debugger unter reset den Pin setzen können soll. Hast du Zeit 
und Lust das mit ST zu besprechen? :)

Wo hast du das gefunden?

Aber es ist gut, dass es erstmal geht. Wir wollen die MCU nämlich auch 
mal evaluieren und wollen möglichst unsere Debug Klassen 
weiterverwenden. Cool.

von Bauform B. (bauformb)


Lesenswert?

Jan K. schrieb:
> Die Frage jetzt ist aber ob es ein Bug ist und es einen Grund hat, dass
> nur der Debugger unter reset den Pin setzen können soll.

Bug oder Missverständnis? Den Text aus dem Reference Manual "nur der 
Debugger" würde ich anders interpretieren. Die Register verhalten sich 
genau wie z.B. die GPIO-Register, also muss man den Takt vorher 
einschalten und dann kann man sie ganz normal benutzen. Der Debugger 
kann sie natürlich auch lesen und schreiben.

Als Bonus kann der Debugger auch unter reset zugreifen, was mit den 
meisten Registern nicht geht. Deshalb steht das im RM, alles andere 
ist nicht erwähnenswert, weil normal.

Wäre doch denkbar?

: Bearbeitet durch User
von Jan K. (jan_k)


Lesenswert?

Bauform B. schrieb:
> Jan K. schrieb:
>> Die Frage jetzt ist aber ob es ein Bug ist und es einen Grund hat, dass
>> nur der Debugger unter reset den Pin setzen können soll.
>
> Bug oder Missverständnis? Den Text aus dem Reference Manual "nur der
> Debugger" würde ich anders interpretieren. Die Register verhalten sich
> genau wie z.B. die GPIO-Register, also muss man den Takt vorher
> einschalten und dann kann man sie ganz normal benutzen. Der Debugger
> kann sie natürlich auch lesen und schreiben.
>
> Als Bonus kann der Debugger auch unter reset zugreifen, was mit den
> meisten Registern nicht geht. Deshalb steht das im RM, alles andere
> ist nicht erwähnenswert, weil normal.
>
> Wäre doch denkbar?

Beim STM32F103 z.B. ist es so, dass man nicht den Takt aktivieren muss, 
es gibt genauergesagt gar keinen Takt und daher verhält sich das 
Register auch nicht wie GPIOs. Wenn man das als GPIO ansieht, wovon ich 
auf Grund meiner Erfahrung mit derm f103 nicht ausgegangen bin ergibt 
das Ganze Sinn. Ich hatte aber irgendeine Sicherheits Funktion im Kopf, 
die ausdrücklich nur erlaubt, die Flag under reset also mit dem 
Debugger zu setzen. Um irgendwelchen Hacks aus dem Weg zu gehen oder so.

Auf die Idee, dass das Register nur mit Debugger geschrieben werden 
kann ist der Grund, den der OP schon genannt hat, der Satz "it is still 
possible to write this register by software." Der bei anderen Registern 
teilweise vorhanden ist
fehlt bei ebenjenem :)

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.