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.

[参考译文] MSPM0G3519:POR 不会复位 INITDONE

Guru**** 2895600 points

Other Parts Discussed in Thread: MSPM0G3519

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1625739/mspm0g3519-por-does-not-reset-initdone

器件型号: MSPM0G3519

我使用定制电路板上的 TI MCUBoot 端口 (CSC) 和 MSPM0G3519 MCU。 擦除辅助闪存组并向其刷写新映像后、我使用调用 DL_SYSCTL_resetDevice (DL_SYSCTL_RESET_POR) 发出上电复位。 根据文档和论坛帖子、这将清除 INITDONE 并允许引导加载程序交换闪存组、但 INITDONE 不会被 POR 清除。 是否有其他一些因素可能影响 INITDONE 复位失败? 可以采取哪些额外步骤来确保清除?  

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

    您好 Aaron、

    高于 BOOT RESET 的复位电平(包括引导复位和 POR 复位)都可以复位 INITDONE。

    您是否为您的 CSC 解决方案启用了 NONMAIN 中的 CSCTLISTS 和 FLASHBANKSWAPPOLICY 字段? 应启用这两个字段以启用 CSC 过程、  有关更多详细信息、请参阅 MSPM0 MCU 中网络安全机制的 3.2.4.3 CSC NONMAIN 配置第 5 点(修订版 A)。

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

    您好 Pengfei:

    CSCSCEXISTS 和 FLASHBANKSWAPPOLICY 均启用。 我在进入 CSC 时没有遇到问题、我永远不会看到 INITDONE 被 POR 清除。 我通过 UART 看到引导加载程序的日志、 DL_SYSCTL_isINITDONEISSUED () 在发出 POR 后始终返回 TRUE、SECSTATUS 的值始终为 0x1。 当我在主应用程序中运行并且调用 DL_SYSCTL_isExecuteFromUpperFlashBank () 时、无论两个闪存组中有什么映像版本、它总是返回 FALSE。 我在下面添加了我的 CSC 主应用程序。 是否需要启用一些额外的配置来解锁 INITDONE 标志? 是否存在一些可能的硬件问题、导致 MCU 停止完成复位并清除 INITDONE 标志?



    CSC 主服务器

    内部 main (void)

    uint8_t done = 0;
    FIH_int bootStatus;
    结构 boot_rsp bootRsp;
    SYSCFG_DL_init ();
    MCUBOOT_LOG_INF(“starting bootloader\r\n“);

    /*特权状态的执行流程。 器件没有功能、但
    *静态写保护已启用,且图像未经验证,和
    因此,必须进行身份验证。
    */
    MCUBOOT_LOG_INF(“Checking initdone\r\n“);
    if(!DL_SYSCTL_isINITDONEISSUED ()){
    /*首次引导 — 在 INITDONE 之前确定要从哪个存储体执行并配置存储体交换*/
    MCUBOOT_LOG_INF(“首次引导 — 确定组选择\r\n“);
    boot_return_master_version (&bootRsp);
    bootStatus = boot_go (&bootRsp);

    if ((0 == bootStatus)&&(image_magic == bootRsp.br_hdr->ih_magic)){
    MCUBOOT_LOG_INF(“Image found:offset = 0x%x、ver=%d.%d.%d\r\n“、
    bootRsp.br_image_off、
    bootRsp.br_hdr->ih_ver.iv_major、
    bootRsp.br_hdr->ih_ver.iv_minor、
    bootRsp.br_hdr->ih_ver.iv_revision、
    bootRsp.br_hdr->ih_ver.iv_build_num);

    /*在 INITDONE 之前配置存储体交换*/
    if (bootRsp.br_image_off!= PRIMARY_SLOT_OFFSET){
    MCUBOOT_LOG_INF(“为上部闪存组配置组交换\r\n“);
    DL_SYSCTL_executeFromUpperFlashBank ();
    }其他{
    MCUBOOT_LOG_INF(“配置下部闪存组(无交换)\r\n“);
    DL_SYSCTL_executeFromLowerFlashBank ();
    }
    }

    /*设置防火墙(在 INITDONE 时启用)*/
    DL_SYSCTL_setWriteProtectFirewallAddrRange (
    (uint32_t) lockable_flash_firewall);

    MCUBOOT_LOG_INF(“发出 INITDONE\r\n“);
    DL_SYSCTL_issueINITDONE ();
    }

    /* INITDONE 之后 — 从配置的组引导*/
    MCUBOOT_LOG_INF(“initdone is set\r\n“);

    MCUBOOT_LOG_INF(“mcuboot_app\r\n")“);
    boot_return_master_version (&bootRsp);

    bootStatus = boot_go (&bootRsp);
    MCUBOOT_LOG_INF(“BOOT_GO returned %d\r\n“、bootStatus);
    if ((0 == bootStatus)&&(image_magic == bootRsp.br_hdr->ih_magic)){
    MCUBOOT_LOG_INF(“bootRsp: slot =%x、offset =%x、ver=%d.%d.%d\r\n“、
    BootStatus、bootRsp.br_image_off、
    bootRsp.br_hdr->ih_ver.iv_major、
    bootRsp.br_hdr->ih_ver.iv_minor、
    bootRsp.br_hdr->ih_ver.iv_revision、
    bootRsp.br_hdr->ih_ver.iv_build_num);

    /*确定我们从哪个银行执行*/
    uint32_t EXECUTING_BANK;
    if (bootRsp.br_image_off!= PRIMARY_SLOT_OFFSET){
    MCUBOOT_LOG_INF(“从上部闪存组执行(交换后)\r\n“);
    EXECUTING_BANK = 1;
    }其他{
    MCUBOOT_LOG_INF(“从下部闪存组执行\r\n“);
    EXECUTING_BANK = 0;
    }

    uint32_t CURRENT_VERSION = bootRsp.br_hdr->ih_ver.iv_major << 24 |
    (bootRsp.br_hdr->ih_ver.iv_minor << 16)|
    (bootRsp.br_hdr->ih_ver.iv_revision << 8);
    //在签名的 LSB 中编码银行编号
    uint32_t signature_with_bank =(signature & 0xFFFFFFFE)|(EXECUTING_BANK & 0x1);
    MCUBOOT_LOG_INF(“将版本信息写入闪存:版本 0x%08x、签名 0x%08x(组%d)、地址 0x%x\r\n“、
    CURRENT_VERSION、SIGNATURE_WITH_BANK、EXECUTING_BANK、FLASH_ADDR_FIRMWARE_VERSION);
    //将当前执行组写入两个组以实现冗余
    write_version_info_to_flash (current_version、signature_with_bank、true);
    WRITE_VERSION_INFO_TO_FLASH (CURRENT_VERSION、SIGNATURE_WITE_BANK、FALSE);

    }其他{
    MCUBOOT_LOG_ERR(“Boot Go Faile\r\n“);
    mcubootFail();
    }
    do_boot (&bootRsp);
    //永远不会到达这里
    mcubootFail();
    }

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

    经过一些额外的调查后、我看到 CSCSCEXISTS 在 SECSTATUS 中始终为零。 我在 syscfg 中启用了 CSCSCEXISTS、并在生成的 boot_config.c 文件中看到 cscexists 设置为 0xFFFF。 但是、当我使用存储器查看器查看 41c00018 时、它设置为 0xaabb、这表示 CSC 不存在。 我还在 CSC 工程的步骤中看到、当使用 objcopy 创建 bin 时、.bCRConfig 和.BSLConfig 会被删除。 当我将 objcopy 步骤更改为不删除 BCRConfig 和 BSLConfig 时、输出箱的大小变为 1Gb、无法使用。

    objcopy 步骤删除 BSL 和 BCR
    C:/ti/ccs2041/ccs/tools/compiler/ti-cgt-armllvm_4.0.4.LTS/bin/tiarmobjcopy customer_secure_code_meting_prod.out -R .bcrConfig -R .BSLConfig -R .TI.bound*-- output-target 二进制 customer_secure_code_metering_prod-bank1-0x40000.bin

    我的 boot_config.c(内部版本未使用)

    place_in_memory(“.bCRConfig")“)
    const BCRConfig =
      .bcrConfigID      = 0x4000000
      .debugAccess      = BCR_CFG_DEBUG_ACCESS_EN、
      swdpMode       = BCR_CFG_SWDP_EN
      .tifaMode       = BCR_CFG_TIFA_EN
      .bslPinInvokeEnable = BCR_CFG_BSL_PIN_INVOKE、
      .staticWriteProtectionMainLow = CFG_default_value、
      .staticWriteProtectionMainHigh = CFG_DEFAULT_VALUE、
      .staticWriteProtectionNonMain = BCR_CFG_NON_MAIN_STATIC_PROT_DIS、
      debugHold       = BCR_CFG_DEBUG_HOLD_DIS、
      .CSCS 存在       = BCR_CFG_CSC_EXSE、
      .flashBankSwapPolicy = BCR_CFG_FLASH_BS_EN
      .fastBootMode     = BCR_CFG_FAST_BOOT_DIS、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Aaron、

    感谢对此问题的调查和信息。

    因此、您意味着您使用.bin 格式下载包含 NONMAIN (.brconfig 和.blConfig) 内容的固件、并发现相应的配置没有正确加载到 MCU 闪存中?

    实际上、当.bin 格式是固件中集成的 NONMAIN 内容时、不建议使用该格式。 由于.bin 格式没有地址信息、因此默认情况下、0x41C00000 地址中的 NONMAIN 内容将紧跟在应用程序固件之后。 如果您只指定了孔洞期间的填充数据、则会生成一个 GB 大小的文件来填充应用程序和 0x41C00000 之间的孔洞。

    因此、有一些方法可以解决这个问题:

    • 使用具有地址信息(例如固件)的格式、例如.hex、.txt。
    • 如果.bin 文件是硬性要求、则需要将应用程序固件和 NONMAIN 内容分开。 您应该能够在当前.bin 文件中找到 NONMAIN 内容、并且可以将它们导出并与单个.bin 文件存储在一起。