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.

[参考译文] MSP432P401R:如何使用 IAR#39;s ielftool 计算与 DriverLib 中 CRC32模块等效的 CRC32?

Guru**** 2564120 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/605341/msp432p401r-how-to-use-iar-s-ielftool-to-calculate-crc32-equivalent-to-crc32-module-in-driverlib

器件型号:MSP432P401R

大家好、

我撞到了墙、需要一些帮助。  我将 MSP432P401R 与 IAR ARM Cortex-M 工具搭配使用。

我有一个 SPI 闪存映像、大小为256KB。  我们为一些可修改的校准参数保留了4KB 的最后一个扇区、因此我将 CRC32置于该扇区之前的位置0x3FFFC-0x3FFFF。  我正在尝试在剩余空间内计算 CRC32、即从0x00000到0x3FFFB。

下面是我尝试在 IAR 中使用 ielftool 执行此操作的命令行:

ielftool --verbose --fill=0x00;0x00000000-0x0003EFFF --checks=g_CRC32:4、CRC32:I、0xFFFFFFFF;0x00000000-0x0003EFFB SPI_Flash.out SPI_Flash.out
ielftool --verbose --bin SPI_Flash.out SPI_Flash.bin

执行此操作后、我最终分别在地址0x3EFFC 至0x3EFFF 中得到0x12 0x6D 0x8F 0x22、这是 G_CRC32所在的位置。  如果读取为小端字节序值、则为0x228F6D12。  到目前为止还不错、我可以从 SPI 闪存中读回它、而不会出现任何问题。

当我尝试使用 DriverLib 中的 CRC32模块时会遇到困难。  我的代码执行以下操作(从使用 CRC32模块的 DriverLib 示例中借用):

MAP_CRC32_setSeed (0xFFFFFFFF、CRC32_MODE);

uint8_t spiBuffer[1024];//一次读取一个页
uint32_t addr = 0U;
size_t nbytes = 0x3FFFC;//读取存储的 CRC 之前的所有字节
size_t bytesToRead;

//一次读取一个缓冲区,直到所有字节都被添加到 CRC32
while (nbytes!= 0)
{
if (nbytes >= sizeof (spiBuffer))
{
bytesToRead = sizeof (spiBuffer);
}
其他
{
字节 ToRead = nbytes;
}

读取(addr、spiBuffer、bytesToRead);

//将所有字节添加到 CRC32计算中
对于(size_t i = 0;i <字节 ToRead;i++)
{
MAP_CRC32_set8BitData (spiBuffer[i]、CRC32_MODE);
}

Addr +=字节 ToRead;
nbytes --=字节 ToRead;
}

//从硬件模块获取结果
uint32_t hwCalculatedCRC = MAP_CRC32_getResultReversed (CRC32_MODE)^ 0xFFFFFFFF;

返回 hwCalculatedCRC;

遗憾 的是、hwCalculatedCRC 的值为0x529961DC、这甚至不接近于 ielftool 生成的值。

有许多用于配置 ielftool 的选项以及用于在 DriverLib 中配置 CRC32模块的选项。  我尝试确保种子值一致、设置为0xFFFFFFFF。

我承认我有损失、希望论坛中的某个人也经历过类似的痛苦、或许使用 ielftool 计算 MSP432上可执行映像的 CRC32、然后使用 CRC32模块和 DriverLib 计算匹配的 CRC32。

我已附加了我一直使用的.out 和.bin 文件、我愿意尝试任何合理的实验来使其正常工作。  我不仅需要使其能够用于该 SPI 闪存、还需要对 MSP432上的可执行文件映像执行类似的 CRC32检查。

非常感谢您的任何帮助、请告诉我是否可以以任何方式澄清。

