J-Link detekt moeglich?

#8059114
Lesenswert?

Moin Leute,

Hat jemand eine brilliante Idee wie man in einem STM32L451 nach dem Reset erkennen kann ob ein Segger angeschlossen ist?

Hintergrund: Ich hab eine auf Stromsparen optimierte Schaltung wo der Controller nur sehr kurz was macht und dann sofort den Controller in den deepest Sleep schickt. Da hat der Segger keine Chance das Teil unter Kontrolle zu bekommen und ich muss den erst jedesmal mit JLinkSTM32Exe ein brainwashing verpassen. Es waere eigentlich cooler wenn der Controller das merken wuerde und dann nicht entschlummert. Klar, ich koennte irgendwo einen Pin abfragen, aber vielleicht gibt es noch eine elegantere Loesung?

Vanye

#8059281
Lesenswert?

Dafür gibt es z.B. die ARM Core Debug Register.

Ah..super Hinweis. Das werde ich nachher mal ausprobieren...

Ghet es um Debuggen oder nur neu Flashen?

Natuerlich letztlich um beides.

Flashen kannst Du auch mit dem internen ROM-Bootloader, der mit BOOT0 aktiviert wird.

Du meinst mit Boot0 den internen Bootloader aktivieren und dann mit dem J-Link die Kontrolle uebernehmen? Hm..klingt technisch machbar. Bedeutet aber letztlich auch einen Jumper an einen Pin. Das koennte ich ja dann auch mit einem beliebigen anderen Pin machen. Letzeres haette noch den Vorteil das ich dann huebsch blinken koennte damit ich weiss das die Hardware nun bereit zur uebername durch den J-Link ist.

Detecting the debugger is as simple as doing CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk.

Das hier klingt einfach viel eleganter. :)

BTW: Mir faellt da gerade noch eine weitere Anwendung ein:

if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) delete_secret_keys();

Ist halt die Frage wieviel Zeit man hat...

Vanye

: Bearbeitet durch User
#8059283
Lesenswert?

Und wenn man den angeschlossenen, aber noch nicht aktiven Debugger erkennen will geht das vermutlich auch sehr einfach: Bei vielen STM32 kann man die SWD Pins als GPIO konfigurieren. Dann als Eingang mit eingeschaltetem Pullup und ein zweites mal mit eingeschaltetem Pulldown die Pegel bestimmen. Ein Debugger wird vermutlich mindestens einen der SWD Pins auf einem definierten Pegel halten, auch wenn der Debugger noch nicht aktiv ist. Wenn man damit fertig ist die ursprüngliche Konfiguration wiederherstellen.

#8059517
Lesenswert?

Super, es funktioniert damit:

1
  while (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
2
    {
3
      led_green_on();
4
      delay(250);
5
      led_green_off();
6
      delay(250);
7
    }

Wobei es nicht so ist als ob man die gruene LED gross blinken sieht. Aber der Debugger connectet zuverlaessig, flasht den Source und danach geht er vom Bus und der Controller laeuft mit der neuen Software und ich brauche keine bloede Wartezeit in meinem Programm. Das laeuft bei mir so 50ms bis es in den DeepSleep geht.

Vanye

Persönliche Seite #8059527
Lesenswert?

Wenn du beim Debugger das Connect Under Reset nutzt ("RSetType 3"), funktioniert das Verbinden immer, weil die Software eben gar nicht läuft und den Standby betreten kann sondern der Controller im Reset ist. Dann kannst du auch problemlos flashen. Nur zum Debuggen ist es ein Problem, weil wenn der Controller in den Sleepmode geht die Debugger Verbindung wegfliegt.

Die Standby Modi (STOP2) kann man dann diverser Errata sowieso nicht vernünftig debuggen leider...

Vanye R. schrieb:

und danach geht er vom Bus und der Controller laeuft mit der neuen Software

Aber nicht realitätsnah; wenn der Debugger einmal dran war bleibt das C_DEBUGEN an auch nach einem Reset. Breakpoints bleiben ggf. Ebenfalls bestehen! Nach einem Flashen muss man einen vollen Power Cycle + Kaltstart machen um die Software korrekt inkl Low Power Modes zu testen.

#8059538
Lesenswert?

Hans W. schrieb:

Nein. Im Ruhezustand und nach Ende/Abbruch der Verbindung wird der Debugger hochohmig.

Falsch. Wenn mein J-Link einmal auf SWD konfiguriert wurde ist der SWCLK Pin "Low", auch wenn kein Target an den SWD Pins angeschlossen ist. Die beiden SWD Pins sind nur direkt nach dem Anstecken an den USB Port als "Input" konfiguriert und haben keinen Pegel, sobald die Host Software den J-Link anspricht ändert sich das. Siehe auch die SWD Doku, SWCLK ist "Output" am Debugger, SWDIO "Input/Output".

#8059559
Lesenswert?

Niklas G. schrieb:

Aber nicht realitätsnah; wenn der Debugger einmal dran war bleibt das C_DEBUGEN an auch nach einem Reset. Breakpoints bleiben ggf. Ebenfalls bestehen! Nach einem Flashen muss man einen vollen Power Cycle + Kaltstart machen um die Software korrekt inkl Low Power Modes zu testen.

Wenn man so Dinge wie "Low Power" realistisch testen will sollte doch auch kein Debugger angesteckt sein (ändert eventuell die Stromaufnahme). Damit hat man den Power Cycle eigentlich bereits, zumindest wenn man den Debugger nicht unter Spannung abstecken will.

#8059714
Lesenswert?

Wenn man so Dinge wie "Low Power" realistisch testen will sollte doch auch kein Debugger angesteckt sein (ändert eventuell die Stromaufnahme).

Es ist noch schlimmer. Wenn der Debugger einmal genutzt wurde dann ist die Macrozelle fuers Debugen aktiv. Das macht jede Messung zur Energieaufnahme kaputt. Da ist also ein kompletter Powercycle schon wichtig.

Damit hat man den Power Cycle eigentlich bereits, zumindest wenn man den Debugger nicht unter Spannung abstecken will.

Pfft. :-) Das mach ich oefter mal. Hat noch nie geschadet und in aller Regel laeuft die Firmware bei an/abstecken auch ohne Reset einfach so weiter. Koennte mir aber vorstellen das dies etwas vom Controller abhaengt.

Vanye

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