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.

[参考译文] MSP430FR2475:INTR 引导

Guru**** 2350610 points
Other Parts Discussed in Thread: MSP430FR2476, MSP430FR2475
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1012794/msp430fr2475-intr-vectoring

器件型号:MSP430FR2475
主题中讨论的其他器件:MSP430FR2476

我们正在编写自己的引导加载程序、以确保我们能够控制器件。 我们正面临一个问题、想知道您是否可以查看以下内容;

 

加电后执行引导加载程序。

其中断向量从 FRAM (0xFF80–0xFFFF)复制到 RAM 顶部(0x2F80–0x2FFF)

堆栈指针将从0x2F7F 开始、因此它不会干扰 RAM int vect。

 

之后、我们通过设置将中断矢量重定位到 RAM:

/*使用 ram interupt 向量*/

 SYSCTL |= SYSRIVECT;

 

现在、唯一已启用的中断是 UART 中断。

 

我们的问题是、一旦触发中断(我们接收到一个字节)、程序就会进入林中并由于看门狗而复位。

 

如果我们不重新定位到 RAM VECT、程序工作正常、但在加载应用程序并将其中断矢量更改为 RAM 顶部时、我们仍然遇到相同的问题。

 

下面是有趣的事情:

如果我们使用开发板(带有 MSP430FR2476芯片),并将中断矢量重新定位到 RAM 的顶部(0x3F80–0x3FFF),它就可以正常工作! 堆栈指针仍在0x2F7F 中工作。

对于此设计、引导加载程序工作完美、应用程序加载并正确执行。

 

MSP430FR2475中是否存在异常、或者 RAM 中断矢量是否位于另一个位置?

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

    您好 Ian、

    是的、MSP430FR2475的 RAM 比 MSP430FR2476小。 请查看表6-31。 器件数据表中的存储器组织、以查看此比较并获取 MSP430FR2475的 RAM 的起始地址。 因此,您可能需要调整代码中的某些重定向以符合要求。

    现在、对于您的定制引导加载程序、您是否从 MSPFRBOOT 开始MSPFRBOOT 应用手册 、因为我们的解决方案可为您提供引导加载程序和应用程序切换。 如果您尝试从头开始执行此操作、这可以节省大量时间、因为您只需要自定义此操作。 您也不必在 RAM 中执行此操作、也可以重定向到 FRAM 的另一个部分。  

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

    感谢您的回答。

    我们已经制定了一个权变措施、在该措施中、我们使用的方法适用于 MSP430、因为 MSP430中没有能够将中断矢量重新定位到 RAM 顶部的位。

     如前所述、我们可以重新定位 MSP430FR2476的矢量

    1. 读取 DEVICE_ID 以验证我们是否在 MSP430FR2476上运行
    2. 将0x3FFF RAM 顶部用于中断矢量(将0xFF80-0xFFFF 复制到0x3F80-0x3FFF)
    3. 将堆栈指针设置为0x2F7F、并在我们启动调试器时进行验证。
    4. 设置 sysctl |= SYSRIVECT

     如果我们在 MSP430FR2475上执行此操作并执行此操作:

    1. 读取 DEVICE_ID 以验证我们是否在 MSP430FR2475上运行
    2. 将0x2FFF RAM 顶部用于中断矢量(将0xFF80-0xFFFF 复制到0x2F80-0x2FFF)
    3. 将堆栈指针设置为0x2F7F、并在我们启动调试器时进行验证。
    4. 设置 sysctl |= SYSRIVECT

    当一个中断发生时、程序命中一个非法地址。

     那么、问题是为什么呢?

    我可以看到两个可能的原因:

    1. MSP430FR2475不支持中断向量的重定位
    2. MSP430FR2475将其 RAM 中断矢量放置在另一个位置

     当然、也可能有其他人、但是否有人可以验证它是否可以正常工作?

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

    您好 Ian、

    我很高兴您能在他的时间内找到解决方法。

    这应该是可行的。 我不确定这里会出现什么问题。 这不是常见的用例、因此需要一些时间深入研究。 您是否有一个示例项目、您可以用最少数量的代码共享该问题? 这将极大地帮助加快调试速度。

    平均而言、我将在我的身边做一些研究、但这将是一周的最后一周、然后我才能回到您的身边。

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

    Ian、

    到目前为止、我的调查还没有取得多大的成功。 我确实发现不同器件系列中存在以下内容、但某些相同的原则可能适用。 虽然此器件不处理 RAM 边界、例如所链接的确切情况、但确保链接器文件不包括 RAM 的这一部分仍有一些好处。 请告诉我这是否有帮助。  

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

    再次感谢您的帮助、我们不胜感激。

     是的、我们知道我们需要更改链接器描述符文件。

    我们对 MSP430FR2475.xcl 文件进行了以下修改、以确保堆栈指针从正确的空间开始

     

    //--------------------------------------------------------

    // RAM 内存

    //

    -Z (DATA) TINYRAM=0006-001F

    -Z (data) DATA16_I、DATA16_Z、DATA16_N、TLS16_I=2000-2F7F

    -Z (data) code_i

    -Z (data) DATA20_I、DATA20_Z、DATA20_N

    -Z (data) CSTACK+_STACK_SIZE#

     

    运行时、我们将应用程序 int 矢量(我们放置在 FFA2-FFFF 处)复制到(2FA2-2FFF)。 我们已验证此副本是否正确。

    然后、我们设置重定位位。

    我们还验证了2FA2-2FFF 在程序进入林中后未损坏。 堆栈指针未触及此区域。

     如果我们对 MSP4302476进程执行完全相同的操作、但将运行时副本更改为3FA2-3FFF、则它会平稳运行。 请注意、我们使用相同的链接器描述符文件、这意味着 stackpointer 仍从2F7F 开始

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

    有趣。 您能否执行 快速测试? 您能否使用正常工作但为 FR2475编译而不更改 FR2475 RAM 边界的 MSP430FR2476项目?  这应该会由于超出 RAM 范围而失败、但如果不这样做、它会为问题提供另一个数据点。  

    您是否愿意在此处共享项目的版本?  

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

    此主题已脱机讨论、但要跟进更新:

    MSP430FR2475中的 RAM 空间被错误地定义为4KB、本应为6KB。

    实际地址从 2000h 变为 37FFh。

    数据表已更新、链接器文件将在 CCS 和 IAR 中更新。

    同时、以下是一个更新的链接器文件:

    e2e.ti.com/.../3835.lnk_5F00_msp430fr2475.cmd

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

    感谢您的更新。 我们一轮地开展了一项工作,但这似乎解释了我们所面临的问题。

    我们将进行测试并告知您

    谢谢