大家好、
我撞到了墙、需要一些帮助。 我将 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检查。
非常感谢您的任何帮助、请告诉我是否可以以任何方式澄清。