Scotte2e.ti.com/.../SPI_5F00_Flash.zip

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

    ielftool 中的 CRC 校验和似乎使用32位数据对齐、而在您发布的代码中、CRC 是基于8位数据计算的。 您可以尝试使用32位 CRC 运算并进行检查吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Amit、

    感谢您的回复。  但是、我不确定您希望我尝试什么。  您如何确定 ielftool 使用的是32位对齐?  是否可以像我在代码中所做的那样将其更改为与8位数据的使用相匹配?  我需要了解使用32位数据时 DriverLib 调用会是什么。  如果您有一个示例、这将非常有帮助。

    感谢您的帮助和回复。  了解更多信息、我很乐意进行实验。  我必须使其正常工作、 我相信其他人也遇到了类似的问题。  DriverLib 文档有点少。

    此致、

    Scott

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

    您能否发送您正在使用的原始.out 文件、以便我可以使用该工具和程序运行一些实验?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、Amit 、感谢您的帮助。  原始的、未修改的.out 文件位于随附的.zip 文件中

    e2e.ti.com/.../6177.SPI_5F00_Flash.zip

    在此表示感谢、致以诚挚的问候、

    Scott

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

    我还尝试了使用 CRC32模块的一些实验,建议使用众所周知的 CRC 网站  。  他们建议使用字符串"123456789"作为各种类型 CRC 的测试输入。  我运行了以下命令、它产生的结果与这个网站0xCBF43296完全相同。  因此、我认为问题在于使用 ielftool 本身的某种程度、以及它用于多项式的内容、它使用的是最低位优先还是最高位优先、以及它是否对0xFFFFFFFF 执行最终 XOR 运算。

    下面是生成与上述网站相同结果的代码。  非常感谢您提供有关如何让 ielftool 产生相同输出的提示!

    char Testdata[]="123456789";
    
    MAP_CRC32_setSeed (CRC_32::CRC32_init、CRC32_MODE);
    对于(size_t i = 0;i < 9;i++)
    {
    MAP_CRC32_set8BitData (Testdata[i]、CRC32_MODE);
    }
    
    //从硬件模块获取结果*/
    uint32_t calculatedCRC = MAP_CRC32_getResultReversed (CRC32_MODE)^ 0xFFFFFFFF;
    

    此致、

    Scott

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

    我查看了 IETF 工具示例、他们声称它与选项一起工作正常

    www.iar.com/.../

    感谢您发送文件。 我将介绍相同的内容、并检查其他一些工具。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好!

    经过大量的试错、我终于能够获得 IAR 工具来满足我的需求。  在较新版本的 IAR 中、在项目选项/链接器/校验和下、您可以输入以下数据:

    使用这些设置、会生成正确的 CRC32并将其放置在名为__CHECKSUM 的保留位置。  要保留此位置、您需要在"链接器/额外选项"下添加

    --keep __checksum

    然后、在链接器配置文件中、我具有以下内容。  请注意.CHECKSUM 段在 ROM_REGION 结束时的位置:

    /*###ICF ###由 ICF 编辑器处理的部分,请勿触摸! **/
    /*-编辑器注释文件-*/
    /* IcfEditorFile="$TOOLKIT_DIR$\IDE\IcfEditor\cortex_v1_4.xml"*/
    /*-
    存储器区域-*/
    定义符号__ICFEDIT_REGISE_ROM_START_= 0x00000000;
    _= 0x000FFIT_ENTI_SIF000_ENTIF_EFF_SITIF_END_
    = 0x000FFIT_END_
    = 0x000FFIT_ENTIF_ENTIF_ENTIF_ENTIF_SIF_SIMP_SIF_SIMP_SIF_SIMP_SIMP_SION_SION_SION_SIMP_SIMP_ENTIF_ENTIF_ENTIF_SIMPLE_= 0x000FF_SIMP_SION_SIMP_SION_SION_SION_SION_
    
    = 0x400;
    定义符号__ICFEDIT_SIZE_PROC_STACK_= 0x0;
    定义符号__ICFEDIT_SIZE 堆__ = 0x800;
    /**** ICF 编辑器部分结束。 ###ICF ###*/
    
    定义大小= 256K 的存储器内存内存;
    定义区域 ROM_REGION =内存:[从__ICFEDIT_REGAL_ROM_START__到__ICFEDIT_REGAL_ROM_END__];
    
    不要初始化{ SECTION .noinit };
    通过复制{ readwrite }进行初始化;
    如果(isTHIB_RECODE_REDA_NOT_RECODE_END_
    
    
    ),则为{=需要使用{THON_THREADY_PROTOP}
    
    
    放置在 ROM_REGION 的开头{段图标、段字体};
    放置在 ROM_REGION 的结尾{段版本、段.CHECKSUM};
    放置在 ROM_REGION{readonly}中;
    

    最后、在 optins/build 操作下、我添加了一个编译后命令行、用于将.out 文件转换为二进制.bin 文件:

    $TOOLKIT_DIR$\bin/ielftool --bin $target_path$$target_BPATH$.bin 

    显然,这是相当痛苦的,但现在它正在工作,是有道理的。  我还附加了一个 zip 文件、其中包含原始未修改的.out 和生成的.bin、其中填充了 CRC32、刚好位于我将用于某些可修改数据的4K 保留块之前。

    e2e.ti.com/.../5460.SPI_5F00_Flash.zip

    我衷心希望这对其他人有所帮助。  同样的技术也应该能够用来计算整个程序映像的 CRC32 -很快就能完成一天的工作!

    在此表示感谢、致以诚挚的问候、

    Scott  

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

    感谢您在论坛上发布解决方案。 事实上,这对他人会有很大帮助。 我会将您的答案标记为"已验证"并关闭主题。 如果出现问题、您可以重新打开该主题。