Sorry wenn es wie eine Widerholung klingt, aber das Lernen einer
Programmiersprache können wir Dir nicht abnehmen. Also wie schon
erwähnt, am besten mal ein Grundlagenbuch C durchackern und mit kleinen
Beispielen anfangen. Es gibt einige Fallstricke, vorallem wenn man das
mit den Pointern nicht verstanden hat. Das kannst du alles auch auf dem
PC üben, da kann man auch viel einfacher debuggen. Wenn du die
C-Grundlagen
verstanden hast, tust du dir mit den µC leichter, und kannst dich auf
die eigentlichen Probleme konzentrieren.
Ich befürchte es hilft dir nicht viel weiter aber hier noch Hinweise zu
deinem Problem. Der Source-Code hat zwar keinen Kommentar aber schau Dir
einfach mal an, was genau in der Funktion passiert.
1 | void FLASH_WriteByte(uint32_t flashAddr, uint8_t *flashRdBufPtr, uint8_t byte)
|
2 | {
|
3 | uint32_t blockStartAddr = (uint32_t)(flashAddr & ((END_FLASH-1) ^ (ERASE_FLASH_BLOCKSIZE-1)));
|
4 | uint8_t offset = (uint8_t)(flashAddr & (ERASE_FLASH_BLOCKSIZE-1));
|
5 | uint8_t i;
|
6 |
|
7 | // Entire row will be erased, read and save the existing data
|
8 | for (i=0; i<ERASE_FLASH_BLOCKSIZE; i++)
|
9 | {
|
10 | flashRdBufPtr[i] = FLASH_ReadByte((blockStartAddr+i));
|
11 | }
|
12 |
|
13 | // Load byte at offset
|
14 | flashRdBufPtr[offset] = byte;
|
15 |
|
16 | // Writes buffer contents to current block
|
17 | FLASH_WriteBlock(blockStartAddr, flashRdBufPtr);
|
18 | }
|
Der Name gibt schon mal einen Hinweis: es soll genau ein Byte in den
Flash-Speicher geschrieben werden! Bei einem Flash-Speicher geht aber
nicht so einfach sondern es kann immer nur ein kompletter Block
geschrieben werden. Also wird zuerst die Startadresse des zugehörigen
Blocks berechnet (Zeile 3). Dann wird in der for() Schleife der ganzen
Block in den (von außen gesetzen) Zwischenspeicher kopiert (Zeile 8..11)
und schließlich das zu schreibende Byte an die richtige Adresse im
Zwischenpuffer eingetragen (Zeile 14). Der so vorbereite
Zwischenspeicher wird dann quasi in einem Rutsch ins Flash geschrieben
(Zeile 17). Die drei Argumente der FLASH_WriteByte() Funktion sind also
so zu verstehen:
1 | flashAddr = Zieladresse im Flash,
|
2 | *flashRdBufPtr = Zeiger auf den Zwischenspeicher von außerhalb
|
3 | byte = das zu schreibende einzelne Byte
|
Wenn du die Funktion benutzen willst, musst du also einen
Zwischenspeicher zur Verfügung stellen, damit die FLASH_WriteByte()
Funktion den Block auslesen und irgendwo hin kopieren kann. Der muss
natürlich so groß sein, dass auch ein Block ERASE_FLASH_BLOCKSIZE
reinpasst.
Und zweitens schreibt die Funktion genau ein Byte in den Flash-Speicher.
Daher musst du aus deiner 32 Bit Variablen die einzelnen Bytes
extrahieren und dann die Funktion viermal aufrufen.
Ich hab das hier nicht getestet aber ungefähr so sollte es gehen, Buffer
anlegen, und in einer Schleife die vier Bytes rauspopeln und die
Funktion viermal aufrufen.
1 | uint32_t flash_addr = 0xE5; // address in flash memory
|
2 | uint_8 block_buf[ERASE_FLASH_BLOCKSIZE]; // buffer for a single block
|
3 | uint_8 ic=0; // counter
|
4 |
|
5 | ...
|
6 |
|
7 | for(ic=0; ic<4; ic++) {
|
8 | uint_8 idx = ic*8;
|
9 | uint_8 wr_byte = (unit_8) ((DistTotal >> idx) & 0xff);
|
10 | FLASH_WriteByte(flash_addr+ic, block_buf, wr_byte);
|
11 | }
|
Beim Auslesen des DistTotal Wertes aus dem Flash, musst du natürlich
auch vier Bytes einzeln auslesen und dann wieder einem 32 Bit Wert
verheiraten.
Die komplette Geschichte ist halt nicht ganz so optimal weil beim
Schreiben des 32 Bit Werts, der betreffende Block gleich viermal
geflasht wird. Da wäre vielleicht eine Funktion FLASH_WriteUint32()
analog zu FLASH_WriteByte() sinnvoll, die den Block nur einmal liest,
alle vier Bytes einträgt und dann nur einmal den Flashspeicher quält.
Also vielleicht auch darüber nachdenken wie oft du den Wert überhaupt
speichern willst. Irgendwann legen die Flash Bausteine die Ohren an.