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.

[参考译文] MSP432E401Y:从应用程序调用 ROM 引导加载程序

Guru**** 2558250 points
Other Parts Discussed in Thread: MSP432E401Y

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/905534/msp432e401y-invoking-rom-bootloader-from-application

器件型号:MSP432E401Y

是否有办法从应用程序启动内部 ROM 引导加载程序并使其继续运行以进行固件更新?

我已经能够通过0x1000004的向量启动 ROM 引导加载程序、但当它执行时、应用程序会重新启动。

ROM 引导加载程序看到0x0000004处的矢量已编程、并且 BOOTCFG 中定义的引脚未置位、因此它会再次启动应用程序。

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

    您好!

    您的意思是"它是否继续运行以进行固件更新?"

     是否要在完成更新应用程序后使 BSL 保持运行?

    您能告诉我您的应用吗? 由于 ROM 是固定的、我认为您无法意识到。 也许您可以在闪存:http://dev.ti.com/tirex/explore/node?node=AFExyN9Ym1DsibDJ5oM3oQ__J4.hfJy__LATEST 中尝试引导加载程序

    伊斯天

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

    我不希望 ROM 引导加载程序在启动时自动分支到应用程序。  它应该等待波特同步字符接受新固件。

    当我在0x1000004调用 ROM 引导加载程序时、它会检测到应用程序并立即重新启动、而不允许执行固件升级。

    我可以使用 BOOTCFG 中定义的 GPIO 启动 ROM 引导加载程序、我正在寻找一种从应用程序以编程方式执行相同操作的方法。

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

    您是说、进入应用程序时、您想使用 GPIO 引脚启用 ROM 引导程序以等待波特同步字符接受新固件吗?

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

    这是一个非常典型的情况。

    应用固件正在运行。

    用户希望升级到新固件。

    应用程序启动引导加载程序。

    引导加载程序加载新固件。

    重新启动设备并运行新固件。

    我无法实现这一点、因为引导加载程序只会重新启动应用程序、而不是处理固件升级。  我希望引导加载程序等待串行接口上的新代码、而不是启动旧应用程序。

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

    我想您可以混合使用引导模式和引导加载程序。 您是说将堆栈指针和复位向量指针设置为0x01000000和0x01000004后、引导加载程序不会等待您发送新的应用程序代码吗?

    实际上、我找不到引导加载程序会在本文档 中检查0x0000004处的内容:http://www.ti.com/lit/ug/slau746a/slau746a.pdf?&ts=1589869324425

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

    您好、伊斯天、

    我不知道如何描述这一点。  我认为我的信息非常清楚。  您正在阅读的文档是指基于闪存的引导加载程序、它仅包含一个描述 ROM 引导加载程序默认引脚配置的小部分。  下面是技术参考手册中介绍 ROM 引导加载程序启动的部分。

    现在、考虑当应用程序以编程方式启动引导加载程序时会发生什么情况。  此逻辑运行且应用程序重新启动、因此不可能使用引导加载程序上载新固件。

    ROM 引导加载程序可满足我的所有需求、因此我尝试避免使用基于闪存的引导加载程序。  我只想启动 ROM 引导加载程序并上传新固件。  

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

    感谢您的耐心等待。 我现在非常清楚 RAM 引导加载程序。 我将关闭线程。

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

    请勿关闭此主题。  我现在已经解释了这个问题,但没有解决办法。

    是否可以像我所描述的那样使用 ROM 引导加载程序来更新固件?

    当我从应用程序调用 ROM 引导加载程序时、如何防止 ROM 引导加载程序重新启动旧应用程序?

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

    我认为你可以。

    我必须声明、检查0x00000004地址的引导代码不是引导加载程序而是引导加载程序。 您无法通过存储器地址访问引导代码。

    您可以查看此主题以了解更多信息: https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/777879?tisearch=e2e-sitesearch&keymatch=MSP432E%252520ROM%252520bootloader

    当我检查闪存引导加载程序时、它将继续等待主机。 我建议您尝试一下。

    伊斯天

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

    我不理解您在"引导代码"和"引导加载程序"之间的区别。  您再次突出显示的文本进一步解释了我的观点、即引导加载程序不会运行并等待代码。

    我已经阅读了您链接的主题。  如果您按照此步骤操作、这是一个具有 SPI 接口的用户、最后您可以看到他的设置有问题。  我说过我正在使用 UART 接口、并且已经使用 GPIO 调用方法成功运行固件升级。  这意味着我已正确实施了协议并成功进行了通信。   此主题与我的问题无关。

    你让我"试一下"。  您认为我没有尝试过这种方法吗?  我花了几天时间来解决这个问题、寻找解决方案。  我已经用汇编语言手动逐步介绍了引导加载程序、以查找解决方案。  你试过吗?

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

    实际上、有一个解决方案。 经过几个小时的实验、我找到了一种防止 ROM 引导加载程序重新启动应用的方法。

    在应用中、将 BOOTCFG 寄存器中配置的引脚设置为输出、并将输出设置为保持 ROM 引导加载程序运行所需的状态。

    然后直接调用 ROM 引导加载程序条目向量。 GPIO 引脚将被读取为处于保持 ROM 引导加载程序处于活动状态所需的状态。 上载新固件后、正常复位会导致 GPIO 返回到输入、新应用程序启动。

    代码如下所示:

    空 StartROMBootloader (空)

    /*关闭时钟*/
    SysTickIntDisable();
    SysTickDisable();

    /*为引导引脚启用 GPIO 外设*/
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD)){}

    /*将引导引脚设置为输出*/
    GPIOPinTypeGPIOOutputOD (GPIO_PORTD_BASE、GPIO_PIN_2);

    /*设置引导引脚的状态以强制 ROM 引导加载程序运行*/
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、0);

    /*禁用所有处理器中断。 而不是逐个禁用它们
    *时间、执行到 NVIC 的直接写入来禁用所有外设
    *中断。 *
    NVIC->icer[0]= 0xffffffff;
    NVIC->icer[1]= 0xffffffff;
    NVIC->icer[2]= 0xffffffff;

    /*执行 ROM 引导加载程序*/
    (*(void (*)(void))(*(uint32_t *) 0x1000004))();


    如果引脚也连接到外部元件、请确保在驱动输出时不会导致电气短路。 在本例中、我将使用接地开关、因此我有一个外部上拉电阻器、并将输出配置为开漏。 在此配置中、开关或 MSP 都可以将线路拉至低电平、而不会导致短路。

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

    引导代码用于初始化。 当 MCU 上电时、 它是将运行的第一个代码、例如初始化、IP 保护、判断是否进入引导加载程序等 这部分代码不应由用户直接访问程序计数器。Bootloader 是用于固件更新或擦除的代码、可由程序计数器访问。

    从 UG 中可以看到、我认为跳转到0x010000004是在引导代码处发生的、而不是在 MSP430中设计的引导加载程序中发生的。 这就是我希望你尝试一下的原因。  关于使用 SPI 接口的链接、您可以找到一个 TI 员工说闪存引导加载程序中的代码与 ROM 引导加载程序相同。 这就是为什么我说当您进入 ROM BooloLoader 时、在我检查闪存引导加载程序后、它应该一直等待通信。 那么、我进行假设。 昨天、我借了一个 LaunchPad 并尝试了、如果有应用程序、它将直接进入应用程序、这对客户来说是不熟悉的。

    我还尝试查找有关 ROM 引导加载程序内容的更多信息、但找不到任何内容。 我咨询负责 MSP432Exx 引导加载程序的软件团队成员、她只能找到用户指南。  

    很抱歉、感谢您解决此问题。

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

    尊敬的 Rob:

    我认为这是一个好的解决方案! 感谢您的分享。

    BR

    Markus