Hallo liebe Leute,
ich arbeite mit einem ATmeag1284P und versuche gerade meinem Bootloader
beizupulen, dass er die Application (Addr: 0x000000000) zur sicherheit
an die Mitte des Flashspeichers (0x0000F000) kopiert.
Eigentlich klappt dies auch, allerdings sind nur die ersten 2 Bytes
immer 0xFFFF, obwohl dort 0x4CC0 steht!?
Ich habe das ganze auch beim debuggen gesehen. Nach dem auslesen von
Addr 0x00000000 gibt er immer 0xFFFF zurück...?
Hier mein Code:
1 | //Ausruf:
|
2 | _flashCopy(0x00000000, 0x0000F0000, 0x0000F0000);
|
3 |
|
4 | bool _flashCopy(uint32_t srcAddr, uint32_t dstAddr, uint32_t byteCount)
|
5 | {
|
6 | bool ret = true;
|
7 | uint8_t sreg;
|
8 |
|
9 | /* Disable interrupts */
|
10 | sreg = SREG;
|
11 | cli();
|
12 | uint32_t addr;
|
13 | uint32_t page = dstAddr;
|
14 | uint32_t count;
|
15 | uint16_t value16;
|
16 | for (addr = srcAddr, count = 0 ; addr < (srcAddr + byteCount) ;)
|
17 | {
|
18 | if(count == 0)
|
19 | {
|
20 | eeprom_busy_wait ();
|
21 | boot_page_erase (page);
|
22 | boot_spm_busy_wait (); /* Wait until the memory is erased. */
|
23 | }
|
24 | value16 = pgm_read_word_far(addr);
|
25 |
|
26 | boot_page_fill (page + count, value16);
|
27 | if(count >= SPM_PAGESIZE-2)
|
28 | {
|
29 | boot_page_write (page);
|
30 | boot_spm_busy_wait();
|
31 | count = 0;
|
32 | page+=SPM_PAGESIZE;
|
33 | }
|
34 | else
|
35 | count += 2;
|
36 |
|
37 | addr += 2;
|
38 | }
|
39 | /* Re-enable interrupts (if they were ever enabled). */
|
40 | SREG = sreg;
|
41 | return ret;
|
42 | }
|
Vielleicht habe ich auch etwas vergessen oder übersehen!? hat jemand
einen Tipp woran es liegen könnte?
Gruß und Danke im Voraus!