器件型号:MSP432E401Y
是否有办法从应用程序启动内部 ROM 引导加载程序并使其继续运行以进行固件更新?
我已经能够通过0x1000004的向量启动 ROM 引导加载程序、但当它执行时、应用程序会重新启动。
ROM 引导加载程序看到0x0000004处的矢量已编程、并且 BOOTCFG 中定义的引脚未置位、因此它会再次启动应用程序。
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 引导加载程序并使其继续运行以进行固件更新?
我已经能够通过0x1000004的向量启动 ROM 引导加载程序、但当它执行时、应用程序会重新启动。
ROM 引导加载程序看到0x0000004处的矢量已编程、并且 BOOTCFG 中定义的引脚未置位、因此它会再次启动应用程序。
您好!
您的意思是"它是否继续运行以进行固件更新?"
是否要在完成更新应用程序后使 BSL 保持运行?
您能告诉我您的应用吗? 由于 ROM 是固定的、我认为您无法意识到。 也许您可以在闪存:http://dev.ti.com/tirex/explore/node?node=AFExyN9Ym1DsibDJ5oM3oQ__J4.hfJy__LATEST 中尝试引导加载程序
伊斯天
我想您可以混合使用引导模式和引导加载程序。 您是说将堆栈指针和复位向量指针设置为0x01000000和0x01000004后、引导加载程序不会等待您发送新的应用程序代码吗?
实际上、我找不到引导加载程序会在本文档 中检查0x0000004处的内容:http://www.ti.com/lit/ug/slau746a/slau746a.pdf?&ts=1589869324425
您好、伊斯天、
我不知道如何描述这一点。 我认为我的信息非常清楚。 您正在阅读的文档是指基于闪存的引导加载程序、它仅包含一个描述 ROM 引导加载程序默认引脚配置的小部分。 下面是技术参考手册中介绍 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 引导加载程序的软件团队成员、她只能找到用户指南。
很抱歉、感谢您解决此问题。