搜索
bottom↓
回复: 9

[原创]STM32 CRC32计算单元的C实现

[复制链接]

出0入0汤圆

发表于 2009-4-16 09:55:08 | 显示全部楼层 |阅读模式
不知道为什么STM32的CRC计算单元不是常见的Crc32计算方法,可能是这样做硬件比较容易实现吧
数据传输的时候会用到Crc校验,STM32里面的计算方法又有点不一样
因此写了个用C实现的,可以用在上位机这样的程序里面
考虑到这段代码一般是在PC中运行,就没有写成查Table的方式了

//////////////////////////////////////////////////////////
///
///  CRC32 Calculator for STM32
///  Author:   lxyppc
///  E-Mail:   lxyppc@163.com
///  Version:  1.0
///  Data:     2009-04-13
///
///  This program is based on STOne-32's
///  http://www.st.com/mcu/forums-cat-7171-23.html
///
//////////////////////////////////////////////////////////

unsigned long CrcGen_STM32(unsigned long data[], unsigned long size)
{
    unsigned long crc = 0xFFFFFFFF;
    for(unsigned long i=0;i<size;i++){
        unsigned long temp = data;
        for(unsigned long j=0;j<32;j++){
            if( (crc ^ temp) & 0x80000000 ){
                crc = 0x04C11DB7 ^ (crc<<1);
            }else{
                crc <<=1;
            }
            temp<<=1;
        }
    }
    return crc;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-4-16 10:21:47 | 显示全部楼层
呵呵,去看看我的论证吧,所谓常见的CRC32计算方法,其实是个非典应用,因为以讹传讹变成了'常见'。

STM32内置CRC模块的使用

出0入0汤圆

 楼主| 发表于 2009-4-16 12:35:45 | 显示全部楼层
看了一下那边的讨论
个人觉得抛开硬件实现来谈CRC没有什么意义
只要用标准的多项式,至于移位顺序和初始值怎么方便怎么用
非要争个对错有点像在讨论茴香豆的茴有几种写法

出0入0汤圆

发表于 2009-4-16 16:51:14 | 显示全部楼层
是啊,对于明白人,那确实有点像在讨论茴香豆的茴有几种写法;但对于很多不明就里的人,就会把它当做ST芯片的Bug做文章了。

出0入0汤圆

 楼主| 发表于 2009-4-16 23:28:50 | 显示全部楼层
呵呵,和楼上深有同感:)

出0入0汤圆

发表于 2012-6-20 21:56:02 | 显示全部楼层
我的编译器,  unsigned long temp = data;

出0入0汤圆

发表于 2012-7-18 12:22:25 | 显示全部楼层
                 

出0入0汤圆

发表于 2014-11-18 11:38:47 | 显示全部楼层
你这个真的能编译通过、  unsigned long temp = data?我就呵呵。真的是误人子弟。

出0入8汤圆

发表于 2014-11-18 11:47:10 来自手机 | 显示全部楼层
楼主这是在挖坑呢
这种代码能编过么

出0入0汤圆

发表于 2017-9-9 10:30:02 | 显示全部楼层
顶一下 你这个对了 但是你上面写 漏了几个字符  我来帖上   

u32 CrcGen_STM32(u32 data[], u32 size)
{
     u32 crc = 0xFFFFFFFF;
     
     for(u32 i=0;i<size;i++)
     {
         u32 temp = data[i];
         
         for(u32 j=0;j<32;j++)
         {
             if( (crc ^ temp) & 0x80000000 )
             {
                 crc = 0x04C11DB7 ^ (crc<<1);
             }else
             {
                 crc <<=1;
             }
             temp<<=1;
         }
     }
     return crc;
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 02:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表