Forum: Mikrocontroller und Digitale Elektronik ARM AT91SAM7 Flash aus Application beschreiben


von Lokko (Gast)


Lesenswert?

Hallo!

Da mit die Programmierung mit SAMBA zu aufwändig ist, Taste hier aus
und einstecken 10s warten... wollte ich mit meinen eigenen Bootloader
schreiben.

Wenn ich den Flash nun beschrieben will macht der ARM nen Reset. WAS
IST DA LOS?!?!?

Der Code liegt im RAM und es wird auf keine Funktion zurückgegriffen,
die im ROM liegt. Programmiert mit WINARM gcc. Alle Interrupts sind
genau wie der Watchdog aus.

Habe mich da an den Beispielcode von IAR gehalten, den ich auf GCC
portieren wollte.

Hat da jemand ne Idee?

von Thomas Pototschnig (Gast)


Lesenswert?

Mit dem Flashen kann ich dir leider noch nicht helfen, aber du kannst
mit SAM-BA deinen Code auch ins RAM laden und dort ausführen lassen -
das erspart die ständige Recovery-Prozeudr. Blöd ist es aber, wenn man
den RAM braucht und der eh schon viel zu klein ist. :-(

Aber in meinen Augen scheint das Konzept vom SAM-BA eine komplizierte
Fehlentwicklung zu sein :-(

Bin aber mal auf weitere Antworten gespannt, weil die mir dann auch
helfen könnten.
Deshalb: abo

von gerhard (Gast)


Lesenswert?

hallo lokko,
kannst du mal deinen code posten?
vielleict kann ich dir dann helfen.

gruss
gerhard

von Lokko (Gast)


Angehängte Dateien:

Lesenswert?

Hallo! Erstmal danke...

Ich habe mal mein Projekt angehangen.

in flash.c befindet sich das Corpus Delicti. In der Write Page Funktion
an der Stelle wo der Flash geschrieben werden soll macht der AT91 nen
Reset.

->
flash_AT91F_MC_EFC_PerformCmd(AT91C_BASE_MC,FLASH_AT91C_MC_CORRECT_KEY|A 
T91C_MC_FCMD_START_PROG|(pagenum<<8));

von Lokko (Gast)


Lesenswert?

Hast du ne Idee Gerhard?

Wer beschäftigt sich eigentlich hier mit diesen ARM 's ?

Scheint ja nicht gerade weit verbreitet zu sein hier. Mein Problem ist
leider auch, dass ich die das Debuggen mit der GCC tool chain und dem
Wiggler clone nicht richtig zum laufen bringe. Kann also nicht genau
sagen bei welchem Assemblerbefehl die Kiste abschmiert.

Wenn jemand ein Codebeispiel fürs schreiben vom Flash hat, würde ich
mich darüber sehr freuen. Den von mir angepeilten RS232 bootloader werd
ich dann hier auch mal posten. Inkl. nem kleinen How-To wie die
Applicationssoftware dann gelinkt werden muss usw.

von Thomas P. (pototschnig)


Lesenswert?

Es könnte sein, dass der Sample-Code von Atmel nicht im Flash sein darf,
sondern nur im RAM ausgeführt werden darf.

Wenn der SAM-BA den Flash flasht kopiert er sich dazu auch ins RAM.
Anders wird es nicht funktionieren.

Ich hab mir jetzt deinen Code nicht angeschaut, aber das könnte ich mir
als Fehlerursache vorstellen.

von gerhard (Gast)


Lesenswert?

hallo loko,
habe mir deinen code mal angesehen und mit dem iar beispiel verglichen
und dabei fiel mir auf, daß du den interrupt vor dem schreiben des
flash nicht sperrst.
hat das einen bestimmten grund?

gruss
gerhard

von Lokko (Gast)


Lesenswert?

Normalerweise benutzte ich moment noch gar keinen Interrupt. Habe aber
mal jetzt alle Interrupts im Startup Code ausgeschaltet. Es bietet sich
mir immernoch das gleiche Verhalten.

Code liegt im RAM.

Die Unlock Funktion, die ich geschrieben habe hat auch keine Wirkung
:(

Wenn ich eine Page beschreibe, die Bestandteil des Bootloader codes ist
funktioniert die Write routine wohl. jedenfalls Hängt er sich auf und
die entsprechende Page im Flash ist beschrieben (da ich kein jtag hab
gehe ich davon aus, dass die seite beschrieben ist, wenn nach nem reset
das programm nicht mehr läuft)

Im IAR code hab ich keine Funktion gefunden, die die Interrupts
explizit ausschaltet. hast du evtl. ne andere version? Ich hab ne 4.30A
Demo Starter Kit. Falls ja, könntest du bitte den flash code posten, der
in deiner Version vorhanden ist.

Dank euch!

von gerhard (Gast)


Lesenswert?

hallo loko,
unter folgendem link findest du einige beispielprogramme:
http://www.at91.com/package_patch_driver/at91sam7s64_iar/at91_sam7s64_iar.zip
im verzeichnis AT91SAM7S64-BasicFlash-IAR4_30A-1_21 gibt es ein
beispielprogramm für die flash behandlung.
im modul flash.c findest die entsprechenden funktionen. vor jedem
zugriff auf das flash wird der interrupt gesperrt
(AT91F_disable_interrupt()) und danach wieder freigegeben
(AT91F_enable_interrupt()).


gruss
gerhard

von Lokko (Gast)


Lesenswert?

Hi! Danke!

Ich werds mal ausprobieren...

von Lokko (Gast)


Lesenswert?

HI!

Für alle mit Abo hier...

hab nen neuen Thread aufgemacht mit meinen ersten Gehversuchen
bezüglich bootloader...

http://www.mikrocontroller.net/forum/read-1-304592.html

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.