Ich nutze einen SAM7X256 Controller für meine Anwendung. Zum Abspeichern einiger Parameter würde ich gerne diese auf das interne Flash auf die letzten Pages schreiben. Das ganze funktioniert im DEBUB Modus auch wunderbar. Gehe ich aber her und lade die Applikation ins Flash und speichere wieder ab, so bekomme ich einen PrefetchAbort....Lock Bits usw. waren natürlich passend, es werden 32 bit Alligned geschrieben usw. .... Da ich mich mit dem ganzen Mapping usw. noch nicht ganz so firm bin, habe ich mir nun aus der Softwarebibliothel von Atmel mal das passende Beispiel geladen und siehe da - es passiert genau das gleiche...Im SRAM geht alles und sobald ich auf FLASH gehe ist ende. Im Header der Datei steht aber, das die Software aus dem SRAM und dem FLASH ausführbar ist. Was könnte da nun noch falsch sein? Das ganze passiert übrigens auch auf zwei verhschiedenen Boards. Dem Olimex Board und meinem selbst gebauten. So langsam habe ich keine Idee mehr, was ich noch systematisch probieren kann und mit try and error wirds noch Wochen dauern;). Wer hat hier denn schon mal einen Bootloader oder sowas geschrieben - für den dürfte dies ja ein bekanntes Problem sein. Leider findet man vieles unter dem Stichwort Bootloader, aber mein Problem hat da wohl noch niemand gehabt. Danke für Eure Hilfe !!
hallo wolfgang, liegen die funktionen zum schreiben des flash im ram? gruss gerhard
Das hab ich eben gerade in einem recht guten Atmel Dokument gelesen Gerhard (doc6253). Die Funktionen zum schreiben ins Flash müssen dort wohl liegen um das Flash beschreiben zu können. Ich frag mich nur, warum die das dann auch im eigenen Beispiel nicht machen. Jedenfalls würde das mein Verhalten des Controllers erklären, das es beim Test im SRAM geht. Bin da diese Woche schon mal drüber gestolpert, aber unter dem Keil gibt es wohl kein __ramfunc und dadurch hab ich das wieder aus dem Gedächnis gelöscht. Hast du eine Idee, wie die __ramfunc im Keil heist oder muss ich die Funktion zu Fuß ins SRAM kopieren?
hallo wolfgang, in den aktuellen beispielen (softpacks heissen die dinger jetzt) findest du im projekt "basic-internalflash-project-at91sam7s-ek-keil.zip" ein modul namens "efc.c". in diesem suchst du z.b. nach der funktion "EFC_PerformCommand()" und dort wird dir dann geholfen. ich würde dir überhaupt empfehlen die at91lib zu verwenden, dadurch erparst du dir speziell am anfang einiges an aufwand und frustration. gruss gerhard
Hallo Gerhard, genau das Projekt was du hier aufgeführt hast habe ich im Eingangsbeitrag beschrieben. Die Datei efc.c hat ja die Funktionen drin zum beschreiben des internen Flashs. Diese funktionierte aber bei mir leider nicht, wenn das Programm aus dem Flash geladen wird. Aus welchem Grund auch immer habe ich bisher aber auch immer schon bei der Datei Flashd_efc.c und der Funktion EFC_PerformCommand(pEfc, AT91C_MC_FCMD_START_PROG, page); halt gemacht. Vermutlich weil die so aussieht wie meine Funktion auf unterster Ebene. Hier geht es aber in der efc.c noch tiefer (manchmal sieht man den Wald vor lauter Bäumen eben nicht. Auf "__attribute__ ((section (".ramfunc")))" wäre ich aber sicher auch nicht so schnell gekommen... Dennoch muss ich mal schauen, warum die Funktion aus dem Flash nicht funktioniert...
So, nun bin ich einen Schritt weiter am Abgrund ;) - das schreiben geht nun ohne Absturz und das Lesen auch. Aber aus welchem Grund auch immer scheint noch etwas nicht richtig zu sein. Nach Spannungsausfall und erneutem Anlauf funktioniert das Programm nicht mehr. So als würde ich mir einen Programmteil mit dem Speichern ins Flash überschreiben, aber ich nutze die Seiten am Anfang des letzten Sektors und ein Verändern führt auch zu keinem anderen Verhalten. Muss man noch irgendetwas mit den GPNVM Bits machen??
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.