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

[复制链接]
 楼主| 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()回读出来结果,并进行比对。

寂静之回响 发表于 2025-7-8 08:26 | 显示全部楼层
CRC硬件校验应该是自带的吧 看了手册应该是32位的

评论

103的一般都是32位的,G系列的可以有16位的  发表于 2025-7-9 10:32
 楼主| VelvetNight 发表于 2025-8-6 20:00 | 显示全部楼层
寂静之回响 发表于 2025-7-8 08:26
CRC硬件校验应该是自带的吧 看了手册应该是32位的

是32位的
EchoInEons 发表于 2025-8-20 09:06 | 显示全部楼层
用了硬件CRC之后 再也不想用软件去算了,不过硬件好多只支持32位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部