В проекте представлены две реализации расчёта CRC32 для микроконтроллеров STM32F103 и для десктопных систем:
-
CRC_UNIT (C++/STM32)
Шаблонный класс, использующий аппаратный блок CRC микроконтроллера STM32.
Подходит для встроенных систем, где требуется высокая скорость и аппаратная поддержка. -
calc_crc_stm32.py (Python)
Чисто программная реализация CRC32, полностью повторяющая алгоритм STM32.
Подходит для отладки, тестирования и использования на ПК или в любых системах, где доступен Python.
- Совместимость с полиномом
0x04C11DB7(IEEE 802.3). - Поддержка обработки массивов байт (
uint8_t*) и слов (uint32_t*). - Результат ограничен до
uint8_t, как в STM32 (младший байт регистра CRC). - Возможность проверки входных данных на десктопе перед прошивкой в контроллер.
CRC_Project/
├──
├── calc_crc_stm32.py # Реализация CRC для Python
├── test_crc_stm32.py # Unit-тесты для Python
├── test_crc.cpp # Unit-тесты для STM32
├── README.md # Документация
└── LICENSE # Лицензия MIT
Инициализировать CRC модуль:
#include "CRC_UNIT.h"
CRC_UNIT<uint8_t>::CRC_Init();или HAL инициализация:
hcrc.Instance = CRC;
if (HAL_CRC_Init(&hcrc) != HAL_OK)
{
Error_Handler();
}Использование для рачета:
uint8_t data[10] = {0,1,2,3,4,5,6,7,8,9};
uint8_t crc = CRC_UNIT<uint8_t>::calculateCRC(data, 10);
// crc == 0xD1from calc_crc_stm32 import calc_crc_stm32
data = bytes(range(10))
crc = calc_crc_stm32(data)
print(f"CRC uint8_t: 0x{crc:02X}") # 0xD1Запустите unit‑тесты:
python3 -m unittest test_crc_stm32.pyДобавьте test_crc.cpp в проект CubeIDE и соберите.
Вывод CRC сравните с результатами Python‑версии.
- Для STM32 используется аппаратный блок CRC, поэтому расчёт максимально быстрый.
- Для Python — чистая эмуляция, полезна для тестов и валидации.
- Обе реализации дают одинаковый результат при одинаковых входных данных.