5. Cyclic redundancy check calculation unit (CRC)

5.1 Introduction

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.

Among other applications, CRC-based techniques are used to verify data transmission or storage integrity. In the scope of the functional safety standards, they offer a means of verifying the flash memory integrity. The CRC calculation unit helps compute a signature of the software during runtime, to be compared with a reference signature generated at link time and stored at a given memory location.

5.2 CRC main features

5.3 CRC functional description

5.3.1 CRC block diagram

Figure 6. CRC calculation unit block diagram

Figure 6. CRC calculation unit block diagram. The diagram shows a 32-bit AHB bus at the top with arrows for 'read access', 'write access', and '32-bit accesses'. Below the bus is a grey box containing several components: 'Data register (output)' and 'Data register (input)' are connected to the bus. 'crc_hclk' is an input signal. 'CRC computation' is a central block. To the right are four registers: 'CRC_INIT', 'CRC_CR', 'CRC_POL', and 'CRC_IDR', which are connected to the bus and the 'CRC computation' block. The 'Data register (input)' feeds into 'CRC computation', which in turn feeds into 'Data register (output)'. A small code 'MS19882V3' is in the bottom right corner.
Figure 6. CRC calculation unit block diagram. The diagram shows a 32-bit AHB bus at the top with arrows for 'read access', 'write access', and '32-bit accesses'. Below the bus is a grey box containing several components: 'Data register (output)' and 'Data register (input)' are connected to the bus. 'crc_hclk' is an input signal. 'CRC computation' is a central block. To the right are four registers: 'CRC_INIT', 'CRC_CR', 'CRC_POL', and 'CRC_IDR', which are connected to the bus and the 'CRC computation' block. The 'Data register (input)' feeds into 'CRC computation', which in turn feeds into 'Data register (output)'. A small code 'MS19882V3' is in the bottom right corner.

5.3.2 CRC internal signals

Table 13. CRC internal input/output signals

Signal nameSignal typeDescription
crc_hclkDigital inputAHB clock

5.3.3 CRC operation

The CRC calculation unit has a single 32-bit read/write data register (CRC_DR). It is used to input new data (write access), and holds the result of the previous CRC calculation (read access).

Each write operation to the data register creates a combination of the previous CRC value (stored in CRC_DR) and the new one. CRC computation is done on the whole 32-bit data word or byte by byte depending on the format of the data being written.

The CRC_DR register can be accessed by word, right-aligned half-word and right-aligned byte. For the other registers only 32-bit accesses are allowed.

The duration of the computation depends on data width:

An input buffer allows a second data to be immediately written without waiting for any wait states due to the previous CRC calculation.

The data size can be dynamically adjusted to minimize the number of write accesses for a given number of bytes. For instance, a CRC for 5 bytes can be computed with a word write followed by a byte write.

The input data can be reversed to manage the various endianness schemes. The reversing operation can be performed on 8 bits, 16 bits and 32 bits depending on the REV_IN[1:0] bits in the CRC_CR register.

For example, 0x1A2B3C4D input data are used for CRC calculation as:

The output data can also be reversed by setting the REV_OUT bit in the CRC_CR register.

The operation is done at bit level. For example, 0x11223344 output data are converted to 0x22CC4488.

The CRC calculator can be initialized to a programmable value using the RESET control bit in the CRC_CR register (the default value is 0xFFFFFFFF).

The initial CRC value can be programmed with the CRC_INIT register. The CRC_DR register is automatically initialized upon CRC_INIT register write access.

The CRC_IDR register can be used to hold a temporary value related to CRC calculation. It is not affected by the RESET bit in the CRC_CR register.

5.4 CRC registers

The CRC_DR register can be accessed by words, right-aligned half-words and right-aligned bytes. For the other registers only 32-bit accesses are allowed.

5.4.1 CRC data register (CRC_DR)

Address offset: 0x00

Reset value: 0xFFFF FFFF

31302928272625242322212019181716
DR[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
DR[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:0 DR[31:0] : Data register bits

This register is used to write new data to the CRC calculator.

It holds the previous CRC calculation result when it is read.

If the data size is less than 32 bits, the least significant bits are used to write/read the correct value.

5.4.2 CRC independent data register (CRC_IDR)

Address offset: 0x04

Reset value: 0x0000 0000

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.IDR[7:0]
rwrwrwrwrwrwrwrw

Bits 31:8 Reserved, must be kept at reset value.

Bits 7:0 IDR[7:0] : General-purpose 8-bit data register bits

These bits can be used as a temporary storage location for one byte.

This register is not affected by CRC resets generated by the RESET bit in the CRC_CR register

5.4.3 CRC control register (CRC_CR)

Address offset: 0x08

Reset value: 0x0000 0000

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.REV_OUTREV_IN[1:0]Res.Res.Res.Res.RESET
rwrwrwrs

Bits 31:8 Reserved, must be kept at reset value.

Bit 7 REV_OUT : Reverse output data

This bit controls the reversal of the bit order of the output data.

0: Bit order not affected

1: Bit-reversed output format

Bits 6:5 REV_IN[1:0] : Reverse input data

This bitfield controls the reversal of the bit order of the input data

00: Bit order not affected

01: Bit reversal done by byte

10: Bit reversal done by half-word

11: Bit reversal done by word

Bits 4:1 Reserved, must be kept at reset value.

Bit 0 RESET : RESET bit

This bit is set by software to reset the CRC calculation unit and set the data register to the value stored in the CRC_INIT register. This bit can only be set, it is automatically cleared by hardware

5.4.4 CRC initial value (CRC_INIT)

Address offset: 0x10

Reset value: 0xFFFF FFFF

31302928272625242322212019181716
CRC_INIT[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
CRC_INIT[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:0 CRC_INIT[31:0] : Programmable initial CRC value

This register is used to write the CRC initial value.

5.4.5 CRC register map

Table 14. CRC register map and reset values

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x00CRC_DRDR[31:0]
Reset value11111111111111111111111111111111
0x04CRC_IDRResResResResResResResResResResResResResResResResResResResResResResResResIDR[7:0]
Reset value00000000
0x08CRC_CRResResResResResResResResResResResResResResResResResResResResResResResREV_OUTREV_IN[1:0]RESET
Reset value0000
0x10CRC_INITCRC_INIT[31:0]
Reset value11111111111111111111111111111111
Refer to Section 2.2 on page 37 for the register boundary addresses.