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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Roland B. (micfan)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hat denn keiner eine Idee ?

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


Bewertung
1 lesenswert
nicht 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)


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.