Forum: Mikrocontroller und Digitale Elektronik STM32F0 HSI clock im debugg modus anhalten


von Stefan (Gast)


Lesenswert?

Guten Tag

Für einen Run Time Test (Timeout durch IWDG & Takt Abweichung) will ich 
beim STM32F070 den HSI Clock beim debuggen (ST-LinkV2) anhalten und die 
Frequenz verändern (auf die Register einwirken, wie PLL) ohne manuell 
den Code zu verändern. Hat vielleicht jemand eine Idee wie ich das 
machen kann?

Freundliche Grüsse
Stefan

von Stefan (Gast)


Lesenswert?

Bzw. wie kann ich den Takt anhalten?

von Christopher J. (christopher_j23)


Lesenswert?

Wenn ich das richtig verstehe willst du einfach nur testen ob der 
Watchdog zubeißt, falls HSI mal ausfallen sollte und willst dazu HSI 
anhalten und HSE läuft bei dir so wie ich das verstehe sowieso nicht.

Soweit ich weiß gibt es keine Möglichkeit dem Controller seine primäre 
Taktquelle einfach wegzunehmen. Eine Möglichkeit wäre meiner Meinung 
nach den Controller "geordnet" in den Stop-Mode zu versetzen. Damit der 
Debugger weiterhin mit dem Controller kommunizieren kann muss ein 
entsprechendes Bit im DBGMCU-Register gesetzt werden (siehe Kapitel 26).

von Jim M. (turboj)


Lesenswert?

Stefan schrieb:
> Hat vielleicht jemand eine Idee wie ich das
> machen kann?

Code in den RAM via Debugger laden und mit ausgeschalteten Interrupts 
ausführen.

Man kann auch Register direkt vom Debugger aus beschreiben - eventuell 
direkt über die Addresse, aber ohne Taktsignal funktioniert die Debug 
Einheit vom Cortex-M auch nicht mehr.

von Stefan (Gast)


Lesenswert?

Erstmal vielen Dank für die Antworten.

Jim M. schrieb:
> Man kann auch Register direkt vom Debugger aus beschreiben - eventuell
> direkt über die Addresse, aber ohne Taktsignal funktioniert die Debug
> Einheit vom Cortex-M auch nicht mehr.

Das mit dem Takt verstehe ich. Ich würde ich via Debugger
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
auf
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
stellen

Also würdest du direkt in den RAM schreiben ist eigentlich eine gute 
Idee. Wie finde ich den die Adresse des Clock control register (RCC_CR)? 
Im ref manual steht ja nur wie es zu beschreiben ist.

von Dr. Sommer (Gast)


Lesenswert?

Stefan schrieb:
> Wie finde ich den die Adresse des Clock control register (RCC_CR)?
> Im ref manual steht ja nur wie es zu beschreiben ist.

Dann wirf mal einen scharfen Blick auf S. 99, auf den Wert bei "Address 
offset", und auf S. 39 die Adresse die da bei "RCC" steht. Die musst du 
addieren um auf die Adresse des Registers zu kommen.
Die PLL-Faktoren lassen sich übrigens nur ändern wenn die PLL aus ist; 
du musst also auf eine andere Taktquelle umschalten, PLL abschalten, 
umkonfigurieren, wieder einschalten, und wieder auf PLL zurückschalten. 
Dauert natürlich mit Einschwingvorgang usw (Warten auf RCC_CR_PLLRDY und 
"RCC_CFGR_SW").

Wie wärs damit, einfach einen Breakpoint zu setzen? Bis du auf "Weiter" 
geklickt hast ist der Watchdog 10x abgelaufen.

von Rene K. (xdraconix)


Lesenswert?

Außerdem lässt es der STM32 nicht zu den HSI zu deaktivieren solange 
keine andere Taktquelle gewählt wurde. Der HSI ist immer im Fallback 
solange keine HSE_RDY oder LSI- / LSE_RDY Flag gesetzt ist, und das ist 
ein read-only Register den der STM nach dem jeweiligen einschwingen der 
Taktquelle selbst setzt.

von Stefan (Gast)


Lesenswert?

Den Speicherbereich habe ich gefunden, danke dafür. Den Clock Fehler 
konnte ich provozieren, in dem ich den sysclock auf HSI umgestellt habe 
RCC CFGR-> SW auf 0x00, dann stellt sich HSI 8MHz ein, erwartet wird 
48MHz und der uController geht in den sicheren Zustand.

Dr. Sommer schrieb:
> Wie wärs damit, einfach einen Breakpoint zu setzen? Bis du auf "Weiter"
> geklickt hast ist der Watchdog 10x abgelaufen.

Wenn ich einen breakpoint setze läuft das Programm weiter und das ist im 
Wesentlichen mein Problem. Meine google suche ergibt immer das 
umgekehrte Problem, dass es schwierig ist zu debuggen und deshalb der 
IWDG im DBGMCU eingefroren werden muss.

von Stefan (Gast)


Lesenswert?

Das IWDG Timeout kann ich jetzt ebenfalls ohne code Anpassung testen, 
die STL Libary, welche ich verwende, hat durch folgendes HAL Macro den 
IWDG eingefroren:

/* setup DBGMCU block - stop IWDG at break in debug mode */
__DBGMCU_CLK_ENABLE();
__HAL_FREEZE_IWDG_DBGMCU(); -> IWDG Zähler wird angehalten


Im Register DBGMCU lassen sich Timer, IWDG, WWDG etc. zu Debugzwecken 
einfrieren.

"Reference manual RM0360" Seite 718

Danke an alle beteiligten.

Gruss Stefan

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.