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-Q1:在 MSPM0G3519 上下载后如何交换存储体?

Guru**** 2696775 points

Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1582317/mspm0g3519-q1-how-to-swap-banks-after-download-on-mspm0g3519

器件型号: MSPM0G3519-Q1
Thread 中讨论的其他器件: UNIFLASH

您好!

我正在尝试实现一个 OTA 更新功能、该功能通过 BLE 模块(通过 UART1)在新固件中流式传输到存储体 1 交换地址 0x00040000、然后交换存储体以从该区域执行、或者覆盖地址为 0x00000000 的固件。  通过检查存储器区域、我已验证映像是否正确写入 0x00040000、但我无法执行第 2 部分、即交换或覆盖。  交换似乎没有任何作用、并且我用于成功写入 0x00040000 的同一函数对于 0x00000000 不起作用。  下面是我的交换码似乎没有任何作用。

extern “C"_attribute__“_attribute__((section(“.bootloader_code")“)、noinline)) void bootloader_main ()
    __disable_irq();
  对于 (uint8_t i = 0;i < 8;i++){
    NVIC->FFFFFF[i]= ICER;
    NVIC->ICPR[i]= 0xFFFFFFFF;
  }

  bsp::stopApplication();

  /*
  * @param[in] waitState 要设置的等待状态数。 建议值
  *             基于系统时钟速度:
  *              - 0MHz –24MHz:0 等待状态
  *              - 24MHz –48MHz:1 个等待状态
  *              - 48MHz –72MHz:2 个等待状态
  *              - 72MHz –80MHz:3 个等待状态
  */
  DL_FlashCTL_setWaitState (FLASHCTL、(uint32_t) 1);

  //禁用缓存
  DL_CORE_configInstruction (CPUSS_CTL_ICACHE_DISABLE、CPUSS_CTL_PREFIGHT_DISABLE、CPUSS_CTL_LITEN_DISABLE);
