首页 > 其他分享 >STM32 硬件CRC的使用

STM32 硬件CRC的使用

时间:2023-10-14 16:33:52浏览次数:37  
标签:硬件 00 CODE 16 STM32 CRC USER true

1 代码:

crc_lib.h

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __crc_lib_H
#define __crc_lib_H
#ifdef __cplusplus
 extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
 

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void GHShell_CRC_Init(unsigned char crc_type) ; unsigned short GHShell_CRC_Calculate(unsigned int pBuffer[], unsigned int BufferLength) ; /* USER CODE BEGIN Prototypes */ #define CRC16_MODBUS 0 #define CRC16_X25 1 /* USER CODE END Prototypes */ #ifdef __cplusplus } #endif #endif /*__ crc_H */

crc_lib.c

/* Includes ------------------------------------------------------------------*/
#include "crc_lib.h"

/* USER CODE BEGIN 0 */
#include "stm32g0xx_hal.h" 
/* USER CODE END 0 */

static CRC_HandleTypeDef hcrc;
static unsigned char CRCType;

static void CRC_Swap(uint8_t *pa, uint8_t *pb);

typedef struct
{
    uint8_t   lsb8;    
    uint8_t   msb8;
    
} Crc_data;

typedef union 
{
  uint16_t    reg;
  Crc_data    val;
    
}Crc_ElementType;


/****************** Exported function ***********************/


 
/* CRC init function */
void GHShell_CRC_Init(unsigned char crc_type)
{

  hcrc.Instance = CRC;
  hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
  hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;
  if(crc_type){
     hcrc.Init.GeneratingPolynomial = 4129;
/*这个值对应多项式,多项式用2的N次方加起来后就是这个值。
设置不同的值就是不同的CRC校验多项式,STM32F4的硬件CRC只支持以太网的CRC校验*/
  }
  else{
    hcrc.Init.GeneratingPolynomial = 32773;
  }
  CRCType =crc_type;
  
  hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
  hcrc.Init.InitValue = 0xFFFF;
  hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;
  hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
  hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  if (HAL_CRC_Init(&hcrc) != HAL_OK)
  {
//    Error_Handler();
  }

}

unsigned short GHShell_CRC_Calculate(uint32_t pBuffer[], uint32_t BufferLength)
{
    Crc_ElementType Crc16;
    
    Crc16.reg =HAL_CRC_Calculate(&hcrc, pBuffer,BufferLength);
    CRC_Swap(&Crc16.val.lsb8,&Crc16.val.msb8); 
    
    if(CRCType == CRC16_X25){ 
        Crc16.reg ^=0xFFFF;
    }
     
    return (Crc16.reg);     
          
}


/******************** private function *********************/


static void CRC_Swap(uint8_t *pa, uint8_t *pb)
{
    uint8_t t;
    t =*pa;
    *pa =*pb;
    *pb =t;
} 

void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle)
{

  if(crcHandle->Instance==CRC)
  {
  /* USER CODE BEGIN CRC_MspInit 0 */

  /* USER CODE END CRC_MspInit 0 */
    /* CRC clock enable */
    __HAL_RCC_CRC_CLK_ENABLE();
  /* USER CODE BEGIN CRC_MspInit 1 */

  /* USER CODE END CRC_MspInit 1 */
  }
}

void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle)
{

  if(crcHandle->Instance==CRC)
  {
  /* USER CODE BEGIN CRC_MspDeInit 0 */

  /* USER CODE END CRC_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_CRC_CLK_DISABLE();
  /* USER CODE BEGIN CRC_MspDeInit 1 */

  /* USER CODE END CRC_MspDeInit 1 */
  }
} 

2 知识拓展:

 A  CRC在线计算:

 https://www.lammertbies.nl/comm/info/crc-calculation

 http://www.ip33.com/crc.html

 B  CRC算法参数模型解释:
 NAME:参数模型名称。如:CRC16/MODBUS等
 WIDTH:宽度,即CRC比特数。
 POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
 INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
 REFIN:待测数据的每个字节是否按位反转,True或False。
 REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
 XOROUT:计算结果与此参数异或后得到最终的CRC值。


常见CRC参数模型如下:

CRC算法名称多项式公式宽度多项式初始值结果异或值输入反转输出反转
CRC-4/ITU x4 + x + 1 4 03 00 00 true true
CRC-5/EPC x5 + x3 + 1 5 09 09 00 false false
CRC-5/ITU x5 + x4 + x2 + 1 5 15 00 00 true true
CRC-5/USB x5 + x2 + 1 5 05 1F 1F true true
CRC-6/ITU x6 + x + 1 6 03 00 00 true true
CRC-7/MMC x7 + x3 + 1 7 09 00 00 false false
CRC-8 x8 + x2 + x + 1 8 07 00 00 false false
CRC-8/ITU x8 + x2 + x + 1 8 07 00 55 false false
CRC-8/ROHC x8 + x2 + x + 1 8 07 FF 00 true true
CRC-8/MAXIM x8 + x5 + x4 + 1 8 31 00 00 true true
CRC-16/IBM x16 + x15 + x2 + 1 16 8005 0000 0000 true true
CRC-16/MAXIM x16 + x15 + x2 + 1 16 8005 0000 FFFF true true
CRC-16/USB x16 + x15 + x2 + 1 16 8005 FFFF FFFF true true
CRC-16/MODBUS x16 + x15 + x2 + 1 16 8005 FFFF 0000 true true
CRC-16/CCITT x16 + x12 + x5 + 1 16 1021 0000 0000 true true
CRC-16/CCITT-FALSE x16 + x12 + x5 + 1 16 1021 FFFF 0000 false false
CRC-16/X25 x16 + x12 + x5 + 1 16 1021 FFFF FFFF true true
CRC-16/XMODEM x16 + x12 + x5 + 1 16 1021 0000 0000 false false
CRC-16/DNP x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1 16 3D65 0000 FFFF true true
CRC-32 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 32 04C11DB7 FFFFFFFF FFFFFFFF true true
CRC-32/MPEG-2 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 32 04C11DB7 FFFFFFFF 00000000 false false

