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"); } }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.