打印
[AT32F413]

串口ISP协议中Firmware CRC的值的问题

[复制链接]
989|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
binbin0317|  楼主 | 2022-6-22 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 binbin0317 于 2022-6-22 17:28 编辑

目前正在使用AT32F413CBT7,调试串口ISP,对CRC有疑问。对于一片全FF的芯片,然后计算第一个sector的CRC值的时候,得出是0x5b0af1ea。但是从http://www.ip33.com/crc.html 还是自己的CRC计算程序计算出来(都是采用MPEG-2参数,而且我自己计算跟网页计算结果一致),都不是这个值。理论上全FF的计算值如下:
CRC(256):7beaea80
CRC(512):63c2142
CRC(1K ):d000a3e2
CRC(2K ):1745503
CRC(4K ):af19d570
发觉没有一个数对的上。以下是读取memory和获取CRC的时候,串口收发数据。究竟是哪里的问题?
tx(2):[11, ee]
rx(1):[79]
tx(5):[08, 00, 00, 00, 08]
rx(1):[79]
tx(2):[ff, 00]
rx(257):[79, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff]
tx(2):[11, ee]
rx(1):[79]
tx(5):[08, 00, 01, 00, 09]
rx(1):[79]
tx(2):[ff, 00]
rx(257):[79, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff]
tx(2):[11, ee]
rx(1):[79]
tx(5):[08, 00, 02, 00, 0a]
rx(1):[79]
tx(2):[ff, 00]
rx(257):[79, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff]
tx(2):[11, ee]
rx(1):[79]
tx(5):[08, 00, 03, 00, 0b]
rx(1):[79]
tx(2):[ff, 00]
rx(257):[79, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff]
tx(2):[ac, 53]
rx(1):[79]
tx(5):[08, 00, 00, 00, 08]
rx(1):[79]
tx(3):[00, 00, ff]
rx(5):[79, 5b, 0a, f1, ea]
read crc:Some(5b0af1ea)


后来将程序烧写进去,通过read_memory读取是正确的,而且能正常运行,但是CRC依然是错的。
tx(1):[7f]
rx(1):[79]
tx(2):[fa, 05]
rx(1):[79]
tx(5):[02, 03, 54, 41, 14]
rx(1):[79]
tx(2):[02, fd]
rx(8):[79, 04, 01, c3, 70, 03, 04, 79]
tx(2):[ac, 53]
rx(1):[79]
tx(5):[08, 00, 00, 00, 08]
rx(1):[79]
tx(3):[00, 00, ff]
rx(5):[79, 8b, b8, 55, 92]

这里读取首扇区的CRC是0x8bb85592,但是在网络计算CRC的工具,无论用哪种CRC32参数都无法获取这个值。这是什么问题。附件带烧写入MCU的程序。

at32o.bin.zip

6.61 KB

使用特权

评论回复
沙发
binbin0317|  楼主 | 2022-6-22 12:05 | 只看该作者
本帖最后由 binbin0317 于 2022-6-23 09:47 编辑

最后还是自己折腾2天出来了。一般的CRC计算都是字节输入的,但是MCU内部的CRC计算是4字节输入,因此外部计算的时候只能先把数据进行4字节倒序(小端处理器),然后初值的确是0,并不是标准的MPEG-2 CRC。

使用特权

评论回复
板凳
albergem| | 2023-6-8 13:58 | 只看该作者
感谢楼主,同样问题搞了一天多!我再补充一些:
uart ISP 的Firmware CRC功能:
1、可以使用AT32内置的CRC模块计算,无需倒序,只不过需要把初始值设为0 “crc_init_data_set(0);”,其他保持默认
2、可以使用软件crc计算,需要倒序,同样初始值为0
void convert_to_big_endian(char *src, char *dst, int size)
{
    int i, j;
    for (i = 0, j = 0; i < size; i += 4, j += 4)
    {
        char temp[4];
        temp[0] = src[i];
        temp[1] = src[i + 1];
        temp[2] = src[i + 2];
        temp[3] = src[i + 3];

        dst[j] = temp[3];
        dst[j + 1] = temp[2];
        dst[j + 2] = temp[1];
        dst[j + 3] = temp[0];
    }
}

uint32_t crc32_mpeg_2_d(uint8_t *data, uint32_t length)
{
    uint8_t i;
    uint32_t crc = 0;//0xffffffff;  // Initial value
    while (length--) {
        crc ^= (uint32_t)(*data++) << 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 ;//^ 0xFFFFFFFF;
}

使用特权

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

本版积分规则

13

主题

45

帖子

3

粉丝