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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.