大家好
关于SBL升级中CRC两个字节目前感到很困惑。checkcrc代码:
static uint8 checkRC(void) { uint16 crc[2]; HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE, (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, HAL_FLASH_WORD_SIZE); if ((crc[0] == 0) || (crc[0] == 0xFFFF)) { return FALSE; } if (SBL_CALC_CRC && (crc[0] != crc[1])&& (crc[1] == 0xFFFF)) { crc[1] = calcCRC(); crc[0] = 0xFFFF; while (!HalAdcCheckVdd(VDD_MIN_NV)); HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1); HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE, (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, HAL_FLASH_WORD_SIZE); } return (crc[0] == crc[1]); }
根据代码,工程设置中定义“xSBL_CALC_CRC”所以计算CRC这部份略过,这里没问题。下面还有设置CRC的代码:
case SBL_ENABLE_CMD: HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE, (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc)); // Bootload master must have verified extra checks to be issuing the SBL_ENABLE_CMD. //if ((crc[0] != crc[1]) && (crc[0] != 0xFFFF) && (crc[0] != 0x0000)) if (crc[1] != crc[0]) { crc[1] = crc[0]; crc[0] = 0xFFFF; HalFlashWrite(HAL_SBL_IMG_CRC, (uint8 *)crc, 1); HalFlashRead(HAL_SBL_IMG_CRC / SBL_PAGE_SIZE, (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE) << 2, (uint8 *)crc, sizeof(crc)); } // Bootload master must have verified extra checks to be issuing the SBL_ENABLE_CMD. //if ((crc[0] == crc[1]) && (crc[0] != 0xFFFF) && (crc[0] != 0x0000)) if (crc[0] != crc[1]) { rsp = SBL_VALIDATE_FAILED; } break;
这里实在烧入固件后,从固定地址0x890和0x891中读取crc[0]和crc[1]。问题在于,刚刚烧录完成的固件中,这两个地址处一定是crc判断的地方吗?是编译器编译bin文件时设置的吗?