在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()回读出来结果,并进行比对。 |