Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S startup from reset bzw. on/off


von Jens K. (knechtel)


Lesenswert?

Hallo,

seit einigen Wochen versuche ich mein Problem mit dem Restart nach 
on/off in den Griff zu bekommen. Naja, und irgenwann ist der Punkt da, 
wo er jetzt ist.

Der AT91SAM7S256, hat sich im „fast programming mode“ mit dem 
Targetboard problemlos via JTAG (NGX ARM USB JTAG) programmieren lassen. 
Den Mode stellt man TST = PA0 = PA1 = 1 und PA2 = 0 her. Setze ich TST = 
0, so kann der JTAG zwar den Prozessor (in Crossworks) erkennen, aber 
beim programmieren bringt er mir immer „verify error“ oder ähnliches. 
Dazu habe ich auch ein Entwicklerboard von Olimex (OLIMEX SAM7-P256), 
dort ist  - soweit ich aus den Plan ersehen kann - TST = 0 = offen, und 
via JTAG kann man ihn programmieren – auch permanent mit #define 
STARTUP_FROM_RESET in der AT91SAM7_startup.s.

Wieso kann das Targetboard nicht mit TST = 0 programmiert werden, aber 
das Olimexboard schon?

https://rowley.zendesk.com/entries/41272-application-not-starting-up-after-reset-at91sam7
Crossworks erzählt hier, das in dem „fast programming mode“ der Restart 
nicht funktioniert. Daher muß vermutlich TST = 0 gesetzt werden.

In der Hoffnung einen Unterschied nach Programmierung mit demselben 
LED-Blink-Programm beider Boards zu erhalten, habe ich den Speicher 
verglichen:

Speichervergleich zw. Targetboard (TB) und Entwicklerboard (EB) beide im 
„fast programming mode“:

ab 0x00000000  Startbereich ist gleich (auch die ersten 32 Bytes = ARM 
processor exception vectors, in particular, the Reset Vector at address 
0x0)
ab 0x00100000  Flashbereich ist gleich
ab 0x00200000  SRAMbereich ist gleich

Unterschiede erscheinen nur im Registerbereich. Das die Ursache hier zu 
finden sein muß, liegt sicher daran, das der Registerbereich neben den 
Flash der einzige Bereich ist, der sich u.U. auch Werte über on/off 
merken kann.

Adresse:  0xFFFFF10C
Wert in TB:  c0000000     (links ist der kleinste Hexwert!)
Wert in EB:  00000000
Beschreibung:  AT91C_AIC_IPR   ((AT91_REG *) 0xFFFFF10C) // (AIC) 
Interrupt Pending Register

Adresse:  0xFFFFF438
Wert in TB:  000200a0
Wert in EB:  00020080
Beschreibung:  AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) 
Output Data Status Register

Adresse:  0xFFFFF43c
Wert in TB:  bbeff8fb
Wert in EB:  fffffbdb
Beschreibung:  AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin 
Data Status Register

Adresse:  0xFFFFF44c
Wert in TB:  00000000
Wert in EB:  fffffffb
Beschreibung:  AT91C_PIOA_ISR  ((AT91_REG *) 0xFFFFF44C) // (PIOA) 
Interrupt Status Register

Adresse:  0xFFFFFd04
Wert in TB:  00010000
Wert in EB:  00010001
Beschreibung:  AT91C_RSTC_RSR  ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset 
Status Register

Ursache oder Wirkung meines Problems vermute ich in den Registern.

http://www.state-machine.com/resources/articles.php
Unter ARM Processors ist viel Lektüre drin. Womöglich beschreibt er den 
Fehler, aber ich verstehe es schlicht nicht.


VG,
Jens

von Jens K. (Gast)


Lesenswert?

Lösung:

Fehler 1: Hatte für die interne Spannungsquelle des MC Vddcore keine 
Kondensatoren zur Stabilisierung verwendet (vergessen). Mit einem 10µ 
und und 0,1µ von Vddcore zu Masse sieht alles besser aus.

Fehler 2: Das Flag STARTUP_FROM_RESET von Crossworks ist nicht als Flag 
zu behandeln. Es ist eine Precompilerdirektive. Wer noch nie damit zu 
tun hatte eine Precompilerdirektive einzustellen: Rechte Maus auf die 
Datei AT91SAM7_Startup.s, dann Properties, dann unter Preprocessor 
Definitions STARTUP_FROM_RESET eintragen und bestätigen. Zuvor den 
richtigen Compilevorgang wählen idR: "ARM Flash Release"

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.