Программирование ARM STM32F4xx: блок вычисления CRC Mon, December 09 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


STM32F4xx: блок вычисления CRC Печать
Добавил(а) microsin   

В этой статье приведен перевод раздела "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.

STM32F4xx CRC calculation unit block diagram fig08

Рис. 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 операцию записи.

Смещение адреса: 0x00
Значение после сброса: 0xFFFFFFFF

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
DR [31:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DR[15:0]
rw

Используется как регистр ввода новых данных при вычислении CRC. Для операции чтения хранит результат предыдущего шага вычисления CRC.

Смещение адреса: 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 и их значения после сброса.

Смещение Регистр 32..24 23..16 15..8   7     6     5     4     3     2     1     0  
0x00 CRC_DR Регистр данных
Значение
сброса
0xFFFFFFFF
0x04 CRC_DR Зарезервировано Независимый регистр данных
Значение
сброса
0x00
0x08 CRC_DR Зарезервировано RESET
Значение
сброса
0

[Ссылки]

1. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs site:st.com.
2. STM32: использование аппаратного блока CRC.
3. Демистификация CRC32.

 

Комментарии  

 
0 #1 Gary M. 21.09.2023 15:48
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X + 1; это есть 0x104C11DB7 - не так ли?
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page