请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC2541-Q1 工具/软件:WEBENCH设计工具
大家好。
我对 SBL 项目中的 CRC 校验和设置感到困惑。 BLE 堆栈中的 checkcrc()代码如下所示:
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) ){ 返回 false; } 如果(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); } 返回(CRC[0]= CRC[1]);
它只是判断 CRC[0]是否等于 CRC[1]。 由于没有 SBL_CALC_CRC、此功能不需要计算 CRC。
但在 Set CRC 部分中、它如下所示:
案例 SBL_ENABLE_CMD: HalFlashRead (HAL_SBL_IMG_CRC / SBL_PAGE_SIZE、 (HAL_SBL_IMG_CRC % SBL_PAGE_SIZE)<< 2、(uint8 *) CRC、sizeof (CRC); //引导加载主控方必须已验证发出 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)); } //引导加载主控方必须已验证发出 SBL_ENABLE_CMD 的额外检查。 //if (((CRC[0]== CRC[1])&&(CRC[0]!= 0xFFFF)&&(CRC[0]!= 0x0000) if (CRC[0]!= CRC[1]) { RSP = SBL_VALIDATE_FAILED; } 中断;
如果 CRC[0]不等于 CRC[1]、只需将0xFFFF 写入 HAL_SBL_IMG_CRC 并读回。 然后判断它们是否匹配。 我不知道为什么这么做。 我认为 CRC[0]和 CRC[1]回读不会改变。 为什么要再次判断? 我是否会从读取中获得不同的 CRC[0]?