Principe
Un CRC est le reste de la division du message, vu comme un long polynôme binaire, par un polynôme générateur. Chaque variante de CRC est entièrement décrite par six paramètres (le modèle Rocksoft utilisé par le catalogue CRC RevEng) :
| Paramètre | Signification |
|---|---|
| width | nombre de bits du résultat |
| poly | polynôme générateur, sans son bit de poids fort |
| init | valeur du registre avant le premier octet |
| refin | traiter chaque octet d’entrée LSB en premier |
| refout | inverser le registre avant le XOR final |
| xorout | valeur combinée par XOR au résultat |
Chaque préréglage affiche sa valeur de contrôle : le CRC de la chaîne ASCII 123456789. Si votre firmware donne la même valeur de contrôle, vos paramètres concordent.
CRC matériel STM32
Dans sa configuration après reset, l’unité CRC du STM32 utilise le polynôme 0x04C11DB7, init 0xFFFFFFFF, sans réflexion ni XOR final : c’est le CRC-32/MPEG-2, pas le CRC-32 de zlib. Lui fournir des mots de 32 bits au lieu d’octets change le résultat sur les composants little-endian. Réglez la taille d’entrée sur 8 bits, ou activez l’inversion d’entrée/sortie et faites un XOR avec 0xFFFFFFFF en logiciel, pour obtenir la valeur Ethernet/zlib.
Implémentation en C
Le code C généré utilise une table de 256 entrées et traite un octet par étape. La même logique de table est testée unitairement contre la valeur de contrôle de chaque préréglage.