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.

[参考译文] MSPM0G3107:从引导加载程序跳转到应用程序后、计时器不工作

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1514314/mspm0g3107-timer-not-working-after-jump-to-application-from-bootloader

器件型号:MSPM0G3107

工具/软件:

我的引导加载程序位于0x0000、应用程序位于0x2000、在应用程序中、如果我使用 delayCycle、它会闪烁 LED、但当我使用计时器时、它不工作。

这是我的跳转应用程序

void jumpToNewApp (void)
  uint32_t newAppStackPointer =*((uint32_t *)(MAIN_BASE_ADDRESS));
  uint32_t newAppResetHandler =*((uint32_t *)(MAIN_BASE_ADDRESS + 4));

  NVIC_DisableIRQ (UART0_INT_IRQn);
  NVIC_DisableIRQ (TIMER_0_INST_INT_IRQN);

  //禁用中断
  __disable_irq()

  //将主栈指针(MSP)设置为新应用程序的值
  __set_msp (newAppStackPointer);

  SCB->VTOR = MAIN_BASE_ADDRESS;
  
  //跳转到新应用程序的重置处理程序
  AppEntryFunction appEntry =(AppEntryFunction)newAppResetHandler;
  appEntry ();

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

    您好、Sara:

    您可以尝试使用以下代码从引导加载程序跳转到 APP:

    __STATIC_INLINE void invokeBSLAsm(void)
    {
        /* Erase SRAM completely before jumping to BSL */
        __asm(
    #if defined(__GNUC__)
            ".syntax unified\n" /* Load SRAMFLASH register*/
    #endif
            "ldr     r4, = 0x41C40018\n" /* Load SRAMFLASH register*/
            "ldr     r4, [r4]\n"
            "ldr     r1, = 0x03FF0000\n" /* SRAMFLASH.SRAM_SZ mask */
            "ands    r4, r1\n"           /* Get SRAMFLASH.SRAM_SZ */
            "lsrs    r4, r4, #6\n"       /* SRAMFLASH.SRAM_SZ to kB */
            "ldr     r1, = 0x20300000\n" /* Start of ECC-code */
            "adds    r2, r4, r1\n"       /* End of ECC-code */
            "movs    r3, #0\n"
            "init_ecc_loop: \n" /* Loop to clear ECC-code */
            "str     r3, [r1]\n"
            "adds    r1, r1, #4\n"
            "cmp     r1, r2\n"
            "blo     init_ecc_loop\n"
            "ldr     r1, = 0x20200000\n" /* Start of NON-ECC-data */
            "adds    r2, r4, r1\n"       /* End of NON-ECC-data */
            "movs    r3, #0\n"
            "init_data_loop:\n" /* Loop to clear ECC-data */
            "str     r3, [r1]\n"
            "adds    r1, r1, #4\n"
            "cmp     r1, r2\n"
            "blo     init_data_loop\n"
            /* Force a reset calling BSL after clearing SRAM */
            "str     %[resetLvlVal], [%[resetLvlAddr], #0x00]\n"
            "str     %[resetCmdVal], [%[resetCmdAddr], #0x00]"
            : /* No outputs */
            : [ resetLvlAddr ] "r"(&SYSCTL->SOCLOCK.RESETLEVEL),
            [ resetLvlVal ] "r"(DL_SYSCTL_RESET_BOOTLOADER_ENTRY),
            [ resetCmdAddr ] "r"(&SYSCTL->SOCLOCK.RESETCMD),
            [ resetCmdVal ] "r"(
                SYSCTL_RESETCMD_KEY_VALUE | SYSCTL_RESETCMD_GO_TRUE)
            : "r1", "r2", "r3", "r4");
    }

    谢谢!

    此致

    Johnson

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

    我正在开发自定义引导加载程序。 我的计时器中断问题已通过删除解决  

       //禁用中断
       __disable_irq();   


    现在、我能够将 Boot 跳转到 App1、还可以将 App1跳转到 Boot。
    仅当我在 App1的同一地址写入不同的 App2时才会遇到问题、这时它无法正常工作



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

    您好、Sara:

    这两个应用在编译器中是否具有相同的内存配置? 如果是、我认为不应该有问题。

    谢谢!

    此致

    Johnson

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

    在两个应用程序中,只有差异是 led 麻将所有其他是相同的。 我正在生成两个.bin、只是编辑 LED 编号。

    当我通过引导加载程序代码全新刷写时、两款应用程序都能正常工作。
    例如 Boot to App1和 Boot to App2工作正常。

    引导至 App1以引导至 App2时出现问题

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

    1.通过调试器刷写引导代码。
    2.使用 UART 刷写 App1。  它确实有效。

    3.成功跳转 App1至 Boot。

    4.在引导 I 写入 App2时、此 App2无法正常工作。

    如果我在新的引导加载程序调试后写入 App2、它就能正常工作  

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

    您好、Sara:

    我个人理解如下:

    您可以使用三个映像:引导+ APP1 + APP2、并将它们一起下载到 MSPM0。

    在0x00地址引导、并且能够跳转到 AAP1或 APP2、这里没有问题。

    但是、如果您在 APP1中添加一些代码、函数将跳转到 APP2、您会遇到一些问题吗?

    谢谢!

    此致

    Johnson

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

    不、我的引导地址为0x0000、将 App1写入0x2000、跳转到0x2000、它正常工作。

    现在、我从 App1 (0x2000)跳转到 boot (0x0000)、再次运行引导代码。

    在引导模式中、我将 App2写入(0x2000)、然后再次跳转到0x2000、这不起作用。

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

    1.通过调试器刷写引导加载程序、使用 UART 写入 App1并跳转到 App1、正常工作  

    2.通过调试器刷写引导加载程序,使用 UART 编写 App2并跳转到 App2,它正常工作  

    3.通过调试器刷写引导加载程序,使用 UART 编写 App1并跳转到 App1,它工作. 接下来、我从 App1跳转到 Boot、它正在工作、接下来我编写 App2并尝试跳转、它失败

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

    您好、Sara:

    理解、您是否检查过 APP2是否通过读数正常写入?

    另一点是、不确定是 SRAM 导致了这种情况、还是某些寄存器未被清除、您可以尝试使用我在上面提供的之前代码、从引导模式跳转到应用模式。

    谢谢!

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
                NVIC_DisableIRQ (UART0_INT_IRQn);
                NVIC_ClearPendingIRQ (UART0_INT_IRQn);
                SysTick ->CTRL = 0

                SCB->VTOR =(uint32_t)(0x00000000)
                NVIC_SystemReset()


    这是两个应用相同的应用引导跳转
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
      uint32_t newAppStackPointer =*((uint32_t *)(MAIN_BASE_ADDRESS));
      uint32_t newAppResetHandler =*((uint32_t *)(MAIN_BASE_ADDRESS + 4));

      NVIC_DisableIRQ (UART0_INT_IRQn);
      NVIC_ClearPendingIRQ (UART0_INT_IRQn);
      SysTick ->CTRL = 0

      //__ disable_irq ();

      //将主栈指针(MSP)设置为新应用程序的值
      __set_msp (newAppStackPointer);

      SCB->VTOR =(uint32_t)(MAIN_BASE_ADDRESS);
      
      //跳转到新应用程序的重置处理程序
      AppEntryFunction appEntry =(AppEntryFunction)newAppResetHandler;
      appEntry ();



    这是引导至应用程序跳转。 两个应用我都在写入0x2000
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    App1和 App2只是我的软件版本变更

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

    我未在 SDK 示例中使用 bootloader proveded。 我编写的引导加载程序代码使得它仅通过 UART 接收.bin、并在闪存中写入0x2000、而不使用 BCR 和 MSPM0的 BSL 配置

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

    您好、Sara:

    就只是非常一般的软件引导加载程序。 让我与团队核实一下是否有什么想法、然后回到这里。

    谢谢!

    此致

    Johnson

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

    此问题已解决、我无法正确擦除闪存。  

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

    看起来不错。 很棒!