Skip to main content
Treacy Yao
Associate III
January 23, 2018
Question

STM32F030RC CRC value wrong

  • January 23, 2018
  • 10 replies
  • 3126 views
Posted on January 23, 2018 at 03:59

I want to add crc function for the IAP-APP function. So I used the CRC example inSTM32Cube_FW_F0_V1.9.0 to test. But

uwCRCValue

is always 0. I think the

uwExpectedCRCValue

should be the last four byte (0x0803FFFB-

0x0803FFFF

), and

uwCRCValue

should be the same value. Attach is the IAR configuration for CRC. Did my understanding wrong or my code below is wrong?

#define BUFFER_SIZE 114

static const uint32_t aDataBuffer[BUFFER_SIZE]

#ifdef PUBLIC_C

=

{

0x00001021, 0x20423063, 0x408450a5, 0x60c670e7, 0x9129a14a, 0xb16bc18c,

0xd1ade1ce, 0xf1ef1231, 0x32732252, 0x52b54294, 0x72f762d6, 0x93398318,

0xa35ad3bd, 0xc39cf3ff, 0xe3de2462, 0x34430420, 0x64e674c7, 0x44a45485,

0xa56ab54b, 0x85289509, 0xf5cfc5ac, 0xd58d3653, 0x26721611, 0x063076d7,

0x569546b4, 0xb75ba77a, 0x97198738, 0xf7dfe7fe, 0xc7bc48c4, 0x58e56886,

0x78a70840, 0x18612802, 0xc9ccd9ed, 0xe98ef9af, 0x89489969, 0xa90ab92b,

0x4ad47ab7, 0x6a961a71, 0x0a503a33, 0x2a12dbfd, 0xfbbfeb9e, 0x9b798b58,

0xbb3bab1a, 0x6ca67c87, 0x5cc52c22, 0x3c030c60, 0x1c41edae, 0xfd8fcdec,

0xad2abd0b, 0x8d689d49, 0x7e976eb6, 0x5ed54ef4, 0x2e321e51, 0x0e70ff9f,

0xefbedfdd, 0xcffcbf1b, 0x9f598f78, 0x918881a9, 0xb1caa1eb, 0xd10cc12d,

0xe16f1080, 0x00a130c2, 0x20e35004, 0x40257046, 0x83b99398, 0xa3fbb3da,

0xc33dd31c, 0xe37ff35e, 0x129022f3, 0x32d24235, 0x52146277, 0x7256b5ea,

0x95a88589, 0xf56ee54f, 0xd52cc50d, 0x34e224c3, 0x04817466, 0x64475424,

0x4405a7db, 0xb7fa8799, 0xe75ff77e, 0xc71dd73c, 0x26d336f2, 0x069116b0,

0x76764615, 0x5634d94c, 0xc96df90e, 0xe92f99c8, 0xb98aa9ab, 0x58444865,

0x78066827, 0x18c008e1, 0x28a3cb7d, 0xdb5ceb3f, 0xfb1e8bf9, 0x9bd8abbb,

0x4a755a54, 0x6a377a16, 0x0af11ad0, 0x2ab33a92, 0xed0fdd6c, 0xcd4dbdaa,

0xad8b9de8, 0x8dc97c26, 0x5c644c45, 0x3ca22c83, 0x1ce00cc1, 0xef1fff3e,

0xdf7caf9b, 0xbfba8fd9, 0x9ff86e17, 0x7e364e55, 0x2e933eb2, 0x0ed11ef0

}

#endif

;

static void MX_CRC_Init(void)

{

CrcHandle.Instance = CRC;

/* The default polynomial is not used. It is required to defined it in CrcHandle.Init.GeneratingPolynomial*/

CrcHandle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;

/* Set the value of the polynomial */

//CrcHandle.Init.GeneratingPolynomial = DEFAULT_POLYNOMIAL_ENABLE;

/* The size of the polynomial to configure the IP is 8b*/

CrcHandle.Init.CRCLength = CRC_POLYLENGTH_32B;

/* The default init value is used */

CrcHandle.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;

/* The input data are not inverted */

CrcHandle.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;

/* The output data are not inverted */

CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;

/* The input data are 32 bits lenght */

CrcHandle.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;

if (HAL_CRC_Init(&CrcHandle) != HAL_OK)

{

/* Initialization Error */

Error_Handler();

}

}

void APP_CRC(void)

