[资料工具] 在NV32上使用硬件CRC

[复制链接]
471|6
 楼主 | 2017-11-3 15:31 | 显示全部楼层 |阅读模式
本帖最后由 jhqd1994 于 2017-11-3 15:41 编辑

   本文针对例程包中的CRC_demo配置进行详解:     
    例程中的对应CRC-16/CCITT-FALSE的配置
    pCRC_Config->u32PolyData                 = 0x1021;                   /*!< 16位 CRC-CCITT 多项式 */
    u32SeedValue                                    = 0xFFFF;                   /*!< 设定种子值(检验和初始值) */     
    pCRC_Config->bWidth                        = CRC_WIDTH_16BIT;          /*!< 选择16位CRC协议 */   
    pCRC_Config->bTransposeReadType   = CRC_READ_TRANSPOSE_NONE;  /*!< 读取的CRC数据寄存器的值不转置 */      
    pCRC_Config->bTransposeWriteType   = CRC_WRITE_TRANSPOSE_NONE; /*!< 写入到CRC数据寄存器的值不转置 */
    pCRC_Config->bFinalXOR                    = FALSE;

下表列出常见CRC校验协议对应NV32-CRC工程的配置
校验协议
Poly
Width
Seedvalue
TransposeWriteType
TransposeReadType
FinalXOR
CRC-16/IBM
0x8005
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
FALSE
CRC-16/MAXIM
0x8005
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC-16/USB
0x8005
16
0xFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC-16/MODBUS
0x8005
16
0xFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
FALSE
CRC-16/CCITT
0x1021
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
FALSE
CRC-16/CCITT-FALSE
0x1021
16
0xFFFF
CRC_WRITE_TRANSPOSE_NONE
CRC_READ_TRANSPOSE_NONE
FALSE
CRC-16/X25
0x1021
16
0xFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC-16/XMODEM
0x1021
16
0x0000
CRC_WRITE_TRANSPOSE_NONE
CRC_READ_TRANSPOSE_NONE
FALSE
CRC-16/DNP
0x3D65
16
0x0000
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC32
0x04C11DB7
32
0xFFFFFFFF
CRC_WRITE_TRANSPOSE_BIT
CRC_READ_TRANSPOSE_ALL
TRUE
CRC32/MPEG-2
0x04C11DB7
32
0xFFFFFFFF
CRC_WRITE_TRANSPOSE_NONE
CRC_READ_TRANSPOSE_NONE
FALSE


详细的了解CRC模块,请见NV32F100x参考手册-CRC循环冗余校验模块

纠正例程中的CRC_Cal16函数,添加红色处相关代码
uint32_t CRC_Cal16(uint32_t seed, uint8_t *msg, uint32_t sizeBytes)
{
  uint32_t ctrl_reg,data_out,data_in;
  uint8_t  *pCRCBytes;
  uint32_t sizeWords;
  uint32_t i,j;  

  /* 设置WaS=1,写入种子值 */
  ctrl_reg  = CRC0->CTRL;
  CRC0->CTRL  = ctrl_reg | CRC_CTRL_WAS_MASK;
  CRC0->ACCESS16BIT.DATAL = seed;

  /* Set WaS=0,准备写入数据*/
  CRC0->CTRL  = ctrl_reg & 0xFD000000;

  /*等待计算完成*/
  sizeWords = sizeBytes>>1;
  j = 0;
  for(i=0;i<sizeWords;i++){
      data_in = (msg[j] << 8) | (msg[j+1]);  /*将数据写入CRC数据寄存器,以16位方式写入*/
      j += 2;
      CRC0->ACCESS16BIT.DATAL =data_in;
  }
  if (j<sizeBytes)
  {
     pCRCBytes = (uint8_t*)&CRC0->ACCESS8BIT.DATALL; /*以8位的方式写入剩余的数据*/
     *pCRCBytes++ = msg[j];
  }
  if ((CRC0->CTRL& CRC_CTRL_TOTR_MASK)>1)
  {
     data_out=CRC0->ACCESS16BIT.DATAH;  //读出字节转置后16位计算结果
  }
  else
  {
     data_out=CRC0->ACCESS16BIT.DATAL;  //读出16位计算结果
  }
  return(data_out);
}

推荐使用附件中的CRC计算器





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x
| 2017-11-3 15:43 | 显示全部楼层
自定义 poly 和 FinalXOR 真是方便
| 2017-11-20 20:53 | 显示全部楼层
这个很不错,STM的不太好用
| 2017-11-22 20:16 | 显示全部楼层
支持下,硬件CRC还是不错的。
| 2017-12-24 08:24 | 显示全部楼层
硬件CRC的速度如何,支持哪种CRC的校验呢?
| 2017-12-24 20:35 | 显示全部楼层
本帖最后由 hotpower 于 2017-12-24 20:40 编辑

http://www.21ic.com/tools/HotPower/HotWC3_V1.23.html
| 2018-1-7 19:33 | 显示全部楼层
比纯软件好多了! 但是,比起新塘的PDMA-CRC,基于DMA的纯硬件算法是慢了很多;ST的不了解。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册 手机登录
高级模式

论坛热帖

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