Hallo,
ich programmiere an einem Startup-Code für einen Atmel SAM3X8E (das ist
der auf dem Arduino Due). Ich habe bereits funktionierenden Code in
Assembler für Keil IAR geschrieben, der folgendes tut:
- Watchdog ausmachen (WDDIS in WDT_MR setzen)
- Vektortabelle umplatzieren (Adresse nach SCB_VTORS schreiben)
- Slow Clock (SCK) auf 32 kHz-Quarz einstellen
(XTALSEL in SUPC_CR setzen) und Status-Register pollen
- Main Clock (MAINCK) auf externen 12 MHz-Quarz einstellen
(CKGR_MOR einstellen) und Status-Register pollen
- CPU auf MAINCK umstellen und Status-Register pollen
- "main" anspringen.
Genau das möchte ich jetzt in einer C-Umgebung unter Linux auch tun.
Allerdings kriege ich beim Versuch, den externen Quarz einzuschalten,
einen HardFault. Also beim Schreibzugriff auf CKGR_MOR. Inzwischen bin
ich da ziemlich ratlos.
Ich versuche, den Wert 0x0137FF01 dort reinzuschreiben (Main Oscillator
Selection = Crystal, Key=0x37, Main Crystal Oscillator Startup Time=255,
Main Crystal Oscillator Enable), was in der Keil-Umgebung auch
funktioniert.
Im Datenblatt habe ich nichts gefunden, was auf einen HardFault
schließen lässt. Die Taktumschaltung soll glitch-free sein.
Nachtrag:
Der HardFault tritt nicht auf, wenn der Code aus dem RAM läuft (siehe
Thread zum JLink von vorhin). Das verwirrt mich nur noch mehr.
Gruß,
Svenska