Archiv verlassen und diese Seite im Standarddesign anzeigen : Einzelnes Byte in den Flash-Speicher schreiben
Hallo,
gibt es die Möglichkeit ein einzelnes Byte in den Flash des AVR zu schreiben? Die Speicherzelle hat den Wert 0xFF und sollte somit gelöscht sein. Wie wäre die Vorgehensweise eine einzelne Zelle zu beschreiben anstatt einer ganzen Page?
Viele Grüße,
Andreas
ob das konkret beim Atmega (ich denke mal das meinst du weil AVR der name der ganzen familie ist) kann cih leider nciht exakt sagen ohne den controller zu wissen und das datenblatt zu prüfen
aber generell gesprochen, kannst du beim schreiben von flash speicher nur eine 1 zu einer 0 machen aber niemals umgekehrt, also wenn das byte 0xFF ist ist ein einmaliges beschreiben ohne löschen zumindest theoretisch möglich
da es aber auch ziemlich sinnlos ist(üblicherweise), gehe ich fast davon aus dass es schon rein technisch nicht möglich ist ein byte bei atmegas einzeln zu beschreiben
Hallo Ceos,
sorry ich habe vergessen zu schreiben, dass es sich um einen AT90CAN64 handelt. Ich habe mir inzwischen die Funktion selbst geschrieben. Diese liest die Page aus dem Flash aus und schreibt diese dann mit geändertem Byte komplett nochmal. Der einzige Nachteil ist: Das ganze benötigt 256 Byte SRAM für den Buffer. Es scheint aber keine andere Möglichkeit zu geben.
Warum ich das ganze brauche? Eigentlich sollte es nicht der Fall sein. Wie du im anderen Thread gelesen hast schreibe ich einen Bootloader. Dieser empfängt via CAN das Programm und flasht es. Das ganze funktioniert mittlerweile. Es kommt aber vor, dass eine Speicherstelle nicht geschrieben wird. Ich arbeite mit vielen Checksummen und Zählern bei der Datenübertragung und kann sicher sein, dass die Daten korrekt ankommen.
Es scheint beim aufruf von boot_page_write_safe selten eine Stelle der Page auf 0xFF zu bleiben. Ich kann mir das nicht erklären, konnte aber mit dem Workaround beim verify die Stelle "nachzuschreiben" das Problem lösen.
Viele Grüße,
Andreas
Das ganze benötigt 256 Byte SRAM
du ließt die page aus dem flash in den NVM buffer, manipulierst das eine byte dort im buffer und lässt den buffer zurückschreiben, du musst nichts in den RAM packen meine ich ... soweit ich mich entsinnen kann ist das sogar das vorgehen wenn man das mit dem ASF im Atmel Studio macht
ein CAN bootloader ... haha zu köstlich, das gleiche habe ich auch gemacht :D
Ich habe allerdings einen mini CANOpen stack samt eigener protokoll logik komplett in die boot sektion gepackt, man sendet einen bestimmten befehl an die alte applikatuion, der im eeprom eine CRC32 löscht ... diese CRC32 wird mit der standard application ROM CRC funktion berechnet die atmels compiler auch nutzt (steht u.a. in der AVR Doku mit drin)
ich compile also das programm, speichere die CRC als textdatei für die firmware mit ab und lade den bootloader in das gerät ....
der bootloader startet und prüft 2 sachen, zum einen ob der forced boot pin high ist (eine art notfallsignal) und er berechnet die CRC über den application ROM und prüft ob die errechnete CRC mit der CRC im EEPROM übereinstimmt
stimmt die CRC nicht oder ist das signal gesetzt, bleibt er im bootloader, bis ich einen befehl schicke in die applikation zu springen
in der applikation habe ich dann einen bestimten befehl, mit dem ich die CRC wieder setzen kann(entweder aus der datei bei der endkontrolle oder die applikation rechnet die CRC selber aus oder ich nehme sie aus dem binary file, je nachdem was besser ist). so ist sichergestellt dass die applikation wenigstens ordentlich startet eh ich den controller in eine bootlschleife hänge :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.