STM32: использование аппаратного блока CRC |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Техника контрольной суммы (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 в качестве контроллера перемещения данных. [1. Обзор периферийного устройства CRC] Аппаратный блок CRC всех микроконтроллеров STM32 может использоваться для вычисления CRC любых поддерживаемых типов данных (поддерживаемые типы зависят от семейства MCU, см. таблицу 5). 1.1. Алгоритм вычисления CRC. Как показано на рис. 1, алгоритм CRC получает на входе данные, и генерирует фиксированный код контрольной суммы в зависимости от входных параметров. Рис. 1. Блок-схема вычисления CRC. Один из известных алгоритмов CRC это деление полиномов с техникой побитной операции XOR. Это наиболее подходящая техника для аппаратной или низкоуровневой реализации. Входные параметры этого алгоритма следующие: • Делимое (dividend): оно также называется входными данными, с аббревиатурой Input_Data. Рис. 2. Алгоритм вычисления CRC. В самом начале алгоритм устанавливает CRC в Initial_Crc с операцией XOR над Input_Data. Как только CRC MSB становится равным 1, алгоритм сдвигает CRC на один разряд влево, и выполняет операцию XOR со значением POLY. Иначе происходит только сдвиг на один разряд влево. На рис. 3 показан пример выполнения по шагам алгоритма со следующими условиями: Input_Data = 0xC1 Рис. 3. Пошаговый пример вычисления CRC. Примечания: 1. Возвращенное значение CRC (0x4C) проверяется периферией CRC в STM32F37x с показанной выше конфигурацией. 1.2. Конфигурация периферии CRC. Во всех устройствах STM32 реализовано периферийное устройство CRC. У блока вычисления CRC есть один 32-битный регистр данных (CRC_DR), доступный на чтение и запись. Он используется для ввода новых данных (запись) и хранение результата от предыдущего шага вычисления CRC (доступ на чтение). Каждая операция записи регистра данных создает комбинацию предыдущего значения CRC (сохраненного в CRC_DR) и нового значения. Рис. 4. Блок-схема аппаратуры периферии CRC. Для вычисления CRC любых предоставленных данных, Вы должны следовать следующим шагам: 1. Разрешите тактирование периферии CRC с помощью программирования периферии RCC. В архиве примеров [4] код CRC_usage вычисляет CRC от массива данных (DataBuffer) из 256 элементов поддерживаемого типа (поддерживаемые типы зависят от семейства MCU, см. таблицу 5).. Для полного описания см. файл Readme.txt в папке CRC_usage. 1.3. Аппаратное ускорение CRC. Пример CRC_usage разработан для проверки совместимости между программно реализованным алгоритмом CRC и вычислением CRC на основе периферии CRC. Это позволяет сравнить скорость вычисления CRC у этих двух методов. Пример выполнялся в следующих рабочих условиях: – Плата разработчика STM32373C-EVAL (микроконтроллер STM32F37x). CRC_CR: 0x0000 0000, POLYSIZE 32, без REV_IN и REV_OUT. Таблица 2 показывает результаты сравнения времени выполнения программного вычисления CRC и аппаратного. Таблица 2. Сравнение времени работы программного алгоритма CRC и вычисления CRC с помощью аппаратного блока CRC. Время указано в системных тактах.
Аппаратная реализация CRC показывает 60-кратное ускорение вычисления по сравнению с программной реализацией. CPU управляет перемещением данных, не обрабатывая на этой фазе никакие инструкции вычисления. Разработчик приложения может выбрать другое периферийное устройство в качестве контроллера, чтобы освободить CPU для выполнения других задач. Поскольку DMA управляет перемещением данных, он становится альтернативным выбором для вычисления CRC буфера данных. Примечания: (a) Применимо только для микроконтроллеров STM32F0xx и 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. Примечание: для дополнительной информации см. файл Readme.txt в папке CRC_DMA. Таблица 3. Варианты конфигураций DMA.
Примечание (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) В качестве измерения времени используется таймер systick, тактовая частота systick та же самая, что и тактовая частота CPU. В итоге важно отметить, что загрузка CPU эквивалентна 100%, когда CPU обслуживает передачу данных, в то время как при использовании контроллера DMA нагрузка на CPU снижается до 0.72%. [3. Миграция кода блока CRC между разными сериями STM32] Функции периферийного устройства CRC может варьироваться от одной серии STM32 к другой. Таблица 5 перечисляет функции CRC и дает анализ совместимости ПО для каждой серии STM32. Таблица 5. Функции периферийного устройства STM32 CRC.
• STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM-based 32-bit MCUs reference manual (RM0008). Примечание: эти документы можно скачать с сайта компании ST (http://www.st.com/stm32). [Использование HAL для вычисления контрольной суммы] На самом деле модуль CRC настолько прост, чтобы возник соблазн не пользоваться библиотеками HAL. Достаточно разрешить тактирование блока CRC, и далее просто писать в его регистры. Однако чтобы в будущем можно было воспользоваться упрощенным портированием кода на любые микроконтроллеры STM32, лучше все-таки применять HAL. Итак, процесс по шагам, что нужно сделать, чтобы вычислять CRC: 1. Разрешите модуль CRC в файле stm32f4xx_hal_conf.h (файл настроек конфигурации HAL): ... /* #define HAL_CAN_MODULE_ENABLED */
#define HAL_CRC_MODULE_ENABLED
/* #define HAL_CRYP_MODULE_ENABLED */
...
2. Определите экземпляр дескриптора контрольной суммы CRC_HandleTypeDef: CRC_HandleTypeDef hcrc; 3. Определите где-нибудь функцию HAL_CRC_MspInit, которая должна разрешать тактирование блока CRC. Обычно эта функция должна быть определена в пользовательском модуле stm32f4xx_hal_msp.c: void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc) { /* Разрешение тактирования периферии CRC: */ __HAL_RCC_CRC_CLK_ENABLE(); } 4. Вызовите HAL_CRC_Init со ссылкой на дескриптор CRC: HAL_CRC_Init(&hcrc);
5. Теперь вычисление CRC можно делать простым вызовом HAL_CRC_Calculate: uint32_t CRCVal = HAL_CRC_Calculate(&hcrc, (uint32_t *)aDataBuffer, BUFFER_SIZE); Важные замечания: 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. |