Tja, ich hole Dich nur ungern aus Deinen Träumen, aber...
RTFM gilt leider auch hier.
Ich weiß, daß es mühselig ist, wenn man sich die diversen Datenblätter und Handbücher zum M3 und dann auch noch zum jeweils ausgesuchten Hersteller und Derivat durchlesen muss. Das ist immerhin eine vierstellige Anzahl von Seiten.
Viele unterlassen das dann und wundern sich dann, wenn solche Effekte wie bei Dir auftreten.
Dabei sind diese Effekte keine "Probleme", sondern schlicht gewollte Features.
Und Dein Lösungsvorschlag funktioniert auch nur zufällig, Du hast nämlich die eigentliche Ursache nicht verstanden...
Hier also die Lösung von einem, der die Handbücher gelesen hat:
NXP (aber auch andere Anbieter) baut bei seinen LPCs einen Puffer in die APB Bridges. Das machen die, damit die CPU (und DMA) auf APB Devices schreiben können, ohne darauf zu warten, bis der Schreibvorgang zu Ende ist. Das erhöht die durchschnittliche Performance des MCs.
In Deinem Fall entsteht dadurch das Problem, daß die CPU den Interrupt bereits beendet hat, bevor der Schreibvorgang auf das Register beendet wurde. Durch den DSB-Befehl reicht dann die Zeit zufällig aus, den Schreibvorgang zu beenden.
Problematisch dabei ist, daß der Schreibpuffer außerhalb des M3-Cores ist. Dadurch bekommt der Core nicht mit, wann der Schreibvorgang abgeschlossen ist und der DSB-Befehl nutzt rein gar nichts. Bei anderer, langsamerer Peripherie ist es also durchaus möglich, daß die Zeit für die Ausführung des DSB-Befehls nicht ausreicht um den Schreibvorgang zu beenden und wieder für einen "unbedarften" Nutzer Seiteneffekte entstehen.
Also nochmal mein Tip an alle M3-Nutzer:
Lest Euch die Handbücher und Datenblätter durch!
Der Cortex-M3 - so einfach der einem beim ersten Ansehen auch erscheinen mag - ist ein komplexes Stück Hardware, welches durchaus so seine Eigenheiten hat. Und die erkennt man nur durchs Datenblatt-Lesen.
Lesezeichen