You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nucleo F4与PC端Python的CRC32计算结果不一致原因咨询

Nucleo F401RE内置CRC与Python CRC计算结果不一致的问题排查

我使用Nucleo F401RE开发板,想用内置CRC模块校验串口传输数据的完整性,但测试时发现板端和PC端Python计算的CRC结果不一致:

测试代码与结果

Nucleo代码

uint32_t test_data = 97;
uint32_t test_crc = HAL_CRC_Calculate(&hcrc, &test_data, sizeof(test_data));

计算得到的CRC值:421584749

Python代码

from crc import Calculator, Crc32, Configuration

stm32 = Configuration(
        width = 32,
        polynomial = 0x04C11DB7,
        init_value = 0xFFFFFFFF,
        reverse_input = False,
        reverse_output = False,
        final_xor_value = 0xFFFFFFFF
)

calculator = Calculator(stm32)

print(calculator.checksum(b'\x61'))

输出结果:429103979

CRC初始化代码

static void MX_CRC_Init(void)
{

  /* USER CODE BEGIN CRC_Init 0 */

  /* USER CODE END CRC_Init 0 */

  /* USER CODE BEGIN CRC_Init 1 */

  /* USER CODE END CRC_Init 1 */
  hcrc.Instance = CRC;
  if (HAL_CRC_Init(&hcrc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CRC_Init 2 */

  /* USER CODE END CRC_Init 2 */

}

问题原因

1. 数据内容与长度不匹配

Nucleo代码中,test_data是uint32_t类型,sizeof(test_data)为4字节,实际传入CRC模块的是小端模式下的4字节数据:0x61 0x00 0x00 0x00;而Python代码仅传入了单字节0x61,两者计算的数据源完全不同。

2. STM32 CRC硬件默认行为与Python配置不匹配

STM32 F4系列的CRC模块默认开启输入字节反向、输出反向,而你的Python配置中reverse_input和reverse_output设为False,导致CRC计算的核心规则不匹配。

修正方案

方案1:调整Python代码匹配STM32硬件默认行为

修改Python的CRC配置,并传入与板端一致的4字节小端数据:

from crc import Calculator, Configuration

# 匹配STM32 CRC硬件默认配置
stm32 = Configuration(
        width = 32,
        polynomial = 0x04C11DB7,
        init_value = 0xFFFFFFFF,
        reverse_input = True,  # 开启输入反向,匹配硬件默认
        reverse_output = True, # 开启输出反向,匹配硬件默认
        final_xor_value = 0xFFFFFFFF
)

calculator = Calculator(stm32)
# 传入对应uint32_t 97的4字节小端数据
print(calculator.checksum(b'\x61\x00\x00\x00'))

运行后结果将与板端的421584749完全一致。

方案2:调整Nucleo代码适配单字节校验场景

如果实际需求是校验单字节数据,可修改板端代码调整CRC模块配置,并传入单字节数据:

修改CRC初始化代码

static void MX_CRC_Init(void)
{
  /* USER CODE BEGIN CRC_Init 0 */

  /* USER CODE END CRC_Init 0 */

  /* USER CODE BEGIN CRC_Init 1 */

  /* USER CODE END CRC_Init 1 */
  hcrc.Instance = CRC;
  // 自定义CRC配置:关闭输入/输出反向,按字节处理数据
  hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
  hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;
  hcrc.Init.GeneratingPolynomial = 0x04C11DB7;
  hcrc.Init.CRCLength = CRC_LENGTH_32B;
  hcrc.Init.InitValue = 0xFFFFFFFF;
  hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  if (HAL_CRC_Init(&hcrc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CRC_Init 2 */

  /* USER CODE END CRC_Init 2 */
}

修改测试代码

uint8_t test_data = 97; // 使用uint8_t存储单字节数据
uint32_t test_crc = HAL_CRC_Calculate(&hcrc, (uint32_t*)&test_data, sizeof(test_data));

此时保持原Python代码不变,输出结果将与板端计算值一致。


内容的提问来源于stack exchange,提问作者asfsdfg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:25:13