Перейти к содержанию

Регистры CRC STM32F3

Регистры CRC STM32F3: запись данных и чтение результата, программируемый полином 7, 8, 16 или 32 бита, начальное значение и обращение порядка битов на входе и выходе.

Блок CRC STM32F3 программируемый, как у STM32F0 и G0: полином задаётся в POL, размер — полем POLYSIZE, начальное значение — в INIT. Данные пишут в DR словами, полусловами или байтами, результат читают из того же DR (RM0316, раздел 6.4).

После сброса блок настроен на CRC-32 Ethernet (полином 0x04C1 1DB7, начальное 0xFFFF FFFF), но без обращения битов. Для стандартного CRC-32 как в zlib установите REV_IN = 11 и REV_OUT = 1 и инвертируйте результат.

ЭкземплярБазовый адресЕсть у
CRC0x4002 3000всех

Регистры блока

РегистрСмещениеНазначениеПосле сброса
CRC_DR0x00Данные и результат0xFFFF FFFF
CRC_IDR0x04Свободный регистр0x0000 0000
CRC_CR0x08Сброс, размер полинома и обращение битов0x0000 0000
CRC_INIT0x10Начальное значение0xFFFF FFFF
CRC_POL0x14Полином0x04C1 1DB7

Конструктор значения

Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.

Значение: 0xFFFFFFFF

1111 1111 1111 1111 1111 1111 1111 1111

CRC->DR = 0xFFFFFFFF;

CRC_DR — данные и результат

Смещение 0x00, адрес 0x4002 3000, 32 бит, после сброса 0xFFFF FFFF. В коде: CRC->DR.

31302928272625242322212019181716
DR
1514131211109876543210
DR
  • DR (биты 31:0) — Запись — следующие данные (8, 16 или 32 бита), чтение — текущий CRC.

CRC_IDR — свободный регистр

Смещение 0x04, адрес 0x4002 3004, 8 бит, после сброса 0x0000 0000. В коде: CRC->IDR.

76543210
IDR
  • IDR (биты 7:0) — Свободный регистр для временных данных.

CRC_CR — сброс, размер полинома и обращение битов

Смещение 0x08, адрес 0x4002 3008, 32 бит, после сброса 0x0000 0000. В коде: CRC->CR.

31302928272625242322212019181716
—
1514131211109876543210
—REV_OUTREV_INPOLYSIZE—RESET
  • REV_OUT (бит 7) — Обращение порядка битов результата.
  • REV_IN (биты 6:5) — Обращение порядка битов входных данных: по байтам, полусловам или словам.
  • POLYSIZE (биты 4:3) — Размер полинома: 32, 16, 8 или 7 бит.
  • RESET (бит 0) — Сброс вычислителя: DR = CRC_INIT.

CRC_INIT — начальное значение

Смещение 0x10, адрес 0x4002 3010, 32 бит, после сброса 0xFFFF FFFF. В коде: CRC->INIT.

31302928272625242322212019181716
INIT
1514131211109876543210
INIT
  • INIT (биты 31:0) — Начальное значение CRC.

CRC_POL — полином

Смещение 0x14, адрес 0x4002 3014, 32 бит, после сброса 0x04C1 1DB7. В коде: CRC->POL.

31302928272625242322212019181716
POL
1514131211109876543210
POL
  • POL (биты 31:0) — Коэффициенты полинома (по умолчанию 0x04C1 1DB7 — CRC-32).

Частые вопросы

Как посчитать CRC-16/MODBUS на STM32F303?

POLYSIZE = 01 (16 бит), POL = 0x8005, INIT = 0xFFFF, REV_IN = 01 (по байтам), REV_OUT = 1. Пишите данные байтами через 8-битный доступ к DR и читайте младшие 16 бит.

Сбрасывается ли CRC сам перед новым расчётом?

Нет: запишите 1 в бит RESET регистра CR — в DR загрузится значение INIT.

Источники

  1. STMicroelectronics. RM0316: Reference manual (Rev 10) — раздел 6.4: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-f3 v2.3.9: заголовки CMSIS stm32f303x8.h, stm32f303xc.h, stm32f303xe.h, stm32f328xx.h, stm32f358xx.h, stm32f398xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

Нашли ошибку в регистрах?

Другие регистры STM32F3

Калькуляторы и статьи