Hallo,
ich nutze den ATXmega128a4u. Dieser hat laut Datenblatt eine Pagegröße
von 128 Wörtern, also 256 Bytes.
Ich empfange im Bootloader über UART nach und nach die Zeilen aus dem
Hexfile ohne dem ":".
Zum Schreiben des Flahes nutze ich den Code der Appnote AVR1316.
Folgende Funktionen setzen ein Byte in meine im RAM liegende Page und
aktualisiert ggf. den Flash:
1 | #define BYTE unsigned char
|
2 | #define WORD unsigned int
|
3 | #define FLASH_PAGE_SIZE 256
|
4 |
|
5 | union {
|
6 | WORD wData[FLASH_PAGE_SIZE/2];
|
7 | BYTE cData[FLASH_PAGE_SIZE];
|
8 | }pagedata;
|
9 |
|
10 | void c_dispatcher::setPage(unsigned long tadress, BYTE data){
|
11 | int page;
|
12 |
|
13 | page = tadress / FLASH_PAGE_SIZE;
|
14 |
|
15 | if(currentPage == -1){ //zu begin -1
|
16 | currentPage = page;
|
17 | clearPage();
|
18 | }
|
19 |
|
20 | if(page != currentPage){
|
21 | writePage();
|
22 | clearPage();
|
23 | currentPage = page;
|
24 | uart_SoM->flushRX();
|
25 | }
|
26 |
|
27 | pagedata.cData[tadress % FLASH_PAGE_SIZE] = data;
|
28 | }
|
29 |
|
30 | void c_dispatcher::writePage(){
|
31 |
|
32 | SP_LoadFlashPage(&pagedata.cData[0]);
|
33 | SP_EraseWriteApplicationPage(currentPage * FLASH_PAGE_SIZE/2);
|
34 | SP_WaitForSPM();
|
35 | }
|
36 |
|
37 | void c_dispatcher::clearPage(){
|
38 | for(int i = 0; i < FLASH_PAGE_SIZE; i++)
|
39 | pagedata.cData[i] = 0xFF;
|
40 | }
|
Wenn ich nach einem Testlauf den Flash auslese, stimmen die Anzahl der
beschriebenen Pages, diese sind aber nur zur Hälfte mit (teils)
unkorrektem Inhalt gefüllt.
Kann mich jemand auf die richtige Fährte führen?
Danke!