硬件CRC配置 以及软硬件CRC速度对比
使用CUBEMX配置默认使用的是CRC32,从库中可以看出这一点
HAL库提供了以下两个计算函数
-
HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);
这个函数用于在已有的CRC校验结果的基础上累积(accumulate)新的数据块。如果你需要分多次处理数据,比如将数据分成几个块,然后分别进行CRC计算,最后将这些计算结果合并,就可以使用这个函数。
-
HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);
这个函数用于对给定的数据块进行一次完整的CRC计算。如果你有整个数据块,并且想要一次性计算CRC,那么可以使用这个函数。
CRC16配置参考:
LINK
软件CRC32
C
#define CRC32_POLYNOMIAL 0xEDB88320u
//传入参数: 数据首地址 数据大小
static uint32_t calculate_crc32(const void *data, size_t size) {
const uint8_t *byteData = (const uint8_t *)data;
uint32_t crc = 0xFFFFFFFFu;
for (size_t i = 0; i < size; ++i) {
crc ^= byteData[i];
for (int j = 0; j < 8; ++j) {
crc = (crc >> 1) ^ ((crc & 1) ? CRC32_POLYNOMIAL : 0);
}
}
return ~crc;
}
软硬件测速对比:
平台使用STM32H7,内存使用外扩的SDRAM
对比方法
-
使用同一块内存区域校验软硬件CRC32,校验前后IO电平翻转,示波器捕获,该方法比较精确
cstatic int crc32(int argc, char **argv) { if (argc != 3) { fprintf(stderr, "Usage: crc32 <start_address> <size_in_bytes>\r\n"); return 1; // 返回错误码 } // 从命令行参数中获取起始地址和大小 uint32_t dataStartAddress; size_t dataSizeInBytes; if (sscanf(argv[1], "%x", &dataStartAddress) != 1) { fprintf(stderr, "Invalid start address\r\n"); return 1; } if (sscanf(argv[2], "%zu", &dataSizeInBytes) != 1) { fprintf(stderr, "Invalid size\r\n"); return 1; } HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); // 硬件 CRC32 size_t hard_crc32Result = HAL_CRC_Calculate(&hcrc,( void *)dataStartAddress,dataSizeInBytes); hard_crc32Result ^= 0xffffffffU; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); HAL_Delay(10); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); // 软件 CRC32 size_t soft_crc32Result = calculate_crc32((const void *)dataStartAddress, dataSizeInBytes); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); // 输出计算得到的 CRC32 值 printf("hard_crc32Result: 0x%x\r\n", hard_crc32Result); printf("soft_crc32Result: 0x%x\r\n", soft_crc32Result); return 0; // 返回成功码 }
主要部分
128K数据测试结果:
- 硬件测速在6ms左右
- 软件测速在25ms左右
2M数据测试结构
- 硬件在100ms左右
- 软件在410ms左右
总结:
- 对比结果硬件CRC32比软件CRC32快4倍左右