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.

[参考译文] MSP430F5529:MSP430F5529 - SYSRIVECT 不会在引导加载程序跳转后将中断重定向到应用程序

Guru**** 2845290 points

Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1632996/msp430f5529-msp430f5529---sysrivect-does-not-redirect-interrupts-to-application-after-bootloader-jump

器件型号: MSP430F5529

您好团队:

我们正在为 MSP430F5529 开发具有以下内存布局的固件升级架构:

*引导加载程序(闪存)
*应用程序(闪存)
*下载区域 (Flash)
*使用 SYSRIVECT 重定位到 RAM 的中断矢量

-**引导加载程序**位于`0xC000– 0xFFFF`—拥有真实的 CPU 矢量表`0xFF80–0xFFFF`。
-**应用程序**`0x4400–0xBEFF`—在引导加载程序跳转到它后运行、需要自己的 Timer0_A0(1ms 周期)和 USCI_A1 中断。

引导加载程序将应用程序入口指针存储在`0xBEFE`处。 每次复位时、都会进入引导加载程序 并跳转到存储在`0xBEFE`中的地址处的应用程序。

我们使用** SYSRIVECT**(SYSCTL 寄存器)
启用后、CPU 从**RAM (0x2400)**而非闪存获取中断矢量

###实现详细信息

1.引导加载程序和应用程序是作为**单独的项目**构建的
2.两种:
  *配置计时器和 UART 外设。
  *启用中断。
3、应用:

  *对 ISR 使用`#pragma vector`
  *放置在**应用程序闪存 (~0xBE80)**中的矢量表

禁用`__ enable_interrupt ()`确认应用程序运行但没有勾号;启用它会导致崩溃。  
这表明一些中断在`0xEECE`处触发到引导加载程序的默认存根、从而执行并停止 CPU。

当引导加载程序保留实数矢量表` 0xFF80–0xFFFF `时、需要指导如何在应用程序中使用中断、或者应用程序拥有自己的中断的工作方法是什么?
如果您需要更多意见、敬请告知。

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

    您是否在程序运行时检查了 RAM 矢量表? 在启用中断的位置设置断点、并在触发中断时检查该区域。

    您没有提到其他几个关键详细信息:

    1) 应用向量地址如何进入 RAM 表? 这不会发生在魔法,他们将不得不从任何地方复制。

    2) 链接器脚本是否已更改? 通常、堆栈的起始地址位于 RAM 的顶部。 这与它用作矢量表有冲突、因此您必须更改脚本。

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

    e2e.ti.com/.../bootloader_5F00_lnk_5F00_msp430f5529.txt
    e2e.ti.com/.../application_5F00_lnk_5F00_msp430f5529.txt

    您好、David:
    附加引导加载程序和应用链接器文件。
    在应用程序中、在时钟初始化之前、向量会在 RAM 存储器中复制

    uint16_t * flash_vect =(uint16_t *) APP_VECT_TABLE_ADDR;/* 0xBE80 */
    uint16_t * ram_vect =(uint16_t *) RAM_VECT_TABLE_ADDR;/* 0x2400 */
    uint8_t i;

    __ disable_interrupt ();

    /*将全部 64 个条目从应用闪存矢量表复制到 RAM */
    对于 (I = 0;I < 64U;I++)
    ram_vect[i]= flash_vect[i];

    /*激活 RAM 矢量表 –CPU 现在将 0x2400 用于所有中断*/
    SYSCTL || SYSRIVECT;

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

    我想您应该  正确地参考此文档 www.ti.com/.../slaa600e.pdf?

    有关中断矢量的处理、您可以参考第 2.2.2 节和第 2.2.3 节  

    图 2-5 展示了应用程序中运行的中断流程  

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

    链接器脚本在 RAM 底部为永远不起作用的向量留出存储器:

    “设置 SYSCTL 中的 SYSRIVECT 位会导致中断矢量重新映射到 RAM 顶部。“

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

    是的、我们参考的是该文件。 但是、它仅提及以下与我们的用例相关的陈述:
    “请注意、某些 MSP430 MCU 支持将矢量重定向到硬件中的 RAM (SYSRIVECT)、这对于具有足够 RAM 的器件来说可能是一个很好的选择。“
    除此之外、本文档不提供任何其他详细信息、实施指南或示例。
    如果有任何信息、示例、请分享相同内容。

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

    感谢您的更新。
    我们将进行修改和验证

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果有任何信息、示例、请分享相同内容。

    可以在此处下载代码

    https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPBoot/latest/index_FDS.html