This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0L1306-Q1:链接器使用的 CRC 生成器和软件中计算的 CRC 加速器的 CRC 结果不同

Guru**** 2988510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1658419/mspm0l1306-q1-the-crc-result-is-different-between-crc-generator-used-by-the-linker-and-crc-accelerator-calculated-in-software

器件型号: MSPM0L1306-Q1

您好 TI 专家:

我尝试比较由链接器生成的 CRC 结果与由 CRC 加速器模块生成的结果。

它们都有值、但值不同。 我尝试在.syscfg 和.cmd 中使用不同的 CRC 算法

CRC 加速器模块:CRC-16 CCITT、CRC-32 ISO-3309  

LINKE 中的 CRC 生成器:  CRC_CCITT、   CRC32_PRIME

  组{
    Flash_boot   (RX) :origin =_boot_start_address_、length =_boot_size_、fill = 0xFFFF
  }crc (_flash_crc、算法= CRC_CCITT)  //CRC32_PRIME)

uint32_t calculate_CRC32 (uint32_t start_addr、uint32_t size_in_bytes)
{
  uint32_t * data_ptr =(uint32_t *) start_addr;
  uint32_t word_COUNT = size_in_bytes / 4;

  DL_CRC_setSeed32 (CRC、0xFFFFFFFF);

  对于 (uint32_t i = 0;i < word_count;i++){
    DL_CRC_feedData32 (CRC、data_ptr[i]);
  }

  CRC_RESULT = DL_CRC_getResult32 (CRC);

  返回 CRC_RESULT;
}

uint32_t calculate_crc16 (uint32_t start_addr、uint32_t size_in_bytes)
{
  uint32_t * data_ptr =(uint32_t *) start_addr;
  uint32_t word_COUNT = size_in_bytes / 4;

  DL_CRC_setSeed16 (CRC、0xFFFF);

  对于 (uint32_t i = 0;i < word_count;i++){
    DL_CRC_feedData16 (CRC、data_ptr[i]);
  }

  CRC_RESULT = DL_CRC_getResult16 (CRC);

  返回 CRC_RESULT;
}

我的问题是:

1、什么 CRC 算法适合 crc_table () 运算符?

2、使用 CRC_CCITT 时 CRC 结果不包含在十六进制文件中。 带有 CRC32_PRIME 的 CRC 结果包含在十六进制文件中、请参阅下图。

image.png

3、不同的 CRC 结果是否有其他可能的原因? 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

      带有 CRC 加速器的 CRC-32 ISO-3309 和 CRC-16 CCITT 与编译器链路的结果相同。

    符号

    1、.cmd 中的算法= CRC32_PRIME

    2、设置.syscfg

    3、添加代码

    uint32_t size_in_bytes Hal_Calculate (uint32_t start_addr、uint32_t size_in_bytes)
    {
    uint32_t i = 0;
    uint32_t * data_ptr =(uint32_t *) start_addr;
    uint32_t word_COUNT = size_in_bytes / 4;

    //初始化 32 位多项式 CRC 计算的种子 CRC-32 ISO-3309
    DL_CRC_setSeed32 (CRC、0x00000000);

    //将数据发送到 CRC 加速器进行计算
    对于 (I = 0;I < word_COUNT;I++)
    {
    DL_CRC_feedData32 (CRC、data_ptr[i]);
    }

    //从 CRC 加速器读取 32 位多项式计算结果
    CRC_RESULT = DL_CRC_getResult32 (CRC);

    返回 CRC_RESULT;
    }

    为 CRC 16

    1、.cmd 中的算法= CRC16_802_15_4。 支持的 CRC 算法在“crc_defines.h“中定义

    2、设置.syscfg

    3、添加代码

    uint16_t Hal_Calculate OpenCrc16 (uint32_t start_addr、uint32_t size_in_bytes)
    {
    uint32_t i = 0;
    uint8_t * data_ptr =(uint8_t *) start_addr;

    //初始化 16 位多项式 CRC 计算 CRC16_802_15_4 的种子
    DL_CRC_setSeed16 (CRC、0x0000);

    //将数据发送到 CRC 加速器进行计算
    适用于 (i = 0;i < size_in_bytes;i++)
    {
    DL_CRC_feedData8 (CRC、data_ptr[i]);
    }

    //从 CRC 加速器读取 16 位多项式计算结果
    CRC_RESULT =(uint16_t) DL_CRC_getResult16 (CRC);

    返回 CRC_RESULT;
    }