STM32软硬件CRC测速对比

硬件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电平翻转,示波器捕获,该方法比较精确

    c 复制代码
    static 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倍左右
相关推荐
Zevalin爱灰灰29 分钟前
编程技巧(基于STM32)第一章 定时器实现非阻塞式程序——按键控制LED灯闪烁模式
stm32·单片机·嵌入式硬件
尼尔森系4 小时前
排序与算法:希尔排序
c语言·算法·排序算法
苏慕TRYACE4 小时前
RT-Thread+STM32L475VET6实现红外遥控实验
stm32·单片机·嵌入式硬件·rt-thread
GEEK.攻城狮5 小时前
使用VSCODE开发C语言程序
c语言·ide·vscode
Victoria.a5 小时前
数组和指针常见笔试题(深度剖析)
c语言·开发语言
xiaohai@Linux6 小时前
ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)
c语言·嵌入式硬件·tcp/ip·wifi·esp32
L_09077 小时前
【C】初阶数据结构6 -- 队列
c语言·开发语言·数据结构
yyqzjw8 小时前
【STM32】外部时钟|红外反射光电开关
stm32·单片机·嵌入式硬件
charlie1145141918 小时前
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
c语言·stm32·单片机·嵌入式硬件·学习·教程
苏慕TRYACE8 小时前
RT-Thread+STM32L475VET6——ADC采集电压
stm32·单片机·嵌入式硬件·rt-thread