Forum: Mikrocontroller und Digitale Elektronik SAM3X: HardFault bei Wechsel der Taktquelle


von S. R. (svenska)


Lesenswert?

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

von Dennis R. (dennis_r93)


Lesenswert?

Meine Kristallkugel sagt....
Her mit dem Code!
Ohne Code können wir mehr oder weniger nur wild raten.

Wenn wir deinen Asm und C-Code haben können wir den vergelichen & dir 
besser helfen als wenn wir einfach nur raten.

Aber einen 1. Rateversuch wage ich mal....
Ist der Stack initialisiert?

von S. R. (svenska)


Angehängte Dateien:

Lesenswert?

Hi,

angehängt ist der Startup-Code aus dem Keil-Projekt (startup_sam3x.s), 
sowie mein der Startup-Code in C (start.c), das Exception-Zeug 
(sam3xa.{c,h}) und ein Teil der Registerbeschreibungen (pmc, supc).

Die Linkerscripts sind direkt von Atmel, der Stack ist 8K groß.

Gruß,
Svenska

von Dennis R. (dennis_r93)


Lesenswert?

>/* point vector table to SRAM if run from SRAM */
>  if((uint32_t)vector_table < 0x20000000) {
>    *(uint32_t*)0xE000ED08 = (uint32_t)vector_table;
>  }

Sollte hier nicht >= als vergleich stehen?
Damit wird die Adresse nur dann geschrieben, wenn sie kleiner wie 
0x20000000 ist. D.h. wenn sie unterhalb vom Ram ist.
Ist mir jetzt als erstes aufgefallen.

von S. R. (svenska)


Lesenswert?

Oh, stimmt. Ändert aber nichts, weil zu dem Zeitpunkt sowieso noch keine 
Interrupts funktionieren...

von S. R. (svenska)


Lesenswert?

Ich habs gelöst, und keine Ahnung, wie.

Hab einen kleinen LCD-Treiber eingebunden, den "Hallo!" aufs Display 
schreiben lassen und mal ausprobiert - tut. Dann den nächsten Schritt.

Danke für die Hilfe, trotzdem.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.