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.

[参考译文] MSPM0G3507:如何在位置0x00000000处创建辅助 BSL 并跳转到 APP

Guru**** 2457760 points
Other Parts Discussed in Thread: MSPM0G3507, MSPM0C1104

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1487720/mspm0g3507-how-to-create-secondary-bsl-at-location-0x00000000-and-jump-to-app

器件型号:MSPM0G3507
主题中讨论的其他器件: MSPM0C1104

工具与软件:

有一个美好的一天的专家,

我想在 MSPM0G3057上执行自定义次级引导加载程序、以适应我的项目、其中涉及使用进行 FOTA 更新 单个 MCU (非模型主机与目标)。
关于样例工程、我有两个问题  secondary_BSL_uart_lp_MSPM0G3507_nortos_ticlang
问题1: 我不想将引导加载程序放置在地址范围0x1000–0x3000、因为如果 MCU 在编程时复位、可能导致不可恢复的错误。 这是因为矢量 SCB 跳转到地址0x00000000处、该地址本应已被擦除以复位。
问题2: 我还担心需要修改 BCR 和 BSL 的 NONMAIN 存储器区域、并 为这些配置计算正确的 CRC 值。
您同意我的问题吗

我还有以下问题:
  1. 我如何将引导加载程序配置为驻留在地址0x00000000、以避免注册新的辅助 BSL 并允许在每次复位时轻松调用 BSL?
  2. 如何跳转到从地址0x00002000开始的应用程序? 请提供  与这些问题相关的详细步骤、文档或代码示例 . (我只简单回顾了 FLASH_BSL_LP_MSPM0C1104_nortos_ticlang 示例并且不熟悉用于跳转到应用程序的方法。)

请帮我解决问题。