标签:硬件,00,CODE,16,STM32,CRC,USER,true
From: https://www.cnblogs.com/okyihu/p/17764280.html

相关文章

  • STM32 RTC模块的使用
    1STM32实时时钟RTC原理:   A外部晶振采用32.768KHz的原因,因为2的15次方2^15=32768,所以32.768KHz分频15次后刚好是1Hz,1S就是1Hz。   BRTC模块有一个实时计数器RealTimeCounter,它对震荡源脉冲计数,每个脉冲计数器加1,所以不能从该计数器直接获取时间时、分、秒。......
  • 小程序技术未来发展的思考 - 更多的硬件支持
    随着微信小程序、支付宝小程序等的普及,小程序技术已经成为了移动应用开发的主要领域之一。未来的小程序技术将继续发展,其中一个重要的趋势是提供更多的硬件支持。在本文中,我们将探讨小程序技术在硬件支持方面的发展趋势,并提供一个代码演示,展示如何在小程序中与硬件进行交互。更多硬......
  • 使用FMC连接SDRAM扩展STM32内存
    1.引脚初始化BSP_SDRAM_GPIO_InitvoidBSP_SDRAM_GPIO_Init(void){RCC_AHB1PeriphClockCmd(FMC_A0_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A1_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A2_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A3......
  • Cloud Kernel SIG 月度动态:发布多个 ANCK 版本,引入多个第三方硬件驱动
    CloudKernelSIG(SpecialInterestGroup):支撑龙蜥内核版本的研发、发布和服务,提供生产可用的高性价比内核产品。01SIG整体进展1.龙蜥社区完成申威架构的ISO镜像制作,可正常安装启动运行。2.硬件驱动方面引入基线的L0级别的硬件驱动到社区。3.引入浪潮自研的inspur-drm显......
  • adb & scrcpy 安装使用
    1、网上搜索一个scrcpy的安装包,他会自带adb相关软件。下述是网上的一个下载地址:https://link.zhihu.com/?target=https%3A//github.com/Genymobile/scrcpy/releases/download/v1.16/scrcpy-win64-v1.16.zip 解压出来如下,并配置环境变量到path里,这样在cmd中就可以使用adb......
  • 关于CH32V系列MCU中断优先级配置以及硬件压栈
    从下图可以看出,第二列与第三列分别为优先级与优先级类型,优先级类型又分为两种,其一是固定优先级,其二是可编程的优先级。以RTC为例,优先级为5,优先级类型为可编程,代表着在不配置RTC的优先级时默认为5,如果需要,也可以将其配置为更高的优先级进行响应。下图关于中断优先级配置,针对CH32V......
  • 电动自行车充换电解决方案,从智能硬件到软件系统,全部自主研发
    我们之前做的电动自行车换电柜业务,非常遗憾在换电柜刚起步时错失了资本助力的机会。然而,目前我们已经为客户稳定成功运营了4年多。市场上比如Q换电、佰里换电、点申出行等租售充电电动车和电池的运营商,他们都是采用我们的解决方案。我们的一站式换电租车解决方案包含智能电柜控板、......
  • 浅谈视频智能分析预警 事件识别算法硬件智能分析网关V2版的功能 及其智能分析网关V1版
    智能分析网关V1版本和智能分析网关V2版本相比,不仅在硬件外观上有所改变,而且在算法类别上也增加了一些新的内容。因此,今天我们将重点介绍智能分析网关V2版本的相关特性。智能分析网关V2是一种先进的数据处理设备,它融合了云计算、物联网和人工智能技术,主要应用于工业生产环境中......
  • STM32---I2C通讯
    STM32的I2C通讯可以使用两种方式实现,分别是软件I2C,和硬件I2C。软件I2C主要是通过代码手动翻转电平来模拟时序;硬件I2C主要使用通过STM32自带的硬件外设实现。以下,我着重讲述一下硬件I2C的部分。 想要使用硬件I2C,主要分为以下四个步骤:第一步,开启GPIO和I2C的时钟跟GPIO一样,I2C需......
  • dotnet 8 WPF 支持在 RDP 远程桌面状态下启用渲染硬件加速
    本文将和大家介绍在dotnet8里WPF引入的新功能之一,在RDP远程桌面状态下启用渲染硬件加速在dotnet8之前,在用户进行RDP远程桌面时WPF应用将默认关闭硬件渲染加速以获得更好的兼容性。随着系统层的渲染架构的优化,比如在WDDM驱动模型里面,进行远程桌面的硬件加速已经是......