В этой статье приведен перевод раздела "CRC calculation unit" из документа RM0090 [1]. Эта информация касается главным образом аппаратного блока CRC семейства STM32F4xx. Информация по другим семействам STM32, принцип работы и примеры использования см. в [2].
В различных приложениях техники CRC широко используются для проверки качества передачи данных или целостности информации устройства хранения данных. В области действия стандарта EN/IEC 60335-1 предусматривается проверка CRC для целостности данных в памяти Flash. Блок вычисления CRC помогает вычислить сигнатуру ПО во время работы программы, и сравнить её с сигнатурой, сгенерированной во время линковки приложения, сохраненной в указанном месте в памяти.
Основные функции блока CRC:
• Используется стандартный полином CRC-32 (Ethernet): 0x4C11DB7 (X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X + 1). • Один 32-битный регистр для ввода/вывода данных (CRC_DR). • Вычисление CRC от одной порции данных занимает 4 такта шины AHB (HCLK). • Имеется 8-битный регистр общего назначения (CRC_IDR). Он может использоваться для временного хранения данных.
Блок-схема аппаратуры CRC показана на рис. 8.
Рис. 8. Устройство блока вычисления CRC.
[Функциональное описание CRC]
Блок вычисления CRC состоит главным образом из одного 32-битного регистра данных (CRC_DR), который:
• Используется как входной регистр для ввода новых данных в калькулятор CRC (когда происходит запись в этот регистр). • Хранит результат предыдущей калькуляции CRC (когда этот регистр считывается).
Каждая операция записи в этот регистр создает комбинацию предыдущего значения CRC и нового (вычисление CRC осуществляется на всем 32-битном слове данных, а не байт за байтом).
Операция записи приостанавливается до окончания вычисления CRC над очередной порцией данных, что позволяет выполнить доступ на запись типа back-to-back, или смежные операции записи и чтения.
Калькулятор CRC может быть сброшен в 0xFFFFFFFF битом RESET в регистре управления CRC_CR. Эта операция не влияет на содержимое регистра CRC_IDR.
[Регистры CRC]
Интерфейс блока вычисления CRC очень простой, и содержит всего лишь 2 регистра данных и один регистр управления. К регистрам периферийного устройства CRC нужно обращаться как к словам (32-битный доступ).
Далее во врезках приведено описание этих регистров. Байтовое смещение адреса указано относительно базового адреса (базовый адрес CRC_BASE, его значение можно узнать из заголовочного файла библиотеки STM32CubeMX. Например, для микроконтроллера STM32F407 это файл заголовка stm32f407xx.h). Аббревиатура rw обозначает доступ на чтение и запись, w операцию записи.
Смещение адреса: 0x04 Значение после сброса: 0x00000000
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
зарезервировано
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
зарезервировано
DR[7:0] rw
Биты 31:8 зарезервированы, должны сохраняться в состоянии после сброса (все нули).
Биты 7:0 это 8-битный регистр данных общего назначения. Для блока CRC он не нужен, это какой-то атавизм, оставшийся от аппаратуры других семейств. Может использоваться как временное хранилище для одного байта данных.
На этот регистр не влияют сбросы CRC, генерируемые битом RESET регистра CRC_CR.
Смещение адреса: 0x08 Значение после сброса: 0x00000000
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
зарезервировано
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
зарезервировано
RESET w
Биты 31:1 зарезервированы, должны сохраняться в состоянии после сброса (все нули).
RESET (бит 0): сбрасывает вычисление CRC в начальное состояние, и устанавливает регистр данных в 0xFFFFFFFF. Этот бит можно только лишь установить, он сбрасывается автоматически аппаратурой.
Таблица 21. Карта памяти регистров блока CRC и их значения после сброса.
Комментарии
RSS лента комментариев этой записи