2018-01-22 06:59 PM
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 theuwExpectedCRCValue
should be the last four byte (0x0803FFFB-0x0803FFFF
), anduwCRCValue
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.2018-01-24 08:43 PM
The signing on the IAR side, and checking on the STM32 side need to be coherent. The start, end and length look reasonable.
You should perhaps stop modifying things, and make a determination about which end is broken. I would start by examining the .BIN created by IAR. And then looking at the values computed on the STM32 side.
__checksum is not defined in your code, expect should be
U32 __checksum = *((U32 *)ApplicationEndAddress);