关键是我需要使用IAR计算32位CRC,以便将此值自动存储到已知的内存地址中,但IAR给出的结果和我使用C函数计算的结果(使用在线检查)计算器)不匹配。 在接下来的段落中,我将尝试按照我所遵循的所有过程一步一步地进行。
我在以下链接中按照推荐的方式配置了IAR链接器(至少我是这么认为): IAR documentation CRC links 事实上,我已将其配置为计算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功能是否正常,我使用了以下网站:
我用来计算CRC的C代码基于这里解释的代码: CRC C code
任何帮助都将非常感激。
提前致谢。
最好的regrads。
伊万
答案 0 :(得分:1)
最后我解决了这个问题。我使用这个CRC32代码适合我的目的: https://www.iar.com/support/tech-notes/general/c-source-for-crc32/
在我的所有其他尝试中,我使用了正确的多项式并尝试了IAR链接器校验和配置中与其他板一起使用的所有配置,但这些配置不起作用。所以我使用的配置是init值为0xFFFFFFFF和以下IAR链接器配置:
我希望这会有所帮助。这是非常罕见的,因为我实现了另一个问题,我认为是有效的CRC32实现。
致以最诚挚的问候,
伊万
答案 1 :(得分:0)
为什么你认为their code不起作用?你的测试用例是什么?
CRC-32在正向使用多项式0x04c11db7
,初始CRC等于0xc704dd7b
且没有最终的异或。因此fast_crc32(0xc704dd7b, data, length)
将返回data[0..length-1]
的CRC。