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

[复制链接]
 楼主| 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的计算值如下:
  1. CRC(256):7beaea80
  2. CRC(512):63c2142
  3. CRC(1K ):d000a3e2
  4. CRC(2K ):1745503
  5. CRC(4K ):af19d570
发觉没有一个数对的上。以下是读取memory和获取CRC的时候,串口收发数据。究竟是哪里的问题?
  1. tx(2):[11, ee]
  2. rx(1):[79]
  3. tx(5):[08, 00, 00, 00, 08]
  4. rx(1):[79]
  5. tx(2):[ff, 00]
  6. 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]
  7. tx(2):[11, ee]
  8. rx(1):[79]
  9. tx(5):[08, 00, 01, 00, 09]
  10. rx(1):[79]
  11. tx(2):[ff, 00]
  12. 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]
  13. tx(2):[11, ee]
  14. rx(1):[79]
  15. tx(5):[08, 00, 02, 00, 0a]
  16. rx(1):[79]
  17. tx(2):[ff, 00]
  18. 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]
  19. tx(2):[11, ee]
  20. rx(1):[79]
  21. tx(5):[08, 00, 03, 00, 0b]
  22. rx(1):[79]
  23. tx(2):[ff, 00]
  24. 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]
  25. tx(2):[ac, 53]
  26. rx(1):[79]
  27. tx(5):[08, 00, 00, 00, 08]
  28. rx(1):[79]
  29. tx(3):[00, 00, ff]
  30. rx(5):[79, 5b, 0a, f1, ea]
  31. read crc:Some(5b0af1ea)


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

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

at32o.bin.zip

6.61 KB, 下载次数: 1

 楼主| 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
  1. void convert_to_big_endian(char *src, char *dst, int size)
  2. {
  3.     int i, j;
  4.     for (i = 0, j = 0; i < size; i += 4, j += 4)
  5.     {
  6.         char temp[4];
  7.         temp[0] = src[i];
  8.         temp[1] = src[i + 1];
  9.         temp[2] = src[i + 2];
  10.         temp[3] = src[i + 3];

  11.         dst[j] = temp[3];
  12.         dst[j + 1] = temp[2];
  13.         dst[j + 2] = temp[1];
  14.         dst[j + 3] = temp[0];
  15.     }
  16. }

  17. uint32_t crc32_mpeg_2_d(uint8_t *data, uint32_t length)
  18. {
  19.     uint8_t i;
  20.     uint32_t crc = 0;//0xffffffff;  // Initial value
  21.     while (length--) {
  22.         crc ^= (uint32_t)(*data++) << 24;// crc ^=(uint32_t)(*data)<<24; data++;
  23.         for (i = 0; i < 8; ++i) {
  24.             if (crc & 0x80000000) {
  25.                 crc = (crc << 1) ^ 0x04C11DB7;
  26.             }
  27.             else {
  28.                 crc <<= 1;
  29.             }
  30.         }
  31.     }
  32.     return crc ;//^ 0xFFFFFFFF;
  33. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

45

帖子

3

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

13

主题

45

帖子

3

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