{

/*##-2- Compute the CRC of 'aDataBuffer' ###################################*/

uwCRCValue = HAL_CRC_Calculate(&CrcHandle, (uint32_t *)&aDataBuffer, BUFFER_SIZE);

TRACE_DBG_STRING(DEBUG_MODULE, LOG_LVL_INFO, 'APP_CRC: %x,%x', uwCRCValue,uwExpectedCRCValue);

/*##-3- Compare the CRC value to the Expected one ##########################*/

if (uwCRCValue != uwExpectedCRCValue)

{

/* Wrong CRC value: enter Error_Handler */

TRACE_DBG_STRING(DEBUG_MODULE, LOG_LVL_INFO, 'CRC err');

//Error_Handler();

}

else

{

/* Right CRC value: Turn LED2 on */

TRACE_DBG_STRING(DEBUG_MODULE, LOG_LVL_INFO, 'CRC success');

}

}

Note: this post was migrated and contained many threaded conversations, some content may be missing.
    This topic has been closed for replies.

    10 replies

    Tesla DeLorean
    Guru
    January 23, 2018
    Posted on January 23, 2018 at 04:22

    Can't see attachments, but this code won't sum across the ROM

    Make sure you enable the clock, otherwise the peripheral will return zero

    /* CRC Peripheral clock enable */

    __HAL_RCC_CRC_CLK_ENABLE();
    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Treacy Yao
    Associate III
    January 23, 2018
    Posted on January 23, 2018 at 06:17

    0690X00000609SOQAY.png

    Above is the IAR for CRC configuration.

    I tried 

    __HAL_RCC_CRC_CLK_ENABLE(); but still the same result(

    uwCRCValue

    is always 0

    )

    Below is my code.

    0690X00000609LLQAY.png

    void SystemClock_Config(void)

    {

      RCC_OscInitTypeDef RCC_OscInitStruct;

      RCC_ClkInitTypeDef RCC_ClkInitStruct;

      RCC_PeriphCLKInitTypeDef PeriphClkInit;

        /**Initializes the CPU, AHB and APB busses clocks

        */

      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSE

                                  |RCC_OSCILLATORTYPE_LSE;

      RCC_OscInitStruct.HSEState = RCC_HSE_ON;

      RCC_OscInitStruct.LSEState = RCC_LSE_ON;

      RCC_OscInitStruct.HSIState = RCC_HSI_ON;

      RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;

      RCC_OscInitStruct.HSI14CalibrationValue = 16;

      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL3;

      RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;

      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

      {

        Error_Handler();

      }

        /**Initializes the CPU, AHB and APB busses clocks

        */

      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                                  |RCC_CLOCKTYPE_PCLK1;

      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

      {

        Error_Handler();

      }

      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1

                                  |RCC_PERIPHCLK_RTC;

      PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_SYSCLK;

      PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;

      PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

      {

        Error_Handler();

      }

        /**Configure LSE Drive Capability

        */

      __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

        /**Configure the Systick interrupt time

        */

      HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

        /**Configure the Systick

        */

      HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

      /* SysTick_IRQn interrupt configuration */

      HAL_NVIC_SetPriority(SysTick_IRQn, 3, 0);

    }

    static void MX_CRC_Init(void)

    {

     CrcHandle.Instance = CRC;

     /* The default polynomial is not used. It is required to defined it in CrcHandle.Init.GeneratingPolynomial*/ 

     CrcHandle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;

     /* Set the value of the polynomial */

     //CrcHandle.Init.GeneratingPolynomial = DEFAULT_POLYNOMIAL_ENABLE;

     /* The size of the polynomial to configure the IP is 8b*/

     CrcHandle.Init.CRCLength = CRC_POLYLENGTH_32B;

     /* The default init value is used */

     CrcHandle.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;

     /* The input data are not inverted */

     CrcHandle.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;

     /* The output data are not inverted */

     CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;

     /* The input data are 32 bits lenght */

     CrcHandle.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;

    __HAL_RCC_CRC_CLK_ENABLE();

     

     if (HAL_CRC_Init(&CrcHandle) != HAL_OK)

     {

      /* Initialization Error */

      Error_Handler();

     }

    }

    Treacy Yao
    Associate III
    January 23, 2018
    Posted on January 23, 2018 at 06:59

    I tried again. It is useful to add

    __HAL_RCC_CRC_CLK_ENABLE(); , I get the 

    uwCRCValue

    =ebf5058c, but the IAR tool add the CRC value in the bin file is 81539A62. It is not the same.