Hallo liebe Mikrocontroller-Community, ich bin neu in der Mikrocontroller-Programmierung und wollte mich ein bisschen ausprobieren, konkret geht es darum einfach mal Variablen in den Flash-Speicher eines Xplained Xmega A1 während der Laufzeit des Programms zu schreiben. Ich wollte zuerst überhaupt mal probieren wie das geht und ein paar beliebige Werte in den Flash schreiben, hab jetzt schon gelesen, dass man den Flash nur seitenweise, etc. beschreiben kann und das EEPROM eigentlich besser geeignet ist, nur leider ist mir der EEPROM für mein Vorhaben zu klein. Nun zur Sache, ich habe folgeneden Code mittels SP-Driver gebastelt:
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include "sp_driver.h" |
4 | |
5 | |
6 | __attribute__ ((section(".BOOT"))) void wf(bool *success) |
7 | {
|
8 | SP_EraseApplicationPage(APPTABLE_SECTION_START + 2*FLASH_PAGE_SIZE); |
9 | SP_WaitForSPM(); |
10 | |
11 | for(uint8_t i = 0; i<20; ++i) |
12 | {
|
13 | SP_LoadFlashWord(i, 0b1000000000); |
14 | SP_WaitForSPM(); |
15 | }
|
16 | |
17 | SP_WriteApplicationPage(APPTABLE_SECTION_START + 2* FLASH_PAGE_SIZE); |
18 | SP_WaitForSPM(); |
19 | |
20 | for(uint8_t i = 0; i<20 ; ++i) |
21 | {
|
22 | if (SP_ReadByte(APPTABLE_SECTION_START + i) != i) |
23 | {
|
24 | *success = 0; break; |
25 | }
|
26 | }
|
27 | }
|
28 | |
29 | int main(void) |
30 | {
|
31 | bool success = true; |
32 | |
33 | wf(&success); |
34 | |
35 | if(success) {PORTR.OUT&=~(1<<0);} |
36 | if(!success){PORTR.OUT&=~(1<<1);} |
37 | |
38 | while (1) {} |
39 | }
|
An Port R hängen zwei LEDS, die mir anzeigen, ob das beschreiben geklappt hat oder nicht. Wie ihr euch sicher denken könnt krieg ich immer die falsche LED und wenn ich den Flash Speicher auslese sind alle Bits ungesetzt. Meine Vermutung ist, dass was mit den FUSES nicht stimmt und ich deshalb keinen Schreibzugriff kriege. Hat irgendwer ne Idee, wie es funktionieren könnte? Vielen Dank für eure Hilfe im Voraus.