This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] WEBENCH®︎工具/CC2541-Q1:在 SBL 项目中将0xFFFF 写入 CRC[0]的地址时会发生什么情况?

Guru**** 1135610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/607510/webench-tools-cc2541-q1-what-will-happen-when-write-0xffff-to-the-address-of-crc-0-in-the-sbl-project

器件型号:CC2541-Q1

工具/软件:WEBENCHRegistered设计工具

大家好。

我对 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]?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    寻求帮助~~
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    有两个 CRC、一次是在构建时生成(CRC[0])映像、另一个是在引导加载程序稍后生成(CRC[1])。
    理想情况下,这两个值应相等,然后图像有效,并且可以通过跳转到应用程序的复位矢量来运行图像:asm ("LJMP 0x0800");


    对于 SBL_ENABLE_CMD、如果 CRC 在计算 CRC 后无效、则通过向 CRC[0]写入0xFFFF 使 CRC 无效

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的帮助! 我仍然无法理解为什么在"通过向 CRC[0]写入0xFFFF 使 CRC 无效"之后、重新读取 CRC[0]和 CRC[1]并再次进行比较。 在将0xFFFF 写入 CRC[0]后、CRC[1]会改变吗?