IAR自动生成带CRC-32/MPEG-2校验的bin文件
本文主要介绍如何在IAR中生成带校验码的bin文件,并存储在指定的地址(bin文件末尾),以便于在Boot Loader程序和APP程序中读写烧写文件进行软件升级前通过校验码的对比检查代码的完整性。
在IAR Embedded Workbench中生成对应代码区域的校验码并存储在指定的地址
下面的选项使用CRC-32/MPEG-2为例生成对应代码区域的校验码: 在IAR Embedded Workbench工程选项(Options)里面Linker选项里面生成Checksum
-
勾选“Fill unused code memory”:
- Fill pattern里面填充相应的值
- Start address和End address输入对应代码区域的地址(注意:不能包括存放Checksum的地址区域。比如,Checksum存放与0x0803FFFC ~ 0x0803FFFF, End address需要输入0x0803FFFB)
-
勾选“Generate Checksum”:
- Checksum Size: 选择 “4 bytes”,
- Alignment: 输入 “4”,
- Algorithm: 选择 “CRC32”
- Complement: 选择 “As is”,
- Initial value: 输入“0xFFFFFFFF”,不要勾选“Use as input”
- Bit order: 选择 “MSB first”
- 不要勾选 “Reverse byte order within word”
- Checksum unit size: 选择 “8-bit”
在ICF文件中输入相应命令将Checksum放置指定的地址(这里是将checksum放置到Flash的最后):
place at end of ROM_region { section .checksum };
配置到这就OK了,build后就可以看到生成的bin文件末尾有4字节的校验码。
在线计算:http://www.ip33.com/crc.html
CRC-32/MPEG-2模型计算公式:
//参数可以自己修改哈
uint32_t crc32_mpeg_2(uint8_t data[], uint32_t crc, uint16_t length)
{
uint8_t i;
uint32_t count = 0;
//uint32_t crc = 0xffffffff; // Initial value
while(length--)
{
crc ^= (uint32_t)(data[count++]) << 24;// crc ^=(uint32_t)(*data)<<24; data++;
for (i = 0; i < 8; ++i)
{
if ( crc & 0x80000000 )
crc = (crc << 1) ^ 0x04C11DB7;
else
crc <<= 1;
}
}
return crc;
}
参考链接:https://zhuanlan.zhihu.com/p/622468694