예제 #1
0
/*==================================================================
* Function	 : CRC_CalculateBlockCRC
* Description   : 
* Inputpara     : 
* Outputpara   : 
==================================================================*/
u32 CRC_CalculateBlockCRC(u8 pBuffer[], u32 BufferLength)
{
  u32 i;
  CRC_Reset();   
  for(i = 0;i < BufferLength;i++)
  CRC->DR = (u32)pBuffer[i];
  return CRC->DR;
}
예제 #2
0
파일: main.c 프로젝트: LonelyWolf/stm32
int main(void) {
	// Initialize the MCU clock system
	SystemInit();
	SetSysClock();
	SystemCoreClockUpdate();


	// Initialize debug output port (USART2)
	//   clock source: SYSCLK
	//   mode: transmit only
	USART2_HandleInit();
	RCC_SetClockUSART(RCC_USART2_CLK_SRC,RCC_PERIPH_CLK_SYSCLK);
	USART_Init(&hUSART2,USART_MODE_TX);

	// Configure USART:
	//   oversampling by 16
	//   115200, 8-N-1
	//   no hardware flow control
	USART_SetOversampling(&hUSART2,USART_OVERS16);
	USART_SetBaudRate(&hUSART2,115200);
	USART_SetDataMode(&hUSART2,USART_DATAWIDTH_8B,USART_PARITY_NONE,USART_STOPBITS_1);
	USART_SetHWFlow(&hUSART2,USART_HWCTL_NONE);
	USART_Enable(&hUSART2);
	USART_CheckIdleState(&hUSART2,0xC5C10); // Timeout of about 100ms at 80MHz CPU


	// Say "hello world"
	RCC_ClocksTypeDef Clocks;
	RCC_GetClocksFreq(&Clocks);
	printf("\r\n---STM32L476RG---\r\n");
	printf("CRC peripheral (%s @ %s)\r\n",__DATE__,__TIME__);
	printf("CPU: %.3uMHz\r\n",SystemCoreClock / 1000);
	printf("SYSCLK=%.3uMHz, HCLK=%.3uMHz\r\n",Clocks.SYSCLK_Frequency / 1000,Clocks.HCLK_Frequency / 1000);
	printf("APB1=%.3uMHz, APB2=%.3uMHz\r\n",Clocks.PCLK1_Frequency / 1000,Clocks.PCLK2_Frequency / 1000);
	printf("System clock: %s\r\n",_sysclk_src_str[RCC_GetSysClockSource()]);


	// Enable the CRC peripheral
	CRC_Enable();

	// Disable reverse for input and output data
	CRC_SetInRevMode(CRC_IN_NORMAL);
	CRC_SetOutRevMode(CRC_OUT_NORMAL);


	// First column in output is the calculated CRC, second - reference value

	// 8-bit CRC tests
	CRC_SetPolynomialSize(CRC_PSIZE_8B);
	printf("CRC-8 tests:\r\n");

	// CCITT CRC-8 (Poly=0x07, Init=0x00, RefIn=false, RefOut=false)
	CRC_SetPolynomial(0x07);
	CRC_SetInitValue(0x00);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("CCITT    : 0x%02X . 0x%02X\r\n", CRC_GetData8(), 0x34);

	// CDMA2000 CRC-8 (Poly=0x9B, Init=0xFF, RefIn=false, RefOut=false)
	CRC_SetPolynomial(0x9B);
	CRC_SetInitValue(0xFF);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("CDMA2000 : 0x%02X . 0x%02X\r\n", CRC_GetData8(), 0xCE);

	// WCDMA CRC-8 (Poly=0x9B, Init=0x00, RefIn=true, RefOut=true)
	CRC_SetInitValue(0x00);
	CRC_SetInRevMode(CRC_IN_REV_BYTE);
	CRC_SetOutRevMode(CRC_OUT_REVERSED);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("WCDMA    : 0x%02X . 0x%02X\r\n", CRC_GetData8(), 0xEA);

	// I-CODE CRC-8 (Poly=0x1D, Init=0xFD, RefIn=false, RefOut=false)
	CRC_SetPolynomial(0x1D);
	CRC_SetInitValue(0xFD);
	CRC_SetInRevMode(CRC_IN_NORMAL);
	CRC_SetOutRevMode(CRC_OUT_NORMAL);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("I-CODE   : 0x%02X . 0x%02X\r\n", CRC_GetData8(), 0x87);

	// ROHC CRC-8 (Poly=0x07, Init=0xFF, RefIn=true, RefOut=true)
	CRC_SetPolynomial(0x07);
	CRC_SetInitValue(0xFF);
	CRC_SetInRevMode(CRC_IN_REV_BYTE);
	CRC_SetOutRevMode(CRC_OUT_REVERSED);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("ROHC     : 0x%02X . 0x%02X\r\n", CRC_GetData8(), 0x1A);


	// 16-bit CRC tests
	CRC_SetPolynomialSize(CRC_PSIZE_16B);
	printf("CRC-16 tests:\r\n");

	// MODBUS (Poly=0x8005, Init=0xFFFF, RefIn=true, RefOut=true)
	CRC_SetPolynomial(0x8005);
	CRC_SetInitValue(0xFFFF);
	CRC_SetInRevMode(CRC_IN_REV_BYTE);
	CRC_SetOutRevMode(CRC_OUT_REVERSED);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("MODBUS   : 0x%04X . 0x%04X\r\n", CRC_GetData16(), 0x3BD1);

	// CDMA2000 (Poly=0xC867, Init=0xFFFF, RefIn=false, RefOut=false)
	CRC_SetPolynomial(0xC867);
	CRC_SetInRevMode(CRC_IN_NORMAL);
	CRC_SetOutRevMode(CRC_OUT_NORMAL);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("CDMA2000 : 0x%04X . 0x%04X\r\n", CRC_GetData16(), 0x52F7);

	// XMODEM (Poly=0x1021, Init=0x0000, RefIn=false, RefOut=false)
	CRC_SetPolynomial(0x1021);
	CRC_SetInitValue(0x0000);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("XMODEM   : 0x%04X . 0x%04X\r\n", CRC_GetData16(), 0x047B);

	// USB (Poly=0x8005, Init=0xFFFF, RefIn=true, RefOut=true, XorOut=0xFFFF)
	CRC_SetPolynomial(0x8005);
	CRC_SetInitValue(0xFFFF);
	CRC_SetInRevMode(CRC_IN_REV_BYTE);
	CRC_SetOutRevMode(CRC_OUT_REVERSED);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("USB      : 0x%04X . 0x%04X\r\n", CRC_GetData16() ^ 0xFFFF, 0xC42E);


	// 32-bit CRC tests
	CRC_SetPolynomialSize(CRC_PSIZE_32B);
	printf("CRC-32 tests:\r\n");

	// MPEG-2 (Poly=0x04C11DB7, Init=0xFFFFFFFF, RefIn=true, RefOut=true)
	CRC_SetPolynomial(0x04C11DB7);
	CRC_SetInitValue(0xFFFFFFFF);
	CRC_SetInRevMode(CRC_IN_NORMAL);
	CRC_SetOutRevMode(CRC_OUT_NORMAL);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("MPEG-2   : 0x%08X . 0x%08X\r\n", CRC_GetData32(), 0xF5C62CB4);

	// POSIX (Poly=0x04C11DB7, Init=0x00000000, RefIn=false, RefOut=false, XorOut=0xFFFFFFFF)
	CRC_SetPolynomial(0x04C11DB7);
	CRC_SetInitValue(0x00000000);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("POSIX    : 0x%08X . 0x%08X\r\n", CRC_GetData32() ^ 0xFFFFFFFF, 0xD338A790);

	// CRC-32D (Poly=0xA833982B, Init=0xFFFFFFFF, RefIn=true, RefOut=true, XorOut=0xFFFFFFFF)
	CRC_SetPolynomial(0xA833982B);
	CRC_SetInitValue(0xFFFFFFFF);
	CRC_SetInRevMode(CRC_IN_REV_BYTE);
	CRC_SetOutRevMode(CRC_OUT_REVERSED);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("CRC-32D  : 0x%08X . 0x%08X\r\n", CRC_GetData32() ^ 0xFFFFFFFF, 0xD2178F40);

	// XFER (Poly=0x000000AF, Init=0x00000000, RefIn=false, RefOut=false)
	CRC_SetPolynomial(0x000000AF);
	CRC_SetInitValue(0x00000000);
	CRC_SetInRevMode(CRC_IN_NORMAL);
	CRC_SetOutRevMode(CRC_OUT_NORMAL);
	CRC_Reset();
	CRC_CalcBuffer((uint32_t *)data_buf, buf_size);
	printf("XFER     : 0x%08X . 0x%08X\r\n", CRC_GetData32(), 0x5D4143CF);


	// The main loop
	while (1) {
	}
}
예제 #3
0
/*==================================================================
* Function	 :static u32 CRC_CalculateCRC(u32 data)
* Description   : 
* Inputpara     :
* Outputpara   : 
==================================================================*/
static u32 CRC_CalculateCRC(u32 data)
{
  CRC_Reset();  
  CRC->DR = data;
  return CRC->DR;
}
예제 #4
0
/*==================================================================
* Function	 : calcrc_1byte
* Description   : 
* Inputpara     : 
* Outputpara   : 
==================================================================*/
static void CRC_Init(void)
{
     
	 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);
     CRC_Reset(); 
}