/********************************************************************************
 * @file    ADC_SingleConversion.c
 * @author  SOC AE Team
 * @version V1.1
 * @date    2025-06-27
 * @brief   计算三次不同长度数组的CRC校验值。
 *
 *******************************************************************************/
#include "sc32_conf.h"
#include "Function_Init.h"
#include "stdio.h"

static uint8_t U8_TestArray[10] = {0x01, 0x02, 0x03, 0x04, 0x05,
                                   0x06, 0x07, 0x08, 0x09, 0x0A,
                                  };



static uint16_t U16_TestArray[10] = {0x0001, 0x0002, 0x0003, 0x0004, 0x0005,
                                    0x0006, 0x0007, 0x0008, 0x0009, 0x000A,
                                   };

static uint32_t U32_TestArray[10] = {0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
                                    0x00000006, 0x00000007, 0x00000008, 0x00000009, 0x0000000A,
                                   };


void CRC_CalculateArrays_Function(void)
{
  uint32_t tmpNum = 0;
  uint32_t CRC_Result;
  CRC_InitTypeDef CRC_InitStruct;

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);

  CRC_InitStruct.DefaultPolynomialUse = DEFAULT_Polynomial_Disable;
  CRC_InitStruct.GeneratingPolynomial = 0x07;
  CRC_InitStruct.DefaultInitValueUse = DEFAULT_InitValue_Disable;
  CRC_InitStruct.InitValue = 0x000000FF;
  CRC_InitStruct.CRCSize = CRC_POLYSIZE_8B;

  CRC_Init(&CRC_InitStruct);
	
	
    //法一
    CRC_ResetDR();//将CRCDR寄存器复位为全1
    for(tmpNum = 0; tmpNum < 10; tmpNum++)
    {
    CRC_CalcCRC8bits(U8_TestArray[tmpNum]);//被校验数据依次写入CRCDR寄存器进行校验
    }
    CRC_Result = CRC_GetCRC();//获取校验值

/*//法二
	CRC_Result = CRC_Calculate(CRC_InputData_Format_BYTES,(uint32_t *)U8_TestArray,10);
*/
	
/*//法三
  CRC_Result = CRC_Calculate(CRC_InputData_Format_BYTES,(uint32_t *)U8_TestArray,5);//先校验数组前5个数据
	CRC_Result = CRC_Accumulate(CRC_InputData_Format_BYTES,(uint32_t *)(U8_TestArray+5),5);//再接着校验数组后5个数据
*/
    printf(" \r\n8bit CRC value is 0x%x \r\n", CRC_Result); //当前8位数组正确校验值为0x89

    /* 16bitCRC校验初始化 */
    CRC_InitStruct.DefaultPolynomialUse = DEFAULT_Polynomial_Disable;//不使用默认多项式（默认多项式为0x04C11DB7）
    CRC_InitStruct.GeneratingPolynomial = 0x8005; //自定义多项式
    CRC_InitStruct.DefaultInitValueUse = DEFAULT_InitValue_Disable;//不使用默认初始值（默认初始值为0xFFFFFFFF）
    CRC_InitStruct.InitValue = 0x0000FFFF; //自定义初始值
    CRC_InitStruct.CRCSize = CRC_POLYSIZE_16B; //多项式为16位
    CRC_Init(&CRC_InitStruct);

/*//法一
  CRC_ResetDR();//将CRCDR寄存器复位为全1
  for(tmpNum = 0; tmpNum < 10; tmpNum++)
  {
    CRC_CalcCRC16bits(U16_TestArray[tmpNum]);//被校验数据依次写入CRCDR寄存器进行校验
  }
  CRC_Result = CRC_GetCRC();//获取校验值
*/
    //法二
    CRC_Result = CRC_Calculate(CRC_InputData_Format_HALFWORDS,(uint32_t *)U16_TestArray,10);

/*//法三
  CRC_Result = CRC_Calculate(CRC_InputData_Format_HALFWORDS,(uint32_t *)U16_TestArray,5);//先校验数组前5个数据
	CRC_Result = CRC_Accumulate(CRC_InputData_Format_HALFWORDS,(uint32_t *)(U16_TestArray+5),5);//再接着校验数组后5个数据
*/	
    printf(" \r\n16bit CRC value is 0x%x \r\n", CRC_Result); //当前16位数组正确校验值为0x90BC

    /* 32bitCRC校验初始化 */
    CRC_InitStruct.DefaultPolynomialUse = DEFAULT_Polynomial_Enable;//使用默认多项式（默认多项式为0x04C11DB7）
    CRC_InitStruct.DefaultInitValueUse = DEFAULT_InitValue_Enable;//使用默认初始值（默认初始值为0xFFFFFFFF）
    CRC_InitStruct.CRCSize = CRC_POLYSIZE_32B; //多项式为32位
    CRC_Init(&CRC_InitStruct);

/*//法一
  CRC_ResetDR();//将CRCDR寄存器复位为全1
  for(tmpNum = 0; tmpNum < 10; tmpNum++)
  {
    CRC_CalcCRC(U32_TestArray[tmpNum]);//被校验数据依次写入CRCDR寄存器进行校验
  }
  CRC_Result = CRC_GetCRC();//获取校验值
*/

/*//法二
  CRC_Result = CRC_Calculate(CRC_InputData_Format_WORDS,U32_TestArray,10);
*/
    //法三
    CRC_Result = CRC_Calculate(CRC_InputData_Format_WORDS,U32_TestArray,5);//先校验数组前5个数据
    CRC_Result = CRC_Accumulate(CRC_InputData_Format_WORDS,U32_TestArray+5,5);//再接着校验数组后5个数据

    printf(" \r\n32bit CRC value is 0x%x \r\n", CRC_Result); //当前32位数组正确校验值为0x460051A4
	
	while(1);
}