谢谢、此致、
SON

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

    尊敬的 SON:

    [报价用户 id="575068" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1487720/mspm0g3507-how-to-create-secondary-bsl-at-location-0x00000000-and-jump-to-app "] 问题1: 我不想将引导加载程序放置在地址范围0x1000–0x3000、因为如果 MCU 在编程时复位、可能导致不可恢复的错误。 这是因为向量 SCB 跳转到地址0x00000000处、该地址已被擦除以复位。[/QUOT]

    为了避免这种情况、 在我们的主机演示代码中、我们将映像分为两部分、先烧录后部分、最后烧录前16个字节。( 我们仍然建议将应用程序代码放置在0x0000位置 )

    [报价用户 id="575068" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1487720/mspm0g3507-how-to-create-secondary-bsl-at-location-0x00000000-and-jump-to-app "] 问题2: 我还担心需要修改 BCR 和 BSL 的 NONMAIN 存储器区域、并 为这些配置计算正确的 CRC 值。[/QUOT]

    您需要做的是配置 BSL 入口地址。

    [报价 userid="575068" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1487720/mspm0g3507-how-to-create-secondary-bsl-at-location-0x00000000-and-jump-to-app "]如何将引导加载程序配置为驻留在地址0x00000000、避免注册新的辅助 BSL、并允许在每次复位时轻松调用 BSL?[/QUOT]

    您可以参考我们的 SDK:辅助 BSL 演示代码吗? 您可以将  BSL 入口地址更改为0x0000。 此外、还可将静态写保护从0xFFFFFF00更改为其他值。

    如何从地址0x00002000开始跳转到应用程序? 请提供  与这些问题相关的详细步骤、文档或代码示例 . (我只简单回顾了 FLASH_BSL_LP_MSPM0C1104_nortos_ticlang 示例并且不熟悉用于跳转到应用程序的方法。)

    在 BSL 代码中、 您可以在开始时检查 BSL 调用引脚是高电平还是低电平。 如果该位为高电平、则继续运行 BSL 代码。 如果该位为低电平、请使用以下代码使 PC 跳转到不同的地址。

    请参阅  FLASH_BSL_LP_MSPM0C1104_nortos_ticlang 调用检查函数

    此致、

    Zoey

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

    非常感谢您提供高质量的答案!

    我仍然不了解如何重定向中断矢量表:
    -请为我检查和测试这两个项目。 在测试期间、我可以从引导加载程序跳到应用程序、并从应用程序复位回引导加载程序。 不过、 向量表未被正确重定向 (应用程序中的定时器0不起作用、因此 LED 不闪烁)。 您能否指出我缺少什么以及为了成功重定向矢量表需要做什么? (即使我更改了 app 的 vector vTOR 的值:  scb->vTOR =(volatile uint32_t) interruptVectors;)  

    e2e.ti.com/.../gpio_5F00_toggle_5F00_output_5F00_LP_5F00_MSPM0G3507_5F00_Bootloader.rar

    e2e.ti.com/.../gpio_5F00_toggle_5F00_output_5F00_LP_5F00_MSPM0G3507_5F00_nortos_5F00_ticlang.rar

    - 我注意到,在 startup_mspm0g3507_ticlang 文件的引导加载程序, 没有 IRQHandlers 可处理中断 . 这是否意味着中断在引导加载程序中无法正常工作(与 MSP430FR 类似)? 因此、要通过 UART 进行通信、我是否必须使用轮询 UART 方法而不是中断 UART?  

       

    谢谢、此致、
    SON

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

    尊敬的 SON:

    根据我的理解、您希望在向量重定向后使用 App2的计时器处理程序。 请多多指教。

    看起来很有趣、我以前从未做过这个测试。 让我来深入探究您的代码。

    此致、

    Zoey

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

    感谢 Zoey 的回应、

    您要在向量被重定向后使用 App2的计时器处理程序

    -是的,  引导加载程序是我的 App1 、每个项目(APP1和 APP2)将有两个中断矢量表、并且两个 startup_mspm0g350x_ticlang 是相同的(仅限于此) intvecs 段 不同)。  我不想 通过 CONFIG NONMAIN 注册 App1以成为 MCU 的 BSL!

    让我来深入了解您的代码。

    -是的,我的测试代码非常简单。 我将 App1 (引导加载程序)驻留在0x0、将 App2驻留在0x3000。 我可以从 App1跳转到 App2、并从 App2重置到 App1。 今天、我向 App2添加了此命令、但没有发生中断:  DL_Interrupt_registerInterrupt (TIMA0_INT_IRQn、redirectedInterruptHandler)。

    请帮助我测试这两个项目并指出我的错误。

    谢谢、此致、
    SON

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

    请使用此代码拥有 trye2e.ti.com/.../gpio_5F00_toggle_5F00_output_5F00_LP_5F00_MSPM0G3507_5F00_Bootloader.zip

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

    我可以知道这两行代码的函数吗?

    __ asm volatile ("cpsid i":::"memory");

    _asm volatile ("MSR MSP,%0":"r"(APP_MSP):);

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

    非常感谢 Zoey、
    工作正常、计时器中断已运行!!!
    老实说、我还是不明白它为什么起作用! 这背后的原理是什么? 我将得到以下结果:

    • 应用1 :唯一的"蓝色" LED 每1秒闪烁一次。

    • 应用2. :唯一的"绿色" LED 每250毫秒闪烁一次。

    目前、在测试时、我面临两个问题:

    1) 1) 在我添加此命令之前: DL_Interrupt_registerInterrupt (TIMER_0_INST_INT_IRQN、TIMER_0_INST_IRQHandler); ,"绿色"LED 灯和"蓝色"LED 每250ms 闪烁一次(哈哈,为什么? 它应该亮起"绿色"LED  每250ms 闪烁一次)。 但是、添加 上述命令后、程序似乎可以正常工作(唯一的"绿色"LED 每250ms 闪烁一次)。 很棒、很棒!!

    这里的工作机制是什么? 我们是否需要添加此命令:  DL_Interrupt_registerInterrupt()

    2) 当我的 startup_mspm0g350x_ticlang 文件如下面的两个图像所示、计时器和中断的工作方式似乎相同(LED 每250ms 闪烁一次)。

     这是否意味着 startup_mspm0g350x_ticlang 文件不会影响程序的运行?

           

    再次感谢大家

    SON

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

    尊敬的 SON:

    说实话、我还不明白它为什么起作用! 这背后的原理是什么? 下面是我拥有的代码:

    您已使用以下代码。

    [报价 userid="575068" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1487720/mspm0g3507-how-to-create-secondary-bsl-at-location-0x00000000-and-jump-to-app/5717342 #5717342"]

    1) 1) 在我添加此命令之前: DL_Interrupt_registerInterrupt (TIMER_0_INST_INT_IRQN、TIMER_0_INST_IRQHandler); ,"绿色"LED 灯和"蓝色"LED 每250ms 闪烁一次(哈哈,为什么? 它应该亮起"绿色"LED  每250ms 闪烁一次)。 但是、添加 上述命令后、程序似乎可以正常工作(唯一的"绿色"LED 每250ms 闪烁一次)。 很棒、很棒!!

    这里的工作机制是什么? 我们是否需要添加此命令:  DL_Interrupt_registerInterrupt()

    2) 当我的 startup_mspm0g350x_ticlang 文件如下面的两个图像所示、计时器和中断的工作方式似乎相同(LED 每250ms 闪烁一次)。

     这是否意味着 startup_mspm0g350x_ticlang 文件不会影响程序的运行?

    [报价]

    根据我的理解,你不需要添加 DL_Interrupt_registerInterrupt ()

    这些结果是基于我提供的项目还是您自己的项目? App1还是 App2?

    Zoey

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

    并且、当 CPU 处于中断处理程序中时、请勿进入 App2。  

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

    感谢您的热情 Zoey、

    这些结果是基于我提供的项目还是基于您自己的项目?

    -我使用了你提供的 App1 ,它似乎程序跳正确与我当前的 App2。

    根据我的理解、您无需添加 DL_Interrupt_registerInterrupt ()

    我可以参考文档的哪个部分来了解您的情况? 和

    测试时、我使用 TimerA 在 App1和中 TimerG 在 App2中、如果不添加此命令 DL_Interrupt_registerInterrupt() 、  TIMG0_IRQHandler 在 App2中无法正常工作、以及  TIMA0_IRQHandler 在 App1中无法正常工作。 但是、当我添加该命令时、似乎两个 IRQHandlers 都在 App2中工作(只 应运行 IRQHandlers App2)。  

    我假设 Reset_Handler 在像这样进行手动跳转时、App2中的无法完全重置 CPU 配置。

    此致、

    SON

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

    尊敬的 SON:

    对不起,我不能重现你的现象。

    这里是我的测试代码(App1和 App2)、您可以试试吗?e2e.ti.com/.../E2E.zip

    此致、
    Zoey

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

    谢谢 Zoey、
    -您的固件可以很好地与当前的功能。 我也做了调整和测试,它是相当好!
    -我注意到,最重要和关键的区别在于 DL_Timer_stopCounter() 命令和 SCB->VTOR 设置(即使我已经把它添加到  Reset_Handler() 启动文件)。
    但是、如果我删除该 DL_Timer_stopCounter(TIMER_0_INST) 命令、程序将无法正常运行、从而变得无法控制。

    -根据您的理解,您能否就这个主题提供一些必须做的事或建议,尤其是当我将 FOTA 应用到一个更大的项目时,在引导加载程序和应用程序中都使用了更多的中断?

    此致、

    SON

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

    尊敬的 SON:

    删除停止计数器代码后、您在 App1中启用的 timerA 将继续计数并导致中断、但 timerA 中断处理程序已更改为默认处理程序(请参阅 App2启动文件)。 因此 MCU 将进入无限循环、并且不会切换 LED。

    我已经完成了测试、结果与我介绍的结果相同。

    此致、
    Zoey

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

    哇、非常感谢您、Zoey!
    测试用例运行得非常好、我几乎能理解 MCU 的工作原理!
    我的最后一个问题是、如果我在  Reset_Handler() 函数中添加这样的 SCB:

     这似乎没有任何影响。 这迫使我在其他地方做了许多调整、使我误解了几件事。

    谢谢、此致、
    SON

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

    尊敬的 SON:

    不需要、此代码是必需的、您需要通过此代码设置矢量中断表的偏移量。

    此致、

    Zoey