ATMega2560 und boot.h Problem (bootloader)

OP #2862589
Lesenswert?
• ▲
▼
Hallo,

ich möchte einen Bootloader für den ATMega2560 schreiben und habe mich 
an die Anleitung auf dieser Seite gehalten.

http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung

Mein Problem ist, dass das "API usage example" auf der 
Dokumentationsseite der boot.h

void boot_program_page (uint32_t page, uint8_t *buf)

bei mir nicht richtig funktioniert. Ich habe allerdings die verwendeten 
Funktionen in der boot_program_page() dabei durch ihre 
"_safe"-Äquivalente ersetzt.
Ich habe dann mein Programm heruntergebrochen, bis in der main nur noch 
eine einzige Speicherseite mit festen Werten wie 0xbb gefüllt wird. Ich 
schaue mir dann im Debugger an, ob der Speicher wirklich geschrieben 
wird.
Jetzt kommt das Seltsame: es funktioniert, wenn ich die Taste "Start 
Debugging" drücke, der Code also sofort ausgeführt wird. Wenn ich aber 
"Start Debugging and Break" drücke und dann den Code weiter ausführe, 
schreibt er nix in den Flash.
Die entsprechenden Fuses sind gesetzt (BOOTRST und BOOTSZ(4096W_1F000)) 
und in den Linkeroptionen habe ich ".text=0x3e000" angegben. Der 
"Bootloader" sitzt also an der richtigen Stelle (wird ja auch 
ausgeführt). Ich verwende AVR Studio 6 und JTAGICE 3.
Da das Programm sehr kurz ist, hänge ich es als Text hier an.

Vielen Dank für Eure Hilfe
Christoph

-------------------------------

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/boot.h>



void boot_program_page (uint32_t page, uint8_t *buf)
{
    uint16_t i;
    uint8_t sreg;

    // Disable interrupts.

    sreg = SREG;
    cli();

    eeprom_busy_wait();

    boot_page_erase_safe(page);
    boot_spm_busy_wait();      // Wait until the memory is erased.

    for (i=0; i<SPM_PAGESIZE; i+=2)
    {
        // Set up little-endian word.

        uint16_t w = *buf++;
        w += (*buf++) << 8;

        boot_page_fill_safe(page + i, w);
    }

    boot_page_write_safe(page);     // Store buffer in flash page.
    boot_spm_busy_wait();       // Wait until the memory is written.

    // Reenable RWW-section again. We need this if we want to jump back
    // to the application after bootloading.

    boot_rww_enable_safe();

    // Re-enable interrupts (if they were ever enabled).

    SREG = sreg;
}






uint8_t pageBuffer[SPM_PAGESIZE];
int main(void)
{
  uint8_t test=0xbb;

  sei();

  for(uint16_t j=0;j<SPM_PAGESIZE;j++){
    pageBuffer[j]=test;
  }
  boot_program_page(0,pageBuffer);


  while(1){
      asm volatile("nop");
  }
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.