MSP430FR6047: 程序跑飞

Part Number: MSP430FR6047

当我多次调用USS_startLowPowerUltrasonicCapture函数时,程序会直接死机,调用周期为30msimage.png

  • 据我分析造成原因是由于软件看门狗复位,真正卡死的地方在这里

  • 感谢您对TI产品的关注。
    我们正在核实您的问题,请等待我们的答复。

  • 准确来看是调用这个函数导致USS_runAlgorithms,当我屏蔽掉这个函数后,程序均能正常运行

  • 我是替换了uss的所有库文件后,重新排查发现的此问题,当前死机的地方如下图

  • 更新一下我最新的进展,根据我的重新测试,因为我重新更新了我都IAP程序方式见MSP430FR6047: IAP升级问题 - MSP 低功耗微控制器论坛 - MSP 低功耗微控制器 - E2ETm 设计支持,使用此方式我其他所有的中断和应用程序都正常,唯独存在上诉问题。当我取消IAP,即不使用RAM中断向量的地址,更改回0xff80-0xffff中执行时,上诉问题消失

  • 您好 请问有进展了吗 我这边比较着急这个问题

  • 您好

    下面的帖子也提到了一个类似的问题,即卡在 commonWaitForconversion 函数中,请注意中断向量设置,并检查一些硬件问题。

    CCS/MSP430FR5043:设备初始化期间挂起

  • 这篇帖子并没有帮到我什么,我使能RAM中断向量时就会导致这个问题,但我明确对比了生成时存储的中断地址的数据与我拷贝到0x3b80-0x3bff这个区间是一致的

  • 您好

    由于客户已经发现根本原因主要是 MSP430FR6047 中的中断向量重定向到 RAM,以下帖子对此进行了详细讨论,请参考该帖子以获得更深入的了解。

    MSP430FR6047:MSP430FR6047:将中断向量重定向到 RAM(第二次)

  •   我的xcl文件里是将这个区域避开了的,可还是会跑飞

  • 您好

    LEASTACK的结束地址为3B7F,而中断向量区域为3B80-3BFF。只需担心这两个内存段是相邻的。如果发生超过3B7F的堆栈溢出,它可能会覆盖中断向量表,从而导致系统崩溃或卡住。您可以尝试增加LEA堆栈空间,并在发生卡住时监控堆栈使用情况,以查看是否存在堆栈流。

  • 您好!

    根据您的意思,如果我需要增加LEASTACK的的空间,而不占用3B80-3BFF这个范围,那么只能往前扩大?我的想法是否正确?同时将USS库中LEA的起始地址同步修改?

  • 您好

    是的,你的理解是正确的,但在修改空间范围之前,你可以使用IDE堆栈使用工具来检查是否发生了堆栈溢出。

    说实话,关于这个问题我只能提供有限的支持,因为它更多涉及到在MSP430中启用RAM中断向量,而不是与USS算法相关的问题,而我在这方面经验不足。以下是ChatGPT关于如何在MSP430设备上将中断向量从只读存储器移至RAM的说明,你可以作为参考,希望它能在你将中断向量表移至RAM时给你一些启示。

    按照以下顺序操作:(1)保留RAM → (2)复制闪存 → (3)编程可变块(VBR)并启用保留功能 → (4)可选地修补向量 → (5)验证,这样您就可以安全地将中断向量表移至MSP430FR6047的RAM中,并利用RAM的可写特性进行动态中断服务程序(ISR)管理。

    如何在MSP430FR6047上将中断向量表移至RAM中——仅关键点

    预留RAM区域

    在SRAM中选择一个偶数对齐的地址(例如0x2400)。
    该表至少需要128字节(64个向量×2字节);通常分配一个如256字节的轮次大小。
    告诉链接器(或使用一个编译指示)在该地址放置一个虚拟数组,这样编译器就不会将相同的内存用于其他任何用途。
    禁用全局中断

    在开始移动任何内容之前,请先清除GIE位(或调用编译器内建函数来禁用中断)。这样可以防止在表处于不一致状态时触发中断。
    将现有的向量从闪存复制到RAM缓冲区

    原始表在闪存中的起始地址为0xFF80。
    不要复制第一个条目(重置向量);重置地址必须保留在闪存中。
    将剩余的128个字节(0xFF82 … 0xFFFF)复制到您预留的RAM区域。
    将核心指向新表

    FR6047使用向量基寄存器(VBR)来定义非复位向量从何处获取。
    VBR具有写保护功能,因此您必须首先使用密码(0xA5)解锁电源管理模块(PMM),将RAM地址写入VBR,然后再次锁定PMM。
    地址的低两位被忽略,因此任何偶数地址均可使用。
    确保RAM区域在低功耗模式下保持供电

    如果您打算进入LPM3/LPM4模式,请通过在PMM保留控制寄存器(PM5CTL0/PM5CTL1)中设置适当的位,为保存向量表的存储体启用SRAM保留功能。
    若不进行保留,当设备进入深度休眠状态时,该表将会丢失,从而导致中断失败。
    重新启用全局中断

    在设置可变字节率(VBR)并配置随机存取存储器(RAM)保持功能后,再次设置全局中断使能(GIE)位,以便处理器能够响应中断。
    验证(可选但建议进行)

    回读VBR以确认它包含您选择的RAM地址。
    触发一个已知的中断,并观察程序计数器;它应该指向RAM区域中的中断服务程序(ISR)。
    检查你分配的RAM块是否未被程序的其他部分覆盖。


    需要注意的事项


    切勿移动重置向量(地址0xFF80);它始终从闪存中获取。
    所有ISR(中断服务程序)地址必须是偶数(字对齐)。使用__interrupt属性声明ISR可以确保这一点。
    如果您打算使用低功耗模式,则必须保持RAM(随机存取存储器)的保留状态;否则,当SRAM(静态随机存取存储器)存储体断电时,向量表将会消失。
    对齐:您编程到可变基址寄存器(VBR)中的基址必须为2字节对齐;否则,硬件将截断低位,您最终可能会指向错误的位置。

    另外附上一些线程供您参考。

    MSP430FR5989: Executing Interrupt vectors from RAM

    Use Ram as an alternate location for interrupt vector locations