Техника контрольной суммы (cyclic redundancy check, CRC) широко используется для определения наличия ошибки в цифровых данных, однако без возможности исправления, если был определен факт наличия ошибки. Это используется при передаче данных или проверки целостности хранилища данных. Диагностика данного метода соответствует требованиям основных стандартов безопасности, поэтому функция CRC используется для самотестирования целостности ST firmware, для совместимости со стандартами IEC 60335-1 и IEC 607030-1 (что известно как требования "Class B"). Для дополнительной информации см. апноут AN3307 [3] и соответствующие пакеты firmware для разных вариантов MCU. Рекомендуется проверить все необходимые настройки CRC в руководствах компилятора, когда контрольная сумма CRC помещается линкером непосредственно в код пользователя (в основном в формате таблицы данных дескриптора CRC).
CRC основана на арифметике полинома. Она вычисляет остаток от деления полинома в GF(2) на другой полином. Остаток называется контрольной суммой, хотя делимое это данные, а делитель это генератор полинома.
Примечание: полином GF(2) (Galois field, поле Галуа с двумя элементами) это полином с одной переменной x, где коэффициенты полинома 0 или 1.
В этом апноуте (перевод AN4187 [1]) описаны возможности периферийного устройства для подсчета CRC, встроенного в MCU STM32 (серии F0, F1, F2, F3, F4, L1), и необходимые шаги для конфигурирования этого аппаратного блока.
Секция 1 описывает алгоритм реализации STM32 CRC и выгоды от его использования. Секция 2 описывает использование DMA в качестве контроллера передачи данных для CRC. Секция 3 описывает миграцию CRC на устройствах STM32.
Также приведены 2 примера, в обоих примерах показано время вычисления CRC:
• CRC_usage: как конфигурировать блок CRC, используя CPU в качестве контроллера перемещения данных. • CRC_DMA: как использовать DMA в качестве контроллера перемещения данных для генерации CRC.
[1. Обзор периферийного устройства CRC]
Аппаратный блок CRC всех микроконтроллеров STM32 может использоваться для вычисления CRC любых поддерживаемых типов данных (поддерживаемые типы зависят от семейства MCU, см. таблицу 5).
1.1. Алгоритм вычисления CRC. Как показано на рис. 1, алгоритм CRC получает на входе данные, и генерирует фиксированный код контрольной суммы в зависимости от входных параметров.
Рис. 1. Блок-схема вычисления CRC.
Один из известных алгоритмов CRC это деление полиномов с техникой побитной операции XOR. Это наиболее подходящая техника для аппаратной или низкоуровневой реализации.
Входные параметры этого алгоритма следующие:
• Делимое (dividend): оно также называется входными данными, с аббревиатурой Input_Data. • Делитель (divisor): также называется генератор полинома, с аббревиатурой POLY. • Начальное значение CRC: связывается с аббревиатурой Initial_Crc.
Рис. 2. Алгоритм вычисления CRC.
В самом начале алгоритм устанавливает CRC в Initial_Crc с операцией XOR над Input_Data. Как только CRC MSB становится равным 1, алгоритм сдвигает CRC на один разряд влево, и выполняет операцию XOR со значением POLY. Иначе происходит только сдвиг на один разряд влево.
На рис. 3 показан пример выполнения по шагам алгоритма со следующими условиями:
Input_Data = 0xC1 POLY = 0xCB Initial_Crc = 0xFF
Рис. 3. Пошаговый пример вычисления CRC.
Примечания:
1. Возвращенное значение CRC (0x4C) проверяется периферией CRC в STM32F37x с показанной выше конфигурацией. 2. Эта подпрограмма была реализована в функции CrcSoftwareFunc примера CRC_usage из архива примеров [4].
1.2. Конфигурация периферии CRC. Во всех устройствах STM32 реализовано периферийное устройство CRC. У блока вычисления CRC есть один 32-битный регистр данных (CRC_DR), доступный на чтение и запись. Он используется для ввода новых данных (запись) и хранение результата от предыдущего шага вычисления CRC (доступ на чтение).
Каждая операция записи регистра данных создает комбинацию предыдущего значения CRC (сохраненного в CRC_DR) и нового значения.
Рис. 4. Блок-схема аппаратуры периферии CRC.
Для вычисления CRC любых предоставленных данных, Вы должны следовать следующим шагам:
1. Разрешите тактирование периферии CRC с помощью программирования периферии RCC. 2. Установите регистр данных CRC в начальное значение CRC путем конфигурирования значения регистра Initial CRC (CRC_INIT)(a). 3. Установите порядок инверсии бит I/O в поле бит REV_IN[1:0] и REV_OUT соответственно, они находятся в регистре управления CRC Control register (CRC_CR)(a). 4. Установите размер полинома и коэффициенты битами POLYSIZE[1:0] в регистре управления CRC Control register (CRC_CR) и регистре полинома CRC Polynomial register (CRC_POL) соответственно(b). 5. Сбросьте периферийное устройство битом Reset в CRC Control register (CRC_CR). 6. Установите данные в регистре CRC Data. 7. Прочитайте содержимое регистра CRC Data. 8. Запретите тактирование периферии CRC.
В архиве примеров [4] код CRC_usage вычисляет CRC от массива данных (DataBuffer) из 256 элементов поддерживаемого типа (поддерживаемые типы зависят от семейства MCU, см. таблицу 5).. Для полного описания см. файл Readme.txt в папке CRC_usage.
1.3. Аппаратное ускорение CRC. Пример CRC_usage разработан для проверки совместимости между программно реализованным алгоритмом CRC и вычислением CRC на основе периферии CRC. Это позволяет сравнить скорость вычисления CRC у этих двух методов.
Пример выполнялся в следующих рабочих условиях:
– Плата разработчика STM32373C-EVAL (микроконтроллер STM32F37x). – Системная тактовая частота: HSE (от кварцевого резонатора 8 МГц). – Тулчейн: Keil V4.60.0.0. – Конфигурация CRC: значения по умолчанию регистров CRC.
CRC_CR: 0x0000 0000, POLYSIZE 32, без REV_IN и REV_OUT. CRC_INIT: 0XFFFFFFFF CRC_POLY: 0X04D11CDB7 Входные данные: 256 слов.
Таблица 2 показывает результаты сравнения времени выполнения программного вычисления CRC и аппаратного.
Таблица 2. Сравнение времени работы программного алгоритма CRC и вычисления CRC с помощью аппаратного блока CRC. Время указано в системных тактах.
Уровень оптимизации
Время программной реализация CRC
Время реализации на основе периферии CRC
Level 3 + оптимизация времени выполнения
78094
1287
Аппаратная реализация CRC показывает 60-кратное ускорение вычисления по сравнению с программной реализацией. CPU управляет перемещением данных, не обрабатывая на этой фазе никакие инструкции вычисления. Разработчик приложения может выбрать другое периферийное устройство в качестве контроллера, чтобы освободить CPU для выполнения других задач. Поскольку DMA управляет перемещением данных, он становится альтернативным выбором для вычисления CRC буфера данных.
Примечания:
(a) Применимо только для микроконтроллеров STM32F0xx и STM32F3xx. (b) Применимо только для микроконтроллеров STM32F3xx.
[2. Использование DMA для блока CRC]
Встроенный блок DMA STM32 может использоваться как менеджер пересылки данных при вычислении CRC, освободив CPU от функций контроллера пересылки. Конфигурация DMA зависит от выбранной архитектуры. Существует 2 категории: DMA с каналами и DMA с потоком. Для обоих архитектур DMA конфигурация почти одинаковая.
2.1. Режим передачи DMA back-to-back. В архиве [4] есть пример CRC_DMA, где реализована техника, показанная на рис. 5. Это режим передачи данных DMA back-to-back с callback-функцией обработчика прерывания DMA_IRQ.
Рис. 5. Вычисление CRC на основе передач DMA.
Здесь DMA контролирует счетчик транзакции данных, и ждет установки флага завершения транзакции, чтобы запустить подпрограмму обработчика NVIC DMA_IRQ. Подпрограмма NVIC DMA_IRQ должна остановить системный таймер (systick) и возвратить вычисленное значение CRC. Использование CPU ограничивается только выполнением обработчика прерывания DMA.
2.2. Конфигурация DMA. Как уже упоминалось, MCU STM32 интегрируют в себе несколько архитектур DMA. Шаги конфигурации, показанные ниже, являются общими для обоих архитектур DMA:
1. Разрешите тактирование периферии DMA программированием контроллера RCC. 2. Сконфигурируйте канал/поток DMA (см. таблицу 3 для этих двух конфигураций). 3. Сконфигурируйте CRC точно так же, как это было сделано на первых 5 шагах в секции 1.2. 4. Разрешите прерывание DMA transfer complete. 5. Сконфигурируйте DMA NVIC IRQ. 6. Разрешите канал/поток DMA. 7. Ждите события (прерывания) завершения передачи DMA. 8. Запретите канал DMA. В случае DMA с архитектурой потока, контроллер автоматически запрещает канал, на котором закончилась передача, в то время как в другом случае, с архитектурой канала, подпрограмма NVIC DMA_IRQ должна запретить канал для будущего использования. 9. Очистите бит ожидания обработки прерывания (DMA IT).
Примечание: для дополнительной информации см. файл Readme.txt в папке CRC_DMA.
Таблица 3. Варианты конфигураций DMA.
Конфигурация DMA
DMA с каналом
DMA с потоком
Направление передачи данных
память-память
Адрес периферии
Flash Base pointer
Адрес памяти
Регистр данных CRC
Инкремент адреса периферии
Разрешено
Инкремент адреса памяти
Запрещено
Размер буфера
Размер буфера данных
Размер данных периферии
Поддерживаемый тип данных: байт, полуслово (16 бит), слово (32 бита), см. таблицу 5.
Размер данных памяти
Режим транзакции
Normal
Peripheral Burst
Недоступно
Single
Memory Burst
Недоступно
Single
FIFO mode(1)
Недоступно
Запрещено
FIFO threshold(1)
Недоступно
-
Примечание (1): разрешение режима FIFO не влияет на время выполнения. Таким образом, режим FIFO и настройка конфигурации порога FIFO ни на что не влияют.
Пример CRC_DMA разработан для проверки совместимости результатов при использовании в качестве контроллера CPU и при использовании в качестве контроллера блока DMA, и измерения загрузки CPU при использовании в качестве контроллера блока DMA.
2.3. Выгода при использовании DMA. В режиме передачи DMA back-to-back ядро CPU используется для вычислений только во время настройки блоков CRC и DMA, и во время выполнения обработчика прерывания DMA.
Рабочие условия в этом примере такие же, как были в секции 1.3, кроме размера входных данных, который стал теперь 8192 элементов данных поддерживаемого типа (поддерживаемые типы зависят от семейства MCU, см. таблицу 5).
Таблица 4. Сравнение затрат процессорного времени на вычисление CRC при контроллере CPU и контроллере DMA.
Кто управляет перемещением данных
Конфигурация периферии(1)
Вычисление CRC(1)
Загрузка CPU
CPU
66(2)
40962
100%
DMA
295(3)
40968
0.72%
Примечания:
(1) В качестве измерения времени используется таймер systick, тактовая частота systick та же самая, что и тактовая частота CPU. (2) Время выполнения конфигурации CRC. (3) Время выполнения конфигурации CRC, конфигурации DMA и обработчика DMA IRQ.
В итоге важно отметить, что загрузка CPU эквивалентна 100%, когда CPU обслуживает передачу данных, в то время как при использовании контроллера DMA нагрузка на CPU снижается до 0.72%.
[3. Миграция кода блока CRC между разными сериями STM32]
Функции периферийного устройства CRC может варьироваться от одной серии STM32 к другой. Таблица 5 перечисляет функции CRC и дает анализ совместимости ПО для каждой серии STM32.
Таблица 5. Функции периферийного устройства STM32 CRC.
Функция
F1
L1
F2
F4
F0
F3
Одиночный 32-битный регистр ввода/вывода данных
ДА
8-битный регистр общего назначения
ДА
Входной буфер, чтобы избежать приостановки шины во время вычисления CRC
Примечание: эти документы можно скачать с сайта компании ST (http://www.st.com/stm32).
[Использование HAL для вычисления контрольной суммы]
На самом деле модуль CRC настолько прост, чтобы возник соблазн не пользоваться библиотеками HAL. Достаточно разрешить тактирование блока CRC, и далее просто писать в его регистры. Однако чтобы в будущем можно было воспользоваться упрощенным портированием кода на любые микроконтроллеры STM32, лучше все-таки применять HAL. Итак, процесс по шагам, что нужно сделать, чтобы вычислять CRC:
3. Определите где-нибудь функцию HAL_CRC_MspInit, которая должна разрешать тактирование блока CRC. Обычно эта функция должна быть определена в пользовательском модуле stm32f4xx_hal_msp.c:
1. BUFFER_SIZE указывается не в байтах, а в количестве 32-разрядных слов.
2. Буфер aDataBuffer может быть любого типа, но его размер в байтах должен нацело делиться на 4.
3. Этот пример использования хорошо работает на семействах L1, F1, F2, F4, у которых упрощенный блок CRC. На микроконтроллерах других семейств может понадобиться настроить дополнительные параметры, иначе будут действовать настройки вычисления CRC по умолчанию.
[Ссылки]
1. AN4187 Using the CRC peripheral in the STM32 family site:st.com. 2. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs site:st.com. 3. AN3307 Guidelines for obtaining IEC 60335 Class B certification for any STM32 application site:st.com. 4. en.stsw-stm32an4187.zip - примеры кода. 5. STM32F4xx: блок вычисления CRC. 6. Демистификация CRC32.
Комментарии
microsin: нашел статью по этой теме: HAL library 10- CRC for STM32Fxxx site:stm32f4-discovery.net
RSS лента комментариев этой записи