我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路。我想对我的数据包使用某种错误检测,并且由于 STM32F0 有 CRC32 硬件,并且我在 Linux 上有带有 CRC32 的 zlib,所以我认为在我的项目中使用 CRC32 是个好主意。问题是我不会在不同平台上为相同的数据获得相同的 CRC 值。
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <zlib.h>
int
main(void)
{
uint8_t byte0 = 0x00;
uint32_t crc0 = crc32(0L, Z_NULL, 0);
crc0 = crc32(crc0, &byte0, 1);
printf("CRC32 value of %" PRIu8 " is: %08" PRIx32 "\n", byte0, crc0);
}
outputs CRC32 value of 0 is: d202ef8d
这与几个在线计算器的结果相匹配。
似乎无论我在 STM32 上使用什么设置,我都无法获得相同的 CRC。
我找到了关于 CRC hw 如何计算其值的流程图ST 的应用说明中但我不知道它是如何在 zlib 中完成的。
有谁知道它们是否兼容?
[编辑 1] 它们都使用相同的初始值和多项式。
[编辑 2] STM32 代码相对无趣,因为它使用 hw.
...
/* Default values are used for init value and polynomial, see edit 1 */
CRC->CR |= CRC_CR_RESET;
CRC->DR = (uint8_t)0x00;
uint32_t crc = CRC->DR;
...
STM32Fx 上的 CRC32 实现似乎不是您在许多在线 CRC 计算器和 zip 中找到的标准 CRC32 实现。
STM32 实现的 CRC32-MPEG2 使用大端且无最终翻转掩码,而 zip CRC32 使用小端和最终翻转掩码。
I found this支持CRC32-MPEG2的在线计算器。
如果您对其他 CRC 算法及其实现更感兴趣,请查看此link.
PS:STM 的 HAL 驱动程序支持字节、半字和字格式的输入,并且它们似乎适用于 v1.3.1 中的 STM32F0x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)