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 | }
|