AVR clib boot_program_page schreibt nicht in Programflash

OP #4782682
Lesenswert?
• ▲
▼
Hallo Experts,
ich benötige Eure Hilfe. Ich bekomme meinen Bootloader nicht zum laufen. 
Ich scheitere daran, dass die Funktion "boot_program_page" aus der clib 
2.0 nicht in den Programm Page des ATmega 1284p schreiben will. Ich habe 
mein Problem jetzt auf ein Minibeispiel reduziert. Der Mini "Bootloader" 
ruft nur die Funktion boot_program_page auf und geht dann auf einen 
gesetzten Halt. Im Debug mit dem JTAG ICE mkII (oder ICE 3) sieht man, 
dass das Prog Flash ab Adresse 0 nicht beschrieben wurde.

ATmega 1284p, 16 MHZ extern Quarz
Fuses fuer Boot Flash Size 2048 words und Boot Adress 0xF800 gesetzt
BOOTRST gesetzt
Keinerlei Lockbits gesetzt
Linker Option in der "miscellaneous" BOX "-Wl,-Ttext=0xF800" gesetzt
Bootloader steht im Prog Flash ab 0xF800 (.lss File ist beigefuegt)
Interrupt Vektoren werden nicht "umgebogen", da ich kein Interrupts 
benoetige
ATmel Studio 7 Version 7.0.1188 (aktuelle Version)

Was mache ich falsch ? Ich komme einfach nicht mehr weiter....
Bin fuer jede Hilfe dankbar.
Grüße
Roland

Hier mein Programm, alternativ habe ich das Atmel Studio Miniprojekt mal 
als .zip beigefuegt.

----------------------------------------------------------------
1
#include <inttypes.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <stdlib.h>
5
#include <avr/io.h>
6
#include <avr/boot.h>
7

8
#define  NOP  asm volatile("nop"::);
9

10
// 1:1 aus libc    
11
void boot_program_page (uint32_t page, uint8_t *buf)
12
{
13
    uint16_t i;
14
    uint8_t sreg;
15
    
16
    // Disable interrupts.
17
    sreg = SREG;
18
    cli();
19
    eeprom_busy_wait ();
20
    boot_page_erase (page);
21
    boot_spm_busy_wait ();      // Wait until the memory is erased.
22
    for (i=0; i<SPM_PAGESIZE; i+=2)
23
    {
24
        // Set up little-endian word.
25
        uint16_t w = *buf++;
26
        w += (*buf++) << 8;
27
        
28
        boot_page_fill (page + i, w);
29
    }
30
    boot_page_write (page);     // Store buffer in flash page.
31
    boot_spm_busy_wait();       // Wait until the memory is written.
32
    // Reenable RWW-section again. We need this if we want to jump back
33
    // to the application after bootloading.
34
    boot_rww_enable ();
35
    // Re-enable interrupts (if they were ever enabled).
36
    SREG = sreg;
37
}
38

39

40
int main(void)
41
{
42
    uint32_t    flash_adr = 0;
43
    uint8_t     buf[SPM_PAGESIZE];
44

45
    // Puffer testweise mit irgendwas fuellen
46
    for(int n=0; n<SPM_PAGESIZE; n++)
47
    {
48
        buf[n] = 0x55;
49
    }
50
    
51
    // Flash Programmierung
52
    boot_program_page (flash_adr, buf);
53

54
    while (1) 
55
    {
56
        NOP;    // Haltepunkt -> im prog Flash sollte doch jetzt ab 
57
                // prog 0x000000 der Inhalt von buf[] stehen ??
58
    }
59
}
Angehängte Dateien:

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.