Das Problem ist, wie Jim geschrieben hat, dass Du aus einem
Interrupt-Kontext heraus einfach nur einen Jump ausführst und damit den
Reset-Handler der Applikation aus diesem Interrupt-Handler heraus
aufrufst.
Jim schlägt jetzt vor, nicht vom Interrupt-Handler aus die Applikation
zu starten, sondern aus dem Interrupt-Handler einfach zurück zu kehren
und aus dem Kontext von main() aus, die Applikation zu starten.
Ich würde ein extra Stück nicht initialisiertes RAM vorsehen, in dem Du
einen bestimmten Code ablegst, um die Applikation neu zu starten. Dann
resetest Du den Controller einfach und fragst im Start-Up code dieses
RAM-Stelle ab, setzt sie zurück und startest dann die Applikation.
So findet die Applikation immer eine komplett initialisierten Controller
vor, wenn sie startet.