stm32 硬件CRC32检验出错(位反转), 验证OK

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:08   1536   0

### main.c

static void MX_CRC_Init(void)

{

/* USER CODE BEGIN CRC_Init 0 */

/* USER CODE END CRC_Init 0 */

/* USER CODE BEGIN CRC_Init 1 */

/* USER CODE END CRC_Init 1 */

hcrc.Instance = CRC;

hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; // DEFAULT_CRC32_POLY

hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; // DEFAULT_CRC_INITVALUE

hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;

hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;

hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;

if (HAL_CRC_Init(&hcrc) != HAL_OK) // HAL_CRC_MspInit() --> __HAL_RCC_CRC_CLK_ENABLE();

{

Error_Handler();

}

/* USER CODE BEGIN CRC_Init 2 */

/* USER CODE END CRC_Init 2 */

}

### stm32l0xx_hal_crc.c

unsigned int reverse(unsigned int x)

{

x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));

x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));

x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));

x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));

return((x >> 16) | (x << 16));

}

uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)

{

uint32_t index; /* CRC input data buffer index */

uint32_t temp = 0U; /* CRC output (read from hcrc->Instance->DR register) */

/* Change CRC peripheral state */

hcrc->State = HAL_CRC_STATE_BUSY;

/* Reset CRC Calculation Unit (hcrc->Instance->INIT is

* written in hcrc->Instance->DR) */

__HAL_CRC_DR_RESET(hcrc);

switch (hcrc->InputDataFormat)

{

case CRC_INPUTDATA_FORMAT_WORDS:

/* Enter 32-bit input data to the CRC calculator */

for (index = 0U; index < BufferLength; index++)

hcrc->Instance->DR = reverse(pBuffer[index]);

// printf("%p, index=0x%X\r\n\r\n", pBuffer, index);

uint32_t a = 0;

a = hcrc->Instance->DR;

a ^= 0xffffffff;

temp = reverse(a);

break;

case CRC_INPUTDATA_FORMAT_BYTES:

/* Specific 8-bit input data handling */

temp = CRC_Handle_8(hcrc, (uint8_t *)pBuffer, BufferLength);

break;

case CRC_INPUTDATA_FORMAT_HALFWORDS:

/* Specific 16-bit input data handling */

temp = CRC_Handle_16(hcrc, (uint16_t *)(void *)pBuffer, BufferLength); /* Derogation MisraC2012 R.11.5 */

break;

default:

break;

}

/* Change CRC peripheral state */

hcrc->State = HAL_CRC_STATE_READY;

/* Return the CRC computed value */

return temp;

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP