LPC Chips Vector Checksumme

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.