关键是我需要使用IAR计算一个32位CRC,以便将这个值自动存储到一个已知的内存地址中,但是IAR给出的结果和我使用C函数(使用一些在线计算器检查)计算的结果不匹配。
在接下来的段落中,我将尝试循序渐进地遵循我遵循的所有过程。
我按照以下链接中的建议(我认为至少是这样)配置了IAR链接器:
IAR documentation CRC links
事实上,我已经在Calculate CRC32中配置了它,就像在STM32硬件(v.5.50和更高版本)示例中一样(这是第一部分,因为我有IAR 6.5)。
如我所见,我试图克隆屏幕截图中显示的配置:
CONFIGURATION PICTURE
这是我在C CRC文件中使用的配置:
/* PARAMETERS EXPLANATION
* 'order' [1..32] is the CRC polynom order, counted without the leading
* '1' bit.
* 'polynom' is the CRC polynom without leading '1' bit.
* 'direct' [0,1] specifies the kind of algorithm: 1=direct, no augmented
* zero bits.
* 'crcinit' is the initial CRC value belonging to that algorithm.
* 'crcxor' is the final XOR value.
* 'refin' [0,1] specifies if a data byte is reflected before processing
* (UART) or not.
* 'refout' [0,1] specifies if the CRC will be reflected before XOR.
*/
/* Init parameters for CRC 32 algorithm */
crcParams.order = 32;
crcParams.polynom = 0x4C11DB7;
crcParams.direct = true;
crcParams.crcinit = 0xffffffff;
crcParams.crcxor = 0xffffffff;
crcParams.refin = false;
crcParams.refout = false;
我怀疑crcxor是否应该是0xFFFFFFFF或0x00000000,但我尝试了两者都没有得到预期的结果。
为了检查C功能是否正常工作,我使用了以下网站:
FIRST CRC32 CALCULATOR
SECOND CRC32 CALCULATOR
我用来计算CRC的C代码是基于这里解释的代码:
CRC C code
这是其中一个网站中使用的配置示例:
任何帮助都将不胜感激。
提前谢谢。
最好的重新包装。
伊万
最佳答案
我终于解决了这个问题。我使用了这个CRC32代码来适应我的目的:
https://www.iar.com/support/tech-notes/general/c-source-for-crc32/
在我所有的其他尝试中,我使用了正确的多项式,并尝试了与IAR链接器校验和配置中的其他板一起使用的所有配置,但这些都不起作用。所以我使用的配置是init值0xFFFFFFFF和以下IAR链接器配置:
我希望这能有帮助。这是非常罕见的,因为我在实现另一个(我认为是有效的)CRC32实现时遇到了问题。
谨致问候,
伊万
关于c - IAR链接器CRC32计算与在C(以及其他网站)中计算出的结果不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38346985/