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.

[参考译文] MSP430FR5994:使用自定义引导加载程序进行 WDT 复位失败。

Guru**** 2560390 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1009142/msp430fr5994-wdt-reset-failes-with-custom-bootloader

器件型号:MSP430FR5994

大家好、  

我已经基于自定义引导加载程序和主应用程序为 MSP430FR 微控制器开发了一个应用。 加电时、引导加载程序会验证是否存在固件升级请求、如果没有、则会启动主应用程序。 如果用户想要升级固件(在主应用程序运行时)、则应用程序会自行复位并启动引导加载程序。

如果复位由软件 BOR 完成、则一切正常。 另一方面、如果通过使用 WDT 复位来完成复位、则应用程序会中断某些未知状态/地址。 当然、我需要在应用程序中使用 WDT 功能、而不仅仅是固件升级。

在触发 WDT 复位之前、我已经验证了复位矢量(0xFFFE)内容、它显然是引导加载程序入口点。

如果我从仅运行主应用 程序的工程中完全删除引导加载程序、则 WDD 复位会按预期工作、始终复位到主应用程序入口点。

您对问题可能出在哪里有什么想法/建议吗?

提前感谢您的帮助。  

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

    您好!

    您是否将 MSP430FRBOOT 用于自定义引导加载程序? 查看 App1_MSPBoot_FR5994_UART 项目、 TI_MSPBoot_JumpToBoot()函数在'main1.c'中的端口5 ISR 中调用。 该函数在"TI_MSPBoot_Mgr_Vectors_FR59xx.c"中定义、并执行软件 BOR 以从应用模式切换到引导模式。

    void TI_MSPBoot_JumpToBoot( void )
    {
        PassWd = BSL_PASSWORD;      // Send password
        StatCtrl |= BOOT_APP_REQ;   // Set flag to request boot mode
        __disable_interrupt();      // Disable all interrupts
        // Force a Software BOR
        PMMCTL0 = PMMPW | PMMSWBOR;
        while (1)
            ;
    
    }

    在 MSPBoot_FR5994_UART 项目中,'boot.c'初始化栈并调用 main_boot()函数来启动引导加载程序。 如果您使用 WDT 复位、很可能引导代码未执行、这可能是您发现此问题的原因。

    另一个想法是确保您的 CCS 项目设置已禁用存储器保护单元(MPU)。

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

    尊敬的 James:

    感谢你的帮助。 这确实是一个与 MPU 相关的问题。 快速解释一下、这对于将来面临相同问题的用户非常有用。

    MSP UC 的 MPU 能够保护 FRAM 的某个区域、从而防止代码执行。 假设出现以下情况:
    -主代码和引导加载程序都有自己的"起始地址"。
    -主代码执行后、MPU 会在主代码的起始地址之前保护存储器地址。
    -这意味着在主代码的起始地址之前不允许执行代码。
    -请注意,此 MPU 配置是由编译器自动完成的!

    BOR 和 WDT 复位在 MPU 配置方面的表现不同:

    -在 BOR 复位的情况下、所有 MPU 限制都是临时禁用的、这说明了为什么一切都正常工作以及引导加载程序(即使在主代码起始地址之前有自己的代码)正确运行的原因。
    -如果 WDT 复位、MPU 保护仍然存在、引导加载程序保持冻结。

    这里的解决方案是使用 MPU 寄存器。 MPUSEGBx 寄存器允许用户定义 MPU 限制有效的存储器区域。 无论 BOR 或 WDT 复位、都要正确设置这些寄存器、但引导加载程序似乎始终正常工作。

    希望这能有所帮助。

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

    您好、Antonio、

    真是个好消息。 感谢您的介绍以及分享这种详细的总结。