mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Flash im Betrieb neu schreiben


Autor: Philipp Kälin (philippk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich soll eine Möglichkeit finden, wie man während des Betriebes einen
Teil des Flash eines ATmega128 bzw. 2560 neu schreiben kann. Der Grund 
dafür ist, dass das Gerät mehrere Sprachen
braucht. Jede Sprache ist etwa 16 kB gross, daher zu gross für EEPROM. 
Man soll über eine SD-Karte eine neue Sprache
einlesen können und diese dann im Flash speichern.

Mein Versuch baut auf der AVR106 Application Note auf, für den IAR 
Compiler. Wenn ich nun den Teil des Flashes betrachte
steht nachher überall wo ich hineingeschrieben habe 0xFF.

Muss ich den Flash zuerst löschen, bevor ich Ihn neu beschreibe und wenn 
ja, kann man Byteweise löschen oder muss ich
ganze Pages? Beim löschen mit dem Programmer steht nachher auch 0xFF 
drin, hatte daher gedacht, dass es vieleicht beim
zweiten mal Beschreiben klappt, aber die Speicherzellen bleiben auf 
0xFF;


Hier noch mein Code zum Testen:

Adr = (UINT32 __flash)&Deutsch_Text;    // Start Deutsch_Text Tabelle
Adr += Deutsch_TextIndices[45];         // Offset für Text 
"Einstellungen MB"

Adr = 0x204;

for (i=0; i<17; i++)
{
  WriteFlashByte(Adr, Text[i]);
  Adr++;
}

_ENABLE_RWW_SECTION();

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in Erinnerung, dass AVRs mit Bootloader-Support nur aus dem 
Bootloader-Bereich ins Flash schreiben können. Der betreffende Code muss 
also dorthin gelinkt werden, oder du verwendest einen Bootloader mit 
einer Art API.

Autor: Philipp Kälin (philippk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich ganz vergessen, die Funktionen WriteFlashByte etc. Hab ich in 
einem Segment das in den obersten 8K des Prozessors ist, also der 
Bootbereich.

Reicht das, wenn ich die Funktionen einfach dorthin lege, oder muss ich 
wirklich einen selstständigen Bootloader starten, der unabhängig vom 
Rest der Software ist?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Können irgendwelche Interrupts reinfunken?

Bringt ausserdem wenig, nur den Code zu posten, der nicht selbst ins 
Flash schreibt und den wegzulassen der es tut.

Autor: Philipp Kälin (philippk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interrupt hab ich vorher ausgeschaltet. Der Code ist unverändert aus 
der AVR106 Application Note übernommen "self_programming.c"

http://atmel.com/dyn/resources/prod_documents/AVR106.zip

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.