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.

[参考译文] AM2634:如何在 AM2634 MCU 中执行 CRC 操作?

Guru**** 2391415 points
Other Parts Discussed in Thread: AM2634, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1415916/am2634-how-to-perform-crc-operation-in-am2634-mcu

器件型号:AM2634
主题中讨论的其他器件: SysConfig

工具与软件:

大家好

我使用的是 AM2634 MCU、我有几个问题。

1.如何对 MCU 整个闪存进行 CRC 计算? 您能提一下吗?

2.此 MCU 中的链接器文件在哪里我找不到该文件?  

3.您能说如何执行整个闪存的 CRC 计算以及如何验证吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    1. 如何对此 MCU 的整个闪存进行 CRC 计算? 您能说明一下吗?

    这个 MCU 上没有板载闪存存储器。 我怀疑您的意思是对程序代码进行 CRC 计算。 您需要在映射文件中找到.text 段的起始地址和结束地址、然后在该范围或范围上执行 CRC。 要进行 CRC32计算、请参阅该主题: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1410470/am2634-how-to-calculate-the-crc-in-am2634

    Unknown 说:
    2. 链接器文件存在于此 MCU 中的哪个位置我无法找到该文件?  [报价]

    如果要使用 示例、链接器脚本 linker.cmd 由 SysConfig 自动生成、并输出到.\Debug\syscfg\linker.cmd。

    Unknown 说:
    3. 您能说如何执行整个闪存的 CRC 计算以及如何验证吗?[/QUOT]

    与问题1相同、不是吗?

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

    尊敬的 Kier:

    感谢您的重播、

    1.我的要求是不要使用您在 SDK 中提供的示例代码。

      所以我在这里创建了我自己的 CRC 函数、以便我可以使用我的函数查找 CRC

      下面是我的示例代码、用于计算 CRC、

    uint32_t CRC32Calculate(const uint8_t* data, uint32_t length, const st_CRC32_param* ptrParam)
    {
        uint32_t result;
        uint8_t buffer;
        if ((length != EMPTY_BUFFER) && (ptrParam->polynomial != EMPTY_BUFFER)) // Checking if data is valid
        {
            uint32_t crc = ptrParam->initial;
            for (uint32_t i = 0U; i < length; i++)
            {
    
    
                // Use reflection based on RefelectDataFlag
                if ((ptrParam->RefelectDataFlag) != 0U)
                {
                    buffer = (uint8_t)ReverseBits(data[i], BYTES_BY_BYTES); // Reflect data
                }
                else
                {
                    buffer = data[i]; // No reflection
                }
    
                // XOR buffer with the relevant bits of the current CRC
                buffer ^= (uint8_t)(crc >> (WIDTH - BYTES_BY_BYTES)); // Explicit cast to 8-bit
    
                // Update CRC using the lookup table and polynomial
                crc = CRCTableCreation[buffer] ^ (crc << BYTES_BY_BYTES);
            }
    
            // Use reflection for the final CRC value based on RefelectRemainderFlag
            if ((ptrParam->RefelectRemainderFlag != 0U)) // Explicit boolean condition
            {
                result = (ReverseBits(crc, WIDTH) ^ ptrParam->finalXor); // Reflect final CRC
            }
            else
            {
                result = (crc ^ ptrParam->finalXor); // No reflection
            }
        }
        else
        {
            result = 0U; // RESULT 0 for invalid input
        }
        return result;
    }
    
    
    
    



    因此在这里、我需要计算整个闪存的 CRC、我们需要使用 SDK 提供的示例来实现。


    2.我有一种方法,假设我们知道 闪存地址从闪存开始: origin = 0x60100000 , length = 0x80000
    我可以直接使用该地址作为吗  

    #define FLASH_START_ADDR 0x60100000
    #define FLASH_SIZE 0x80000

    //计算闪存数据的 CRC32
    uint32_t crcResult = CRC32Calculate (flashData、flash_size、&crcParams);

    我可以这样做吗?  

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

    尊敬的 Kier:

    感谢您的重播、

    1.我的要求是不要使用您在 SDK 中提供的示例代码。

      所以我在这里创建了我自己的 CRC 函数、以便我可以使用我的函数查找 CRC

      下面是我的示例代码、用于计算 CRC、

    uint32_t CRC32Calculate(const uint8_t* data, uint32_t length, const st_CRC32_param* ptrParam)
    {
        uint32_t result;
        uint8_t buffer;
        if ((length != EMPTY_BUFFER) && (ptrParam->polynomial != EMPTY_BUFFER)) // Checking if data is valid
        {
            uint32_t crc = ptrParam->initial;
            for (uint32_t i = 0U; i < length; i++)
            {
    
    
                // Use reflection based on RefelectDataFlag
                if ((ptrParam->RefelectDataFlag) != 0U)
                {
                    buffer = (uint8_t)ReverseBits(data[i], BYTES_BY_BYTES); // Reflect data
                }
                else
                {
                    buffer = data[i]; // No reflection
                }
    
                // XOR buffer with the relevant bits of the current CRC
                buffer ^= (uint8_t)(crc >> (WIDTH - BYTES_BY_BYTES)); // Explicit cast to 8-bit
    
                // Update CRC using the lookup table and polynomial
                crc = CRCTableCreation[buffer] ^ (crc << BYTES_BY_BYTES);
            }
    
            // Use reflection for the final CRC value based on RefelectRemainderFlag
            if ((ptrParam->RefelectRemainderFlag != 0U)) // Explicit boolean condition
            {
                result = (ReverseBits(crc, WIDTH) ^ ptrParam->finalXor); // Reflect final CRC
            }
            else
            {
                result = (crc ^ ptrParam->finalXor); // No reflection
            }
        }
        else
        {
            result = 0U; // RESULT 0 for invalid input
        }
        return result;
    }
    
    
    
    



    因此在这里、我需要计算整个闪存的 CRC、我们需要使用 SDK 提供的示例来实现。


    2.我有一种方法,假设我们知道 闪存地址从闪存开始: origin = 0x60100000 , length = 0x80000
    我可以直接使用该地址作为吗  

    #define FLASH_START_ADDR 0x60100000
    #define FLASH_SIZE 0x80000

    //计算闪存数据的 CRC32
    uint32_t crcResult = CRC32Calculate (flashData、flash_size、&crcParams);

    我可以这样做吗?  

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

    可以、您可以使用自己的代码来计算 CRC。  

    与此软件解决方案相比、MCRC 在无需额外内存使用和 CPU 负载的情况下具有更快的 CRC 计算。 MCRC 由线性反馈移位寄存器(LFSR)实现、以生成 数据的 CRC。 CPU 可以直接将数据馈入 MCRC 模块、这对于计算一个传出数据流的 CRC 或对于验证一个传入数据流是否存在传输错误很有用。

    您可以编写一个简单的函数、以使用 MCRC 计算 CRC。 例如:

    #define MCRC_CTRL0  (*(volatile UINT32 *) 0x35000000U)
    #define MCRC_CTRL2  (*(volatile UINT32 *) 0x35000010U)
    #define MCRC_STATUS   (*(volatile UINT32 *) 0x35000028U)
    #define MCRC_SIGREGL1 (*(volatile UINT32 *) 0x35000060U)
    #define MCRC_SIGREGH1 (*(volatile UINT32 *) 0x35000064U)
    #define MCRC_SIGREG   (*(volatile uint64 *) 0x35000060U)


    crc_calculate (uint64_t startAddr、uint32_t count)

      易失性 uint32索引= 0u;  

      MCRC_CTRL0 |= 0x00000001U;      /*重置 CRC 模块*/
      MCRC_CTRL0并且= 0xFFFFFFFEU;
      MCRC_CTRL2 |= 0x00000003U;      /*配置为全 CPU 模式*/

      对于(索引=0U;索引< count;索引++)

      {
         MCRC_SIGREG =(uint64)(* startAddr);
         startAddr++;
      }

      返回(MCRC_SIGREG);

    }

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

    尊敬的 QJ Wang:

    感谢您的重放、因此、我尝试了 GPIO LED 代码中的逻辑、我刚刚替换了您的逻辑、并在下面附加了代码。

    什么是我们闪存它会加载到 RAM 内存,所以我考虑 OCRAM : origin = 0x70040000 , length = 0x40000这一个


    #include <drivers/gpio.h>
    #include <kernel/dpl/AddrTranslateP.h>
    #include <kernel/dpl/DebugP.h>
    #include <kernel/dpl/ClockP.h>
    #include "ti_drivers_config.h"
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"
    #include <sdl/sdl_mcrc.h>
    #include <stdint.h>
    
    #define MCRC_CTRL0   (*(volatile uint32_t *)0x35000000U)
    #define MCRC_CTRL2   (*(volatile uint32_t *)0x35000010U)
    #define MCRC_STATUS      (*(volatile uint32_t *)0x35000028U)
    #define MCRC_SIGREGL1  (*(volatile uint32_t *)0x35000060U)
    #define MCRC_SIGREGH1 (*(volatile uint32_t *)0x35000064U)
    #define MCRC_SIGREG     (*(volatile uint64_t *)0x35000060U)
    
    /* Function to calculate CRC */
    uint32_t crc_calculate(uint64_t startAddr, uint32_t count)
    {
        volatile uint32_t index = 0u;
    
        MCRC_CTRL0 |= 0x00000001U;          /* Reset the CRC Module */
        MCRC_CTRL0 &= 0xFFFFFFFEU;
        MCRC_CTRL2 |= 0x00000003U;          /* Configure to Full CPU Mode */
    
        for (index = 0u; index < count; index++)
        {
            MCRC_SIGREG = *(volatile uint64_t *)startAddr;
            startAddr += sizeof(uint64_t);  // Increment by the size of uint64_t
        }
    
        return (uint32_t)(MCRC_SIGREG);      // Return lower 32 bits of the CRC
    }
    
    void gpio_led_blink_main(void *args)
    {
        /* Open drivers to open the UART driver for console */
        Drivers_open();
        Board_driversOpen();
    
        DebugP_log("Test Started ...\r\n");
    
        uint64_t startAddr = 0x70040000;  // Starting address in OCRAM
        uint32_t count = 0x40000 / sizeof(uint64_t);  // Number of 64-bit words to read
        uint32_t CRC = crc_calculate(startAddr, count);
        DebugP_log("CRC value is %0XX\r\n", CRC);
    
        DebugP_log("All tests have passed!!\r\n");
    
        Board_driversClose();
        Drivers_close();
    }
    

    我得到的值是、如果没问题、您可以只验证该逻辑吗?

    下面是我的输出。

    这里、我需要工具、外部软件或编译软件来进行 CRC32计算...在该工具中、我需要在运行时测试我的闪存地址或 RAM 地址、并且我需要检查两个实现是否正确?

    请提供解决方案、谢谢。

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

    您好!

    AM263x 上的 MCRC 支持 CRC-16、CRC-32和 CRC-64。 CRC 类型通过 MCRC_CTRL0[4:3](对于 CH1)和 MCRC_CTRL0[12:11](对于 CH2)中的配置值来选择。

    您需要编写自己的 SW 代码、以使用 CRC-32多项式计算 CRC:

    CRC32:f (x)= x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1