Forum: Mikrocontroller und Digitale Elektronik ATMega2560 und boot.h Problem (bootloader)


von Christoph S. (cioakurve)


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");
  }
}

von Christoph S. (cioakurve)


Lesenswert?

Ok, da bei mir beim AVR Studio 6 auch der Simulator nicht richtig 
funktioniert, habe ich AVR Studio 4.19 installiert. Dort läuft der Code 
im Simulator und tut was er soll. Leider kann ich den JTAG ICE 3 ncht 
mit AVR Studio 4.19 verwenden um den Code in der Hardware 
auszuprobieren...

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.