har schrieb:
> Im selben Datenblatt habe ich gesehen, dass nachdem erfolgreich ein
> "Write Protect Command" durchgeführt wurde, ein ACK und anschließend ein
> "Generate system reset" durchgeführt wird.
> Ich vermute, dass ich dadurch Probleme bekomme.
Warum Probleme? Nach einem Reset ist doch alles in einem wohldefinierten
Zustand? Vor allem aber:
> um mit einem STM32 einen weiteren programmieren zu können.
dann hast du doch die volle Kontrolle über den weiteren STM32. Wenn du
weiterhin seinen BOOT-Pin ansteuerst, startet gleich wieder der Boot
Loader, du musst nur wieder ein connect machen. Und wenn nicht, startet
das frisch geflashte Programm.
> Hat jemand Erfahrungen mit "Write Protect"?
Der Stress kommt nicht vom Write Protect sondern von den Option Bytes.
Die können nur nach einem Reset aus dem Flash in die diversen
Hardware-Module (Reset, Power, Debug, Bus Matrix,...) kopiert werden.
Aber das stört doch nur, wenn du Write Protect und Readout Protect
einschalten willst. In dem Fall kannst du einen Reset sparen, indem du
alle Option Bytes auf einmal schreibst (mit Write Memory).
> Bzw. hat jemand eine Idee was beim "Generate system reset"
> genau gemacht wird?
Das ist wohl geheim. Ich kenne 3½ Möglichkeiten:
a) alle benutzten Register "von Hand" zurück setzen
b) per SCB->AIRCR = AIRCR_SYSRESETREQ_MAGIC;
c) per Watchdog; wahlweise IWDG oder WWDG
Wegen zuviel Aufwand und Risiko scheidet a) wohl aus. Der Ausdruck
"system reset" ist mir zu schwammig, spricht aber für b).
b) und c) haben praktisch die gleiche Wirkung wie ein externer Reset.
Was der Boot Loader außer dem Reset noch macht, kann also nur im RAM
Spuren hinterlassen, weil er nach dem Reset nichts mehr machen kann.
Einzelne Register im RTC-Modul haben ihr eigenes Reset-Signal, das
müsste der Boot Loader extra ansteuern. Einzelne Register im DEBUG-Modul
reagieren nur auf Power On Reset, die bleiben also unverändert.
Im RCC->CSR gibt es ca. 8 Bits, mit denen dein Programm feststellen,
welcher Reset seit dem letzten Power On "betätigt" wurde. Man kann die
Bits mit RCC->CSR_RMVF = 1; auch von Hand löschen.
Vorsicht: die Feinheiten sind von Chip zu Chip verschieden, teilweise
schon abhängig vom Gehäuse oder der Speichergröße.