LPC Chips Vector Checksumme

#5690634
Lesenswert?

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
#5690728
Lesenswert?

Moin,

Ulrich U. schrieb:
> printf("CRC von HEX-Datei: 0x%lX    ", 0 - (0x10000200 + 0x00000135 +
> 0x000000FD + 0x000000FF));

Da ist wohl ein Zahlendreher drinnen; es sollte wohl 0x10002000 heissen 
und nicht 0x10000200.


> i += 4; comp_crc += *i;
> i += 4; comp_crc += *i;

Da wuerd' ich mal nicht 4 auf den Pointer addieren, sondern nur 1. Ist 
ja schon ein 32 bit pointer und kein 8 bit.


Gruss
WK

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren