Forum: Mikrocontroller und Digitale Elektronik AVR clib boot_program_page schreibt nicht in Programflash


von Roland B. (micfan)


Angehängte Dateien:

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
}

: Bearbeitet durch Moderator
von Roland B. (micfan)


Lesenswert?

Hat denn keiner eine Idee ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Roland B. schrieb:
> -Wl,-Ttext=0xF800

Die GNU-Tools benutzen grundsätzlich für alles Byteadressierung.

Atmel benutzt beim Flash meistens 16-bit-Wortadressierung (Ausnahme:
LPM, das geht byteweise).

Für eine Wortadresse von $F800 brauchst du also beim Linken die
Byteadresse 0x1F000.

von Roland B. (micfan)


Lesenswert?

Hallo Jörg,
das hatte ich übersehen. Jetzt funktioniert es...
Vielen Dank für deine Zeit !
Gruß
Roland

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.