Part Number: MSP430FR6047
当我多次调用USS_startLowPowerUltrasonicCapture函数时,程序会直接死机,调用周期为30ms
Part Number: MSP430FR6047
当我多次调用USS_startLowPowerUltrasonicCapture函数时,程序会直接死机,调用周期为30ms
更新一下我最新的进展,根据我的重新测试,因为我重新更新了我都IAP程序方式见MSP430FR6047: IAP升级问题 - MSP 低功耗微控制器论坛 - MSP 低功耗微控制器 - E2E 设计支持,使用此方式我其他所有的中断和应用程序都正常,唯独存在上诉问题。当我取消IAP,即不使用RAM中断向量的地址,更改回0xff80-0xffff中执行时,上诉问题消失
您好
由于客户已经发现根本原因主要是 MSP430FR6047 中的中断向量重定向到 RAM,以下帖子对此进行了详细讨论,请参考该帖子以获得更深入的了解。
您好
是的,你的理解是正确的,但在修改空间范围之前,你可以使用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