打印

STM32内置CRC模块的使用

[复制链接]
楼主: 香水城
手机看帖
扫描二维码
随时随地手机跟帖
21
hotpower| | 2009-4-15 21:14 | 只看该作者 回帖奖励 |倒序浏览
22
香水城|  楼主 | 2009-4-15 21:16 | 只看该作者

31楼贴出的这些都是一些实现的案例

案例不代表标准。

23楼说我做的不对,不对标准。既然是标准,就需要有一个权威的文件来阐明这个标准,我想知道这个权威的文件是什么?在哪里?IEEE的、ANSI的、IEC的、GB标准都可以,或任何公认的标准机构发布的文件也可以。

29楼让我自己去找,只可惜我目前还没有找到(还在找)这样一个文件,所以才要请高手帮忙,这也符合谁主张谁举证的原则。

使用特权

评论回复
23
hotpower| | 2009-4-15 21:27 | 只看该作者

到底谁对???哈哈~~~

俺和STM32的CRC32结果一样~~~

因为这样硬件电路最合理~~~

而且加密解密更好玩~~~而且可以用硬件实现~~~

其他的CRC32出入口大家都自作手脚,根本就是他们自己的约定~~~

菜农的CRC演算器已在CRC8/CRC16/CRC32上得到几个厂家验证,难道都错了???

看来俺的HotWC3密码有问题了~~~
相关链接:http://www.zorc.breitbandkatze.de/crc.html

使用特权

评论回复
24
hotpower| | 2009-4-15 21:44 | 只看该作者

菜农玩了多年的CRC,它的精华就是“初值、权和方向”~~~

其他都不是CRC之本~~~

CRC在数学上可以论证为可逆和不可逆2种~~~

菜农做手脚后就全部可逆了~~~

由于“权”太乱,所以俺的CRC为“权开放”~~~

使用特权

评论回复
25
香水城|  楼主 | 2009-4-15 21:58 | 只看该作者

找到一个文档似乎说明了这个Reflect()的由来

我在2楼曾经说过不太清楚这个Reflect()的作用,现在在网上找到一个资料,里面介绍了这个Reflect()的由来,不知道正确与否,拿出来给大家分享评判:

资料地址:A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS

所有CRC的计算都是按照数据的高位在先的原则进行,上述这份资料(11节)中说因为UART是先发送字节的最低位,因此设计UART的工程师按照传输线上数据位的顺序,设计了CRC的计算电路。如果这样的计算方式只是局限在芯片的硬件层次,不会产生什么问题,但后来到了与计算机通信时发生了数据位反转的问题,结果就出现了这个Reflect()函数,并被引入了CRC的软件算法中。

从所有对CRC计算的文字描述来看,显然都没有这个Reflect()的操作,因此上述的说法是有一定的可信度的。我从网上也下载了一个号称是WinZIP使用的CRC算法,在里面我也看到了这个Reflect()的操作;这再次让我相信WinZIP的实现只是CRC实现的一个个案,而不具有普遍的代表性。

前述资料的作者来自于澳大利亚阿德莱德大学,他也认为这种REFLECTED算法引起了不少的混乱,我相信这种混乱也包括我们这里的讨论。

使用特权

评论回复
26
McuIsp| | 2009-4-15 22:09 | 只看该作者

各位可以用stm32计算下0x81818181的crc。

结果再与0xffffffff异或。此时stm32应该是跟主流一致的。

感觉stm32与主流实例差别有2点:
1、每个字节的位序相反。stm32f是按32位,高位在先。而主流实例每字节里面是从低位起的。
2、结果出来后,主流实例与0xffffffff异或了。而stm32f没有。

所以stm32f的crc完全可以主流化。只要数据输入后位序处理下,结果出来后异或下。

使用特权

评论回复
27
香水城|  楼主 | 2009-4-15 22:10 | 只看该作者

看看大叔34楼贴出的图片,算一个CRC居然也要这么多选项

reverse!
convert!
nondirect <--> direct
"reverse data bytes"
"reverse CRC result before final XOR"

这么多选项足以把所有人搞晕,哪个才是合适的?哪个又是标准?

我至今没有找到所谓权威的标准文件,可以相信大叔的话它的精华就是“初值、权和方向”,其它的东西只能说只要不违反这个原则,存在就是合理的,没有什么标准不标准的问题。

使用特权

评论回复
28
hotpower| | 2009-4-15 22:12 | 只看该作者

关于CRC初值的选择问题

在任何“左移CRC”中,当选初值为0时,

若输入为0时,CRC结果为0.
若输入为1时,CRC结果为权.

这样“阶级敌人”很好破译“权”~~~

所以,CRC32选择了初值非0~~~

使用特权

评论回复
29
香水城|  楼主 | 2009-4-15 22:14 | 只看该作者

如果按照38楼的说法,那个关于Reflect()的由来就得到了印证