#if 0  
  COPY_SWAP_TO_MAIN_FLASH();
  DL_SYSCTL_resetDevice (DL_SYSCTL_RESET_BOOT);
  while (1){__asm(“nop");}“}
#else
  
  //启用闪存存储体交换策略(必须在 INITDONE 之前)
  if(!DL_SYSCTL_isFlashBankSwapEnabled ()){
    DL_SYSCTL_enableFlashBankSwap ();
  }

  DELAY_CYCLES (1000);

  //从上部闪存存储体执行
  DL_SYSCTL_executeFromUpperFlashBank ();
  DELAY_CYCLES (1000);

  // 发出 INITDONE 以锁定配置并强制交换
  DL_SYSCTL_issueINITDONE ();
  DELAY_CYCLES (1000);

  //重置设备以应用交换
  DL_SYSCTL_resetDevice (DL_SYSCTL_RESET_BOOT);

  while (1){__asm(“nop");}“}
  DL_CORE_configInstruction (CPUSS_CTL_ICACHE_ENABLE、CPUSS_CTL_PREFIGHT_DISABLE、CPUSS_CTL_LITEN_DISABLE);
#endif

}

 

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

    尊敬的 Richard:

    有关 闪存多组功能 的应用手册包括一个存储体交换示例、我相信会很有帮助。

    此致、
    Brian

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

    谢谢 Brian!  本文档正是我需要的。

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

    该线程的一个相关点是。 调用 initdone 函数在 DL_SYSCTL_executeFromUpperFlashBank ();之后是否必不可少? 正常的软件复位也是有效的吗? 我的意思是应用存储体交换,它必须执行 initdone ()?

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

    尊敬的 Mehul:

    仅当 CSC 存在时、才会启用存储体交换策略。 为了执行 CSC 中的任何配置、必须发出 InitDone。

    此致、
    Brian

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

    嗨、Brian、我理解您说的意思、但 CSC 在我们执行文档中提到的步骤时起作用。 这意味着当 CSC 处于调试状态时、只有 initdone 逻辑才有效。 否则 initdone 始终找到 set。 但这在实际生产代码中并不有帮助。 在我们首次使用 uniflash 加载 CSC 及其应用程序代码时、在首次下电上电后 initdone 已被设置。 存储体交换永远不会受到影响。  

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

    嗨 Brian ,当我使用 uniflash 工具在两个存储体和存储体 1 中的应用程序中刷写 CSC 时,为什么我已经得到了 intidone 问题? 可以使用 uniflash 多编程、因此在执行该代码后永远不会执行我放置在组 1 中的应用代码。  由于 initdone 已经设置、因此永远不会发生存储体交换。 和代码尝试从主位置引导失败的情况。 如果发生存储体交换,则代码将由于存储体而运行,方法是 将存储体 1 映射交换到存储体 0。 我真的被卡住了。 是否有任何其他方法可以在不进行 initDONE 干预的情况下启用存储体交换。

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

    尊敬的 Mehul:

    要清除 initdone、 必须执行 BOOTRST 或更强的操作。 CCS 和 Uniflash 都在编程时发出 SYSRST。 在您的第一条消息中、您是否在使用调试器时看到了相同的行为? 如果您执行的是 BOOTRST 或更强、则存储体交换的条件是什么? 在设置 initdone 之前、是否有任何措施可以确保启用存储体交换并且指定每个存储体的执行?

    此致、
    Brian

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

    您好、Brian、这是日志。 代码流程如下。 开机->将新映像下载到 bank1 中的地址为 0x00054800 ->下载成功->验证->存储体交换->跳转到应用程序代码。 在日志中、您可以看到所有步骤都正常工作。 此外、还会打印从上部存储体执行的存储体交换消息。 但在重置代码之后、重新加载执行相同的操作并且不执行应用代码。 但我将应用代码放在组 0 中、那么它就可以正常工作。 这意味着存储体交换无法按预期工作。

    Firmware download successful.
    [INF] mcuboot_app[INF] Primary slot: Image not found sz ffffffff [INF] Secondary slot: version=1.2.3+0[INF] TLV Type = 10
    [INF] calculated Hash:[39][52][24][c1][8b][a8][51][94]
           [4d][d9][c9][f2][13][f5][ec][7e]
           [0f][9f][32][e3][97][36][06][5e]
           [3f][a2][e3][12][e8][2d][7b][7a]
    [INF] TLV Hash:[39][52][24][c1][8b][a8][51][94]
           [4d][d9][c9][f2][13][f5][ec][7e]
           [0f][9f][32][e3][97][36][06][5e]
           [3f][a2][e3][12][e8][2d][7b][7a]
           [20][20][20][20][20][20][20][20]
           [20][20][20][20][20][20][20][20]
           [20][20][20][20][20][20][20][20]
           [30][00][20][20][00][00][00][00]
           [00][00][00][00][01][00][00][00]
           [75][20][20][20][25][00][00][00]
           [18][00][21][20][00][04][00][00]
           [04][00][21][20][11][b0][00][00]
           [3d][b8][f3][96][57][83][00][00]
           [ed][88][00][00][20][20][20][20]
           [25][01][20][20][ff][03][00][00]
           [25][00][00][00][35][b0][00][00]
    [INF] sha256 valid
    [INF] TLV Type = 1
    [INF] KEYHASH:[INF] KEY_ID:0
    [ef][a5][73][78][e8][1e][f8][ad]
           [ec][54][b7][4d][af][8c][60][55]
           [11][56][1f][0f][47][1e][00][13]
           [80][60][cd][af][be][da][ac][79]
           [20][20][20][20][20][20][20][20]
           [20][20][20][20][20][20][20][20]
           [20][20][20][20][20][20][20][20]
           [30][00][20][20][00][00][00][00]
           [00][00][00][00][01][00][00][00]
           [75][20][20][20][25][00][00][00]
           [18][00][21][20][00][04][00][00]
           [04][00][21][20][11][b0][00][00]
           [3d][b8][f3][96][57][83][00][00]
           [ed][88][00][00][20][20][20][20]
           [25][01][20][20][ff][03][00][00]
           [25][00][00][00][35][b0][00][00]
    [INF] TLV Type = 22
    [INF] ECDSASIG:[30][46][02][21][00][a4][38][26]
           [49][68][9d][46][b9][01][2c][1a]
           [86][7e][d5][d8][1d][c9][9e][b3]
           [19][b5][b6][69][69][db][a3][f8]
           [bd][27][02][97][7d][02][21][00]
           [ff][35][d9][37][34][ab][00][88]
           [66][f1][31][3b][34][87][19][0b]
           [30][a8][47][28][0e][d6][f9][a1]
           [08][58][57][84][f0][11][6e][9c]
           [75][20][20][20][25][00][00][00]
           [18][00][21][20][00][04][00][00]
           [04][00][21][20][11][b0][00][00]
           [3d][b8][f3][96][57][83][00][00]
           [ed][88][00][00][20][20][20][20]
           [25][01][20][20][ff][03][00][00]
           [25][00][00][00][35][b0][00][00]
    [INF] Booting image from the secondary slot[INF] bootRsp: slot = 0, offset = 54800, ver=1.2.3.0[INF] Flash bank swap enabled
    [INF] Execute from upper flash
     

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

    尊敬的 Mehul:

    我相信我已经能够重新创建您在 Uniflash 和 CCS 中看到的行为。 我正在研究这一点、希望尽快为您提供解决方案。

    此致、
    Brian

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

    你好 Brian ,是的,这会有帮助。

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

    尊敬的 Mehul:

    消息:[INF]启用了闪存组交换、[INF]从上部闪存执行指示您正在成功地对非主器件进行编程、但您是否想查看存储器中的地址 0x41c00018? 如果是 0xAABBAABB、则表示您的 CSC 不存在并且存储体交换被禁用。

    您使用什么文件格式来加载图像?  我发现、从 MAIN 存储器中的位置开始加载 CSC 的二进制文件不会更新 NONMAIN、因此始终会设置 initdone。 在这种情况下、对于在组 0 中加载的初始 CSC、您是否可以尝试改用十六进制文件加载? 您仍然可以为组 1 中的 CSC、组 0 中的应用程序和组 1 中的应用程序使用二进制文件。

    此致、
    Brian

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

    你好 Brian、我检查了地址 0x41c00018。 0xAABBAABB 位于该地址。 当我刷写.out 时、Value 将为 0xffffffff。 但我们不能在组 0 中使用.out、在组 0 中不能使用.bin。 这在生产阶段听起来并不可行。  

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

    尊敬的 Mehul:

    若要仅使用二进制文件、需要为存储器的非主部分创建一个单独的二进制文件。 这可以使用十六进制实用程序工具来完成、并从链接器中排除闪存段、直到仅剩下 nonmain 部分。 还应使用 0xFFFFFFFF 在链接器的非主段中填充任何空洞。

    此致、
    Brian

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

    这意味着我们只需要创建单独的二进制文件来配置 NONMAIN? 我们没有任何其他方法可以将其添加到引导加载程序二进制文件本身中? 维护单独的文件是不合理的。  

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

    尊敬的 Mehul:

    二进制文件需要连续的存储器。 将 Main 和 Nonmain 置于同一二进制文件意味着在两者之间填充存储器。 这需要的物理存储器远多于器件上可用的存储器。 如果 main 和 NONMAIN 需要一个文件、我建议将.bin 切换到.hex、.out。 或.txt(TI_TXT 十六进制)。

    此致、
    Brian