Hmm.... okay, hat sich wohl erledigt :-)
Es lag wohl daran, dass unter bestimmten Umständen das LOCK Bit im
FLASH->CR beim Programmstart schon (oder noch) gelöscht ist. Offenbar
setzt es der Debugger (Segger Embedded Studio) nach dem Programmieren
des Flash nicht zurück.
Ein erneutes Schreiben der KEYR führt dann zu einem Hardfault.
Ich kann es so reproduzieren:
- Controller über den Debugger Neustart
-> LOCK gesetzt
--> Funktion funktionier wie erwartet
- Änderung am Source vorgenommen, so das neu geflasht werden muss
- Controller im Debug-Modus gestartet
-> LOCK gelöscht
--> Funktion erzeugt Hardfault
(auch wenn ich den Code für das Flashen gänzlich deaktiviere bleibt das
Verhalten des LOCK Bits beim Starten gleich. Wenn vorher geflasht wurde
ist es schon gelöscht. IMHO nicht ganz sauber oder ein Bug des
Controllers zusammen mit dem SWD-Interface - kA.).
Abhilfe: Bevor man versucht das LOCK zu deaktivieren, erstmal testen ob
es nicht schon deaktiviert ist.