CC2541 串口升级CRC校验问题
时间:10-02
整理:3721RD
点击:
大家好
关于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文件时设置的吗?
补充一下问题,在设置crc函数段,为什么在crc[0]处强制写入FFFF,然后回读crc[0]和crc[1],他们就可能相等?如果强制写入FFFF,检验CRC的程序不就报错了吗?
For each image, the CRC is calculated at build-time and placed at the beginning of the SBL target image
谢谢。
