Hallo Leute,
ich hab ein kleines Problem mit meinem bootloader (den ich aus einem
Beispiel hier abgeleitet habe
http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung).
Die gesamte programmgröße ist ca. 30kbyte. Wenn ich mir nun ein via
bootloader programmiertes image zurücklese gibt es auf diesen 30kbyte
etwa 3 - 4 unterschiede.
Das gestaltet sich so, dass 2 - 4 bytes fälschlicherweise den Wert 0xff
haben.
Die Daten gehen allerdings am pc korrekt raus und werden auch korrekt
empfangen! (crc8 pro 16 bytes)
Ich musste allerdings in der program_page methode die interrupt-sperre
deaktivieren, da mein rs485 bus kein "warten" unterstützt. Dieser läuft
aber auch nicht über in der zeit.
Ist ein cli() unbedingt notwendig während dem page programmieren? Also
kann nicht während dessen weiter in den uart buffer gelesen werden?
Das ist die programmiermethode:
1 | void program_page (uint32_t page, uint8_t *buf)
|
2 | {
|
3 | uint16_t i;
|
4 | //uint8_t sreg;
|
5 |
|
6 | /* Disable interrupts */
|
7 | // sreg = SREG;
|
8 | // cli();
|
9 |
|
10 | eeprom_busy_wait ();
|
11 |
|
12 | boot_page_erase (page);
|
13 | boot_spm_busy_wait (); /* Wait until the memory is erased. */
|
14 |
|
15 | for (i=0; i<SPM_PAGESIZE; i+=2)
|
16 | {
|
17 | /* Set up little-endian word. */
|
18 | uint16_t w = *buf++;
|
19 | w += (*buf++) << 8;
|
20 |
|
21 | boot_page_fill (page + i, w);
|
22 | }
|
23 |
|
24 | boot_page_write (page); /* Store buffer in flash page. */
|
25 | boot_spm_busy_wait(); /* Wait until the memory is written.*/
|
26 |
|
27 | /* Reenable RWW-section again. We need this if we want to jump back */
|
28 | /* to the application after bootloading. */
|
29 | boot_rww_enable ();
|
30 |
|
31 | /* Re-enable interrupts (if they were ever enabled). */
|
32 | // SREG = sreg;
|
33 | }
|