首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从CRC32和zlib中匹配STM32F0

从CRC32和zlib中匹配STM32F0
EN

Stack Overflow用户
提问于 2015-01-21 10:00:15
回答 6查看 8.3K关注 0票数 4

我正在研究运行Linux的计算机和STM32F0之间的通信链接。我想对我的包使用某种错误检测,因为STM32F0有CRC32 hw,我在Linux上有zlib和CRC32,所以我认为在我的项目中使用CRC32是个好主意。问题是,对于不同平台上相同的数据,我不会得到相同的CRC值。

代码语言:javascript
复制
#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,所以它相对来说是没有意义的。

代码语言:javascript
复制
...
/* 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;
...
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-01-21 21:23:23

从文档中可以看出,您的STM32代码不仅仅是无趣的,而且是相当不完整的。从文档中,为了使用CRC硬件,您需要:

  1. 通过RCC外围设备启用CRC外围时钟。
  2. 通过配置初始CRC值寄存器(CRC_INIT)将CRC数据寄存器设置为初始CRC值。
  3. 通过CRC控制寄存器( REV_IN1:0 )和REV_OUT位分别设置I/O反向位顺序(CRC_CR)。(A)
  4. 在CRC控制寄存器(CRC_CR)和CRC多项式寄存器(CRC_POL)中分别通过POLYSIZE1 1:0位设置多项式大小和系数。
  5. 通过CRC控制寄存器(CRC_CR)中的复位位重置CRC外围设备。
  6. 将数据设置为CRC数据寄存器。
  7. 阅读CRC数据寄存器的内容。
  8. 禁用CRC外围时钟。

特别注意步骤2、3和4,这些步骤定义了正在计算的CRC。他们说他们的例子有rev_in和rev_out错误,但是对于zlib来说,它们必须是真的。根据硬件实现的方式,多项式可能也需要反转(0xedb88320UL)。最初的crc需要是0xffffffff,最后的CRC需要倒置以匹配zlib CRC。

票数 5
EN

Stack Overflow用户

发布于 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很好

票数 8
EN

Stack Overflow用户

发布于 2015-01-21 10:37:27

我还没有对此进行测试,但我怀疑您实际上并没有在STM32上进行8位的编写。

相反,您可能会对寄存器的全部宽度(32位)进行写入,这当然意味着您正在计算的字节数比预期的要多。

反汇编生成的代码以分析所使用的确切存储指令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28064278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档