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
相关产品推荐
相关产品推荐

