15. Cyclic redundancy check calculation unit (CRC)

15.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.

15.2 CRC main features

15.3 CRC functional description

15.3.1 CRC block diagram

Figure 29. CRC calculation unit block diagram

Figure 29. CRC calculation unit block diagram. The diagram shows a 32-bit AHB bus at the top with arrows indicating read access, write access, and 32-bit accesses. Below the bus is a grey box representing the CRC unit. Inside, there are two 'Data register' blocks: 'Data register (output)' and 'Data register (input)'. The 'Data register (output)' is connected to the bus via 'read access' and to the 'CRC computation' block. The 'Data register (input)' is connected to the bus via 'write access' and to the 'CRC computation' block. The 'CRC computation' block is also connected to four configuration registers: 'CRC_INIT', 'CRC_CR', 'CRC_POL', and 'CRC_IDR'. A 'crc_hclk' signal is shown entering the unit from the left. The diagram is labeled MS19882V3 in the bottom right corner.
Figure 29. CRC calculation unit block diagram. The diagram shows a 32-bit AHB bus at the top with arrows indicating read access, write access, and 32-bit accesses. Below the bus is a grey box representing the CRC unit. Inside, there are two 'Data register' blocks: 'Data register (output)' and 'Data register (input)'. The 'Data register (output)' is connected to the bus via 'read access' and to the 'CRC computation' block. The 'Data register (input)' is connected to the bus via 'write access' and to the 'CRC computation' block. The 'CRC computation' block is also connected to four configuration registers: 'CRC_INIT', 'CRC_CR', 'CRC_POL', and 'CRC_IDR'. A 'crc_hclk' signal is shown entering the unit from the left. The diagram is labeled MS19882V3 in the bottom right corner.

15.3.2 CRC internal signals

Table 63. CRC internal input/output signals

Signal nameSignal typeDescription
crc_hclkDigital inputAHB clock

15.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.

Polynomial programmability

The polynomial coefficients are fully programmable through the CRC_POL register, and the polynomial size can be configured to be 7, 8, 16 or 32 bits by programming the POLYSIZE[1:0] bits in the CRC_CR register. Even polynomials are not supported.

Note: The type of an even polynomial is \( X+X^2+\dots+X^n \) , while the type of an odd polynomial is \( 1+X+X^2+\dots+X^n \) .

If the CRC data is less than 32-bit, its value can be read from the least significant bits of the CRC_DR register.

To obtain a reliable CRC calculation, the change on-fly of the polynomial value or size can not be performed during a CRC calculation. As a result, if a CRC calculation is ongoing, the application must either reset it or perform a CRC_DR read before changing the polynomial.

The default polynomial value is the CRC-32 (Ethernet) polynomial: 0x4C11DB7.

15.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.

15.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.

15.4.2 CRC independent data register (CRC_IDR)

Address offset: 0x04

Reset value: 0x0000 0000

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

Bits 31:0 IDR[31:0] : General-purpose 32-bit data register bits

These bits can be used as a temporary storage location for four bytes.

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

15.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]POLYSIZE[1:0]Res.Res.RESET
rwrwrwrwrwrs

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:3 POLYSIZE[1:0] : Polynomial size

These bits control the size of the polynomial.

00: 32 bit polynomial

01: 16 bit polynomial

10: 8 bit polynomial

11: 7 bit polynomial

Bits 2: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

15.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.

15.4.5 CRC polynomial (CRC_POL)

Address offset: 0x14

Reset value: 0x04C1 1DB7

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

Bits 31:0 POL[31:0] : Programmable polynomial

This register is used to write the coefficients of the polynomial to be used for CRC calculation.

If the polynomial size is less than 32 bits, the least significant bits have to be used to program the correct value.

15.4.6 CRC register map

Table 64. CRC register map and reset values

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x00CRC_DRDR[31:0]
Reset value11111111111111111111111111111111
0x04CRC_IDRIDR[31:0]
Reset value0000000000000000000000000000000
0x08CRC_CRResResResResResResResResResResResResResResResResResResResResResResResResREV_OUTREV_IN[1:0]POLYSIZE[1:0]ResResRESET
Reset value000
0x10CRC_INITCRC_INIT[31:0]
Reset value1111111111111111111111111111111
0x14CRC_POLPOL[31:0]
Reset value0000010011000001000111011011011

Refer to Section 2.2 for the register boundary addresses.