Программирование ARM STM32: использование аппаратного блока CRC Sun, December 08 2024  

Поделиться

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

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


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 в качестве контроллера перемещения данных.
• CRC_DMA: как использовать DMA в качестве контроллера перемещения данных для генерации CRC.

[1. Обзор периферийного устройства CRC]

Аппаратный блок CRC всех микроконтроллеров STM32 может использоваться для вычисления CRC любых поддерживаемых типов данных (поддерживаемые типы зависят от семейства MCU, см. таблицу 5).

1.1. Алгоритм вычисления CRC. Как показано на рис. 1, алгоритм CRC получает на входе данные, и генерирует фиксированный код контрольной суммы в зависимости от входных параметров.

AN4187 CRC block diagram fig01

Рис. 1. Блок-схема вычисления CRC.

Один из известных алгоритмов CRC это деление полиномов с техникой побитной операции XOR. Это наиболее подходящая техника для аппаратной или низкоуровневой реализации.

Входные параметры этого алгоритма следующие:

• Делимое (dividend): оно также называется входными данными, с аббревиатурой Input_Data.
• Делитель (divisor): также называется генератор полинома, с аббревиатурой POLY.
• Начальное значение CRC: связывается с аббревиатурой Initial_Crc.

AN4187 CRC algorithm flowchart fig02

Рис. 2. Алгоритм вычисления CRC.

В самом начале алгоритм устанавливает CRC в Initial_Crc с операцией XOR над Input_Data. Как только CRC MSB становится равным 1, алгоритм сдвигает CRC на один разряд влево, и выполняет операцию XOR со значением POLY. Иначе происходит только сдвиг на один разряд влево.

На рис. 3 показан пример выполнения по шагам алгоритма со следующими условиями:

Input_Data = 0xC1
POLY = 0xCB
Initial_Crc = 0xFF

AN4187 CRC step by step computing example fig03

Рис. 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) и нового значения.

AN4187 CRC calculation unit block diagram fig04

Рис. 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.

AN4187 CRC computing through DMA transfer fig05

Рис. 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 НЕТ ДА
Опция реверсивности ввода/вывода данных НЕТ ДА
Начальное значение CRC Фиксировано на 0xFFFFFFFF Программируется на 32 битах Программируется на 8, 16, 32 битах
Обрабатываемая разрядность данных 32 8, 16, 32
Размер полинома в битах 32 7, 8, 16, 32
Коэффициенты полинома Фиксированы на 0x4C11DB7 Программируется

• STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM-based 32-bit MCUs reference manual (RM0008).
• STM32F205xx, STM32F207xx, STM32F215xx and STM32F217xx advanced ARMbased 32-bit MCUs reference manual (RM0033).
• STM32L151xx, STM32L152xx and STM32L162xx advanced ARM-based 32-bit MCUs reference manual (RM0038).
• STM32F100xx advanced ARM-based 32-bit MCUs reference manual (RM0041).
• STM32F05xxx advanced ARM-based 32-bit MCUs reference manual (RM0091).
• STM32F37xx and STM32F38xx advanced ARM-based 32-bit MCUs reference manual (RM00313).
• STM32F302xx, STM32F303xx and STM32F313xx advanced ARM-based 32-bit MCUs reference manual (RM00316).

Примечание: эти документы можно скачать с сайта компании 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.
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.
4en.stsw-stm32an4187.zip - примеры кода.
5. STM32F4xx: блок вычисления CRC.
6Демистификация CRC32.

 

Комментарии  

 
0 #1 Дмитрий 01.01.2021 18:00
Приведенный пример с HAL ведь не задействует DMA? А есть HAL функции с участием DMA для вычисления CRC?

microsin: нашел статью по этой теме: HAL library 10- CRC for STM32Fxxx site:stm32f4-discovery.net
Цитировать
 

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


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

Top of Page