打印
[AT32F437]

在AT32F437上也部署了CRC32硬件校验

[复制链接]
16|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
VelvetNight|  楼主 | 2025-6-29 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在AT32F437上也部署了CRC32硬件校验

最近在做IAP,在更新本地固件时,需要先将接收的内容进行CRC32校验。如果CRC32的数据完整则实现跳转,否则放弃本次升级。所以,我们来实现一下AT32F437下的CRC32的硬件外设。

AT32F437的CRC32采用的也是CRC32-mpeg2算法,并且对于CRC32的DATA寄存器也采用了大端输入的方式。这里就必须注意了。我们的PC机也是就是X86,X64的指令集下,采用的是小端存储。故,我们在PC端制作的CRC32校验码时,必须将其大小端转换。反正得有一方做大小端转换,咱总不能把这重活留给MCU来干吧!

我们回到AT32F437上来,CRC32外设只有两个寄存器操作:一个是使能寄存器;一个是数据寄存器。即在计算CRC32前复位一下CRC32外设,让其计算结果归零;然后,依次按序写入word进入DATA寄存器。是不是很简单!

在软件设计上面同样是非常简单的。我们只需要设计三个API即可:crc32_init(),crc32_write_word(),crc32_result_get();是不是很简单?最后,我分享一下我的API源代码:

void crc32_init(void)
{
  crc_data_reset();
}

void crc32_write_word(uint32_t dat)
{
  crc_one_word_calculate(dat);
}

uint32_t crc32_result_get(void)
{
  uint32_t ret = 0;
  ret = crc_poly_value_get();
  return (ret);
}

特别说明一下:

我的数据是按字节接收的,并且我约定必须为4字节对齐。我在接收4字节后,会组成一个word,并将其送入到crc32_write_word()中。当接收完成时,再通过crc32_result_get()回读出来结果,并进行比对。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

20

帖子

0

粉丝