Hallo in die Runde,
ich möchte gern die Vector Checksumme, welche bei NXP - Chips die
Gültigkeit der Firma anzeigt, selbst berechnen und überprüfen. In meinem
Beispiel (LPC11U66) wird diese Checksumme vom Flashtool generiert und
auf Adresse 0x1C (achter Eintrag im Vector-Table) geschrieben.
Nach Beschreibung ist es das 2er-Komplement der Summe der
Vector-Table-Einträge 0 - 6.
Ich habe einen kurzen Code erstellt, lasse die im Flash gespeicherte
Checksumme (also den Inhalt von Position 7 (0x1C) des Vector-Table
ausgeben.
Ich bin am Verzweifeln, denn normaler Weise müsste in jedem der
folgenden drei Ausgaben der gleiche Wert ausgegeben werden. Habe den
Algorithmus wieder und wieder überprüft... grrr...
1 | // Ausgabe auf 0x1C gespeicherte Checksumme
|
2 |
|
3 | flash_crc = (uint32_t*)(SCB->VTOR + 0x1C);
|
4 | printf("CRC im Flash: 0x%lX ", *flash_crc);
|
--> Ausgabe: "CRC im Flash: 0xEFFFDCCF"
Das Hexfile sieht in den ersten beiden Zeile so aus:
:100000000020001035010000FD000000FF0000008E
:10001000000000000000000000000000CFDCFFEF47
Also folgende Werte:
00200010 35010000 FD000000 FF000000 00000000 00000000 00000000
Nach Anpassung der Endianess und Ausgabe:
1 | // Ausgabe Checksumme berechnet aus Inhalt der Hex-Datei
|
2 |
|
3 | printf("CRC von HEX-Datei: 0x%lX ", 0 - (0x10000200 + 0x00000135 + 0x000000FD + 0x000000FF));
|
--> Ausgabe: "CRC von HEX: 0xEFFFFACF"
Und nun noch aus den Registern ausgelesen:
1 | // Ausgabe aus Registerwerten berechnet
|
2 |
|
3 | i = (uint32_t*)SCB->VTOR; comp_crc = *i;
|
4 | i += 4; comp_crc += *i;
|
5 | i += 4; comp_crc += *i;
|
6 | i += 4; comp_crc += *i;
|
7 | i += 4; comp_crc += *i;
|
8 | i += 4; comp_crc += *i;
|
9 | i += 4; comp_crc += *i;
|
10 |
|
11 | comp_crc = 0 - comp_crc;
|
12 | printf("CRC berechnet: 0x%lX ", comp_crc);
|
--> Ausgabe: "CRC berechnet: 0xEFFFDCEB"
Warum differieren diese drei Werte?
Gruß Uli