LPC Chips Vector Checksumme

OP #5690634
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
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
OP
Hallo WK,

danke für den Hinweis, ja, stimmt. Vier Augen sehen mehr als zwei. Aber 
warum kommt, wenn ich die Registerwerte aus dem Flash auslese, etwas 
Anderes heraus? Da müssen sich ja Werte verändert haben (während des 
Flashens?) ...

Uli

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.