搜索
bottom↓
回复: 9

这个crc是标准算法吗?stm32的硬件crc模块能够计算吗?

[复制链接]

出0入17汤圆

发表于 2021-2-27 13:25:54 | 显示全部楼层 |阅读模式
本帖最后由 ilovepp 于 2021-2-27 13:40 编辑

unsigned short crc(unsigned char *param_1,unsigned short param_2)
{
  unsigned int uVar1;
  unsigned int uVar2;
  unsigned short uVar3;
  unsigned char bVar4;
  unsigned int uVar5;
  unsigned char *pbVar6;
  short sVar7;
  unsigned char *pbVar8;

  if (param_2 == 0) {
    return 0xffff;
  }
  uVar3 = param_2 & 1;
  if (param_2 == 1) {
    uVar5 = 0xffff;
  }
  else {
    uVar5 = 0xffff;
    pbVar6 = param_1;
    sVar7 = param_2 - (param_2 & 1);
    do {
      pbVar8 = pbVar6 + -1;
      if ((param_2 & 1) == 0) {
        pbVar8 = pbVar6 + 1;
      }
      param_2 = param_2 - 2;
      param_1 = pbVar6 + 2;
      uVar5 = uVar5 ^ (unsigned int)*pbVar8 << 8;
      uVar2 = (uVar5 & 0xffff) << 1;
      uVar1 = uVar2 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar2;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      uVar1 = uVar5 << 1 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar5 << 1;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      uVar1 = uVar5 << 1 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar5 << 1;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      uVar1 = uVar5 << 1 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar5 << 1;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      if ((param_2 & 1) != 0) {
        pbVar6 = param_1;
      }
      uVar5 = uVar5 ^ (unsigned int)*pbVar6 << 8;
      uVar2 = (uVar5 & 0xffff) << 1;
      uVar1 = uVar2 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar2;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      uVar1 = uVar5 << 1 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar5 << 1;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      uVar1 = uVar5 << 1 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar5 << 1;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      uVar1 = uVar5 << 1 ^ 0x8005;
      if (-1 < (short)uVar5) {
        uVar1 = uVar5 << 1;
      }
      uVar5 = uVar1 << 1 ^ 0x8005;
      if (-1 < (short)uVar1) {
        uVar5 = uVar1 << 1;
      }
      bVar4 = sVar7 != 2;
      pbVar6 = param_1;
      sVar7 = sVar7 + -2;
    } while (bVar4);
  }
  if (uVar3 != 0) {
    pbVar6 = param_1 + -1;
    if ((param_2 & 1) == 0) {
      pbVar6 = param_1 + 1;
    }
    uVar5 = uVar5 ^ (unsigned int)*pbVar6 << 8;
    uVar2 = (uVar5 & 0xffff) << 1;
    uVar1 = uVar2 ^ 0x8005;
    if (-1 < (short)uVar5) {
      uVar1 = uVar2;
    }
    uVar5 = uVar1 << 1 ^ 0x8005;
    if (-1 < (short)uVar1) {
      uVar5 = uVar1 << 1;
    }
    uVar1 = uVar5 << 1 ^ 0x8005;
    if (-1 < (short)uVar5) {
      uVar1 = uVar5 << 1;
    }
    uVar5 = uVar1 << 1 ^ 0x8005;
    if (-1 < (short)uVar1) {
      uVar5 = uVar1 << 1;
    }
    uVar1 = uVar5 << 1 ^ 0x8005;
    if (-1 < (short)uVar5) {
      uVar1 = uVar5 << 1;
    }
    uVar5 = uVar1 << 1 ^ 0x8005;
    if (-1 < (short)uVar1) {
      uVar5 = uVar1 << 1;
    }
    uVar1 = uVar5 << 1 ^ 0x8005;
    if (-1 < (short)uVar5) {
      uVar1 = uVar5 << 1;
    }
    uVar5 = uVar1 << 1 ^ 0x8005;
    if (-1 < (short)uVar1) {
      uVar5 = uVar1 << 1;
    }
  }
  return (unsigned short)uVar5;
}

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入31汤圆

发表于 2021-2-27 14:05:27 | 显示全部楼层
自己测试吧

出0入17汤圆

 楼主| 发表于 2021-2-27 15:26:52 来自手机 | 显示全部楼层
zchong 发表于 2021-2-27 14:05
自己测试吧

CRC16_MODBUS:
多项式x^16+x^15+x^2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0x0000异或;

出0入0汤圆

发表于 2021-3-1 08:44:14 | 显示全部楼层
crc16的计算算法

出0入362汤圆

发表于 2021-3-1 08:59:40 | 显示全部楼层
modbus吧, 写成8005的少见些, 一般是倒过来a001
怎么写得这么麻烦, 应该很简单的, 查表也没多少

出0入31汤圆

发表于 2021-3-1 09:01:51 | 显示全部楼层
stm32的CRC是32bit的,多项式是以太网的CRC格式,你这个是16bit的,算不了。

出0入362汤圆

发表于 2021-3-1 09:18:03 | 显示全部楼层
zchong 发表于 2021-3-1 09:01
stm32的CRC是32bit的,多项式是以太网的CRC格式,你这个是16bit的,算不了。

这是f1和f4吧, f0里的f042/f072, f3全系列, 应该都是能支持的

出0入54汤圆

发表于 2021-3-1 09:20:24 | 显示全部楼层
CRC的算法都是一样的,只是有几个设定选项,比如初始值,位数,多项式,输出要不要异或等。计算方法都是移位异或。

出0入31汤圆

发表于 2021-3-1 10:29:53 | 显示全部楼层
tomzbj 发表于 2021-3-1 09:18
这是f1和f4吧, f0里的f042/f072, f3全系列, 应该都是能支持的

可能,是我表达不严谨了,只接触过f1、f2、f4系列,其它的是不是多项式可以设置?

出0入362汤圆

发表于 2021-3-1 11:10:17 | 显示全部楼层
zchong 发表于 2021-3-1 10:29
可能,是我表达不严谨了,只接触过f1、f2、f4系列,其它的是不是多项式可以设置? ...

对啊...
你看一下库文件, stm32*****_spi.h, 里面都有
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 01:28

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

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