而最后这个与0xffffffff异或操作,用软件实现比用硬件实现方便得多,便宜得多。

使用特权

评论回复
30
hotpower| | 2009-4-15 22:22 | 只看该作者

30楼的问题就是“方向”~~~左移“硬件成本低廉”~~~

在就是输出的异或0xffffffff~~~
即要增加32个非门~~~

所以,软件的CRC32随便怎么折腾~~~硬件就受不了了~~~

所以,硬件厂家的各种CRC都和菜农的算法吻合不无道理~~~

因为俺的目的:MCU最简洁的指令和最快的速度实现CRCXX的可逆运算~~~

俺相信大鼻子的脑浆一定和俺的颜色一样~~~只不过是“软硬”不同~~~

他的是硬的,俺的是软的~~~


使用特权

评论回复
31
mohanwei| | 2009-4-15 22:26 | 只看该作者

我也发个自己的编程小工具,200K不到,比较适合放在桌面使

顺便说一下,我搞CRC纯粹为了通信可靠一点,不搞加密解密,所以所用的多项式都是标准常用的。

http://www.skycn.com/soft/49092.html
amo的编程小工具 1.2

我平时编程和设计时常用的小工具集合。
功能:
1-8位校验和
2-16位校验和
3-计算CRC8
4-计算CRC16
5-计算CRC32
6-计算MD5
7-计算SHA1
8-十六进制字符串转换为Ascii字符串
9-Ascii字符串转换为十六进制字符串
10-十六进制字符串转换为浮点数
11-浮点数转换为十六进制字符串
12-统计**的字符个数,精确到每一个字符
13-把文件转换为C语言数组(这样可以把文件嵌入到我们的程序中)
14-电阻值选型(开发中)
15-电容值选型(开发中)
16-电感值选型(开发中)
17-滤波器选型(开发中)
18-执行C语言Printf函数(开发中)
19-产生一组随机数
20-把字符串转换为大写
21-把字符串转换为小写
22-字符串头尾对调
23-十六进制格式转换
……
功能陆续添加中……

使用特权

评论回复
32
mohanwei| | 2009-4-15 22:29 | 只看该作者

帮助文件没有,不过大部分按钮都有提示……

21ic贴个图真麻烦……

使用特权

评论回复
33
hotpower| | 2009-4-15 22:33 | 只看该作者

哈哈~~~A5A5A5A5结果为多少~~~

使用特权

评论回复
34
mohanwei| | 2009-4-15 22:36 | 只看该作者

079B ?

使用特权

评论回复
35
5_0_5| | 2009-4-15 23:06 | 只看该作者

标记

估计会用上

使用特权

评论回复
36
McuIsp| | 2009-4-15 23:21 | 只看该作者

夜深了,出个解决方案,让stm32f的CRC32主流化:

//CopyRight:www.mcuisp.com
//版权: 单片机在线编程网
详细代码请到www.mcuisp.com下载

使用特权

评论回复
37
香水城|  楼主 | 2009-4-16 08:38 | 只看该作者

谢谢48楼:原来那个主流是个非典应用

我已经在37楼给出了说明,现在48楼MCUISP又给出了直接证据,谢谢!

哈哈,可以结帖了。

使用特权

评论回复
38
梅川酷子| | 2010-1-5 00:16 | 只看该作者
uc32 crc32_table[256] =
{
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
};

u32 GetCRC32(u32 crc32, u8 *p, u32 len)
{
while (len--)
{
  crc32 = crc32_table[(crc32 >> 24) ^  *p++] ^ (crc32 << 8);
}
return crc32;
}

SwCRC32 = GetCRC32(0,Ptr,Length);
特价于:
Length>>=2;
CRC->DR=0xffffffffUL;
while(Length--)
{
    CRC->DR =__REV(*Ptr++);    //字节顺序倒过来,注意不是位序,不是用__RBIT指令
}
HwCRC32=CRC->DR;


搞定!!!!不错的说

没搞清楚之后还是不要乱说ST,哈哈,

使用特权

评论回复
39
梅川酷子| | 2010-1-5 10:04 | 只看该作者
本帖最后由 梅川酷子 于 2010-1-6 08:09 编辑

楼上几位说的STM32的CRC32,按"输入数据位序颠倒,输出数据位序颠倒,再与0xffffffff异或(取反)"是不对.
不信可以试试.

CRC_ResetDR();
CRC->DR=0xffffffffUL;
for(idx = 0; idx < Length; idx++)
{
  CRC->DR =__REV(Ptr[idx]);  //字节顺序倒过来   
}     
CRC32=CRC->DR;


一般的CRC32都是按字节算的,而STM32是按字算,
所以STM32并非"非主流",仅仅是初值和字节顺序的问题而已.

使用特权

评论回复
40
yybj| | 2010-1-5 10:07 | 只看该作者
内置模块的原理讲的很清楚,实用也讲的很好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则