Forum: Mikrocontroller und Digitale Elektronik LPC Chips Vector Checksumme


von Ulrich U. (uli-dd-70)


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

: Bearbeitet durch User
von Dergute W. (derguteweka)


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

von Ulrich U. (uli-dd-70)


Lesenswert?

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

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ulrich U. schrieb:
> 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?) ...

Aeh - wo jetzt? Was liest du jeweils wie aus und was erwartest du?

Gruss
WK

von Ulrich U. (uli-dd-70)


Lesenswert?

Habe vergessen, die richtige Hirnregion einzuschalten: Man sollte 
überlegen, welchen Wert man zu einem 32bit-Pointer addiert, um die 
nächste Position zu erreichen... Mein "i += 4;" war natürlich falsch...

Also gelöst!
uli

von Jürgen S. (starblue) Benutzerseite


Lesenswert?

Noch ein kleiner Servicehinweis:
Das ist kein CRC, sondern eine einfache Prüfsumme.

(Bin mal gespannt, wie sie das bei dem demnächst erscheinenden LPC55 
machen, da wird dieser Vektor nämlich vom M33-Kern benutzt.)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.