我正在研究运行Linux的计算机和STM32F0之间的通信链接。我想对我的包使用某种错误检测,因为STM32F0有CRC32 hw,我在Linux上有zlib和CRC32,所以我认为在我的项目中使用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);
}输出CRC32 value of 0 is: d202ef8d,这与几个在线计算器上的结果相匹配。
不过,无论我在STM32上使用什么设置,我似乎都无法获得相同的CRC。我已经找到了CRC如何计算其值在ST的申请说明中的流程图,但我不知道它是如何在zlib中实现的。
有人知道它们是否兼容吗?
编辑1,它们都使用相同的init值和多项式。
编辑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;
...发布于 2015-01-21 21:23:23
从文档中可以看出,您的STM32代码不仅仅是无趣的,而且是相当不完整的。从文档中,为了使用CRC硬件,您需要:
特别注意步骤2、3和4,这些步骤定义了正在计算的CRC。他们说他们的例子有rev_in和rev_out错误,但是对于zlib来说,它们必须是真的。根据硬件实现的方式,多项式可能也需要反转(0xedb88320UL)。最初的crc需要是0xffffffff,最后的CRC需要倒置以匹配zlib CRC。
发布于 2016-06-10 09:54:40
CRC32实现在STM32Fx上似乎不是您在许多联机CRC计算器上找到的标准CRC32实现,也不是在zip中使用的标准CRC32实现。
STM32实现了CRC32-MPEG 2,它使用的是大终端和无最终翻转掩码,而压缩CRC32使用的是小终端和最终翻转掩码。
我发现了支持CRC32-MPEG 2的这在线计算器。
如果您对其他CRC算法及其实现更感兴趣,请看这个链接。
PS:来自STM的HAL驱动程序支持字节、半字和字格式的输入,在v1.3.1中,它们似乎对STM32F0x很好
发布于 2015-01-21 10:37:27
我还没有对此进行测试,但我怀疑您实际上并没有在STM32上进行8位的编写。
相反,您可能会对寄存器的全部宽度(32位)进行写入,这当然意味着您正在计算的字节数比预期的要多。
反汇编生成的代码以分析所使用的确切存储指令。
https://stackoverflow.com/questions/28064278
复制相似问题