Forum: Mikrocontroller und Digitale Elektronik STM32 und CRC32 auf Datenlänge nicht durch 4 teilbar


von Rangi J. (rangi)


Lesenswert?

Hallo Forum,
ich berechne mit der HW-Einheit auf dem STM32 eine CRC32.
- Initialisieren
- Byte-Array auf 32Bit-Array casten
- nacheinander 32Bit-Werte aus dem Array ins DR schreiben
- am Ende DR lesen, XOR mit 0xFFFFFFFF

Das ganze funtioniert auch super, es kommt genau der Wert raus, den ich 
benötige.
Jetzt habe ich allerdings Daten deren Länge nicht durch 4 teilbar ist. 
Dann funktioniert das ganze nicht mehr.
Speziell geht es um den Chunk einer png-Datei. Der ist 4 + 13 Bytes 
lang:
0x49 0x48 0x44 0x52 0x00 0x00 0x01 0x90 0x00 0x00 0x01 0x2C 0x01 0x00 
0x00 0x00 0x00 -> CRC=0xC5CCD86F

Wie kann ich das auf dem STM rechnen? Denn ich kann nur 32 auf einmal 
reinschreiben. Kann man die Länge festlegen?

Danke für Antworten

von Darth Moan (Gast)


Lesenswert?

Rangi J. schrieb:
> Wie kann ich das auf dem STM rechnen? Denn ich kann nur 32 auf einmal
> reinschreiben. Kann man die Länge festlegen?

Wie kommst du darauf?
1
    for(idx = 0; idx < CSE_SwDlCmd.Len; idx++)
2
    {
3
        *(__IO uint8_t*)(&CRC->DR) = CSE_ApplUpdtArr[idx];
4
    }

Funktioniert wunderbar.
Oder welche STM32 hast du, dass dieser es verbietet byteweise ins DR zu
schreiben?

"The CRC (cyclic redundancy check) calculation unit is used to get a CRC
code from 8-, 16- or 32-bit data word and a generator polynomial."

von Rangi J. (rangi)


Lesenswert?

F411
"Each write operation into the data register creates a combination of 
the previous CRC value and the new one (CRC computation is done on the 
whole 32-bit data word, and not byte per byte)."

von Darth Moan (Gast)


Lesenswert?

Moin,

interessant! Ich dachte die CRC Einheiten wären gleich.

Aber der die F4 scheinen tatsaechlich nur 32bit writes zu erlauben:
"The CRC registers have to be accessed by words (32 bits)."

Dann hilft wohl nur auf 4 byte aligned aufzufüllen. Wenn das nicht geht,
muss man wohl die letzten 1..3 Bytes in SW nachrechnen. Also die
zwischen CRC aus der HW als Initialwert fuer die SW CRC nehmen. Sind ja
zum Glück nur maximal 3 bytes.

von Jack (Gast)


Lesenswert?

Wenn man das noch so macht, wie man das "immer" gemacht hat, dann ein 
Vielfaches von vier mit der Hardware rechnen, den Wert aus DR lesen, die 
fehlenden Bytes (maximal drei) mit einer Software-Version des 
Algorithmus zu addieren und zum Abschluss  ^ 0x

Padding (Auffüllen) mit Nullen funktioniert nicht! Das gibt komplett 
andere CRCs. Das ist eine gewünschte Eigenschaft von CRCs, NUllen sind 
relevant. Das sind keine simplen Summen, bei denen das Addieren von 
Nullen nichts ändern würde.

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.