TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F6779: MPY32被adc中断并在中断中使用后恢复到中断前的问题

Part Number:MSP430F6779

工程师们你们好,我这里遇到了一个关于MPY32硬件乘法器的问题。

相关环境:

1. 使用了EnergyMeasurementDesignCenter-1.40.00.03生成的代码。

2. 使用了MSP DSP Lib:DSPLib_1_30_00_02

3. 在程序中有4K采样频率的ADC SD24采集中断,在中断中有调用emSwLib库中的算法函数,分析里面有用到MPY32。

4. 从ADC采集的数据中取256个数据进行fft使用的函数为msp_fft_iq31在中断外执行。

现象:

使用一组测试数据进行fft,发现每次变换后的结果都不一样。在进行fft前使用__disable_interrupt关闭中断后fft出来的结果就是每次都一样的并且和其他fft算法跑出来的结果一样。

经过逐步调试分析判断应该是msp_fft_iq31在使用MPY32的过程中被ADC中断并且使用了MPY32,导致MPY32原来的数据被破坏了,从而导致每次fft出来的结果都不一样。

我尝试过在进入中断计算时将MPY32相关的寄存器备份,在退出中断时将MPY32相关寄存器恢复之前的值,但是并没什么效果。

请问可以通过恢复MPY32的寄存器来解决这个问题吗?或者有什么方法可以解决这个问题吗?

PS:因为ADC中断中进行一些比较重要的操作,因此不能使用关闭中断来做。

Cherry Zhou:

您好您的问题我们已经收到并升级到英文论坛,如有答复将尽快回复您。谢谢!

,

zm w:

好的,谢谢!

,

Cherry Zhou:

您好,请问您有没有查看过用户指南25.2.7.1中的示例?

,

zm w:

您好,没有看过,我去研究一下再来回复您,感谢!

,

Cherry Zhou:

您好,使用 MPY32 和中断可能有点棘手。 在某些情况下您必须暂时禁用中断,然后在操作后再重新启用。 在某些情况下,您还需要保存 MPT32 寄存器,然后将其恢复。 有关更多详细信息,请您参阅用户指南的第 25.2.7 节和第 25.2.7.1 节。

,

zm w:

您好,我这边测试初步解决了这个问题,禁止中断和保存寄存器的方式我都分别试过。

禁止中断的方式是,在进行MPY32计算时关闭sd24的中断,但是这样还是会影响sd24中断里面的数据,只是比之前要小一些,因此我放弃了这样做。

我试过用25.2.7.1里面的汇编例程,由于我不懂汇编,使用失败了,现象如下(如果您知道怎么做,也希望能指导一下):

首先是直接将例程直接copy过来编译但是编译失败了,是有几个符号找不到,但是这几个是存在的。

然后我将寄存器引用一下,宏定义替换成实际的值就可以编译通过:

但是当程序运行进入mpy32Backup后就死掉了。

最后我按照这个例程的原理用c语言实现了MPY32的备份和恢复,目前看来是ok的。

,

Cherry Zhou:

好的感谢您的反馈,关于该问题我会再帮您跟进给工程师确认下,有新的消息会尽快给到您。

zm w 说:我试过用25.2.7.1里面的汇编例程,由于我不懂汇编,使用失败了,现象如下(如果您知道怎么做,也希望能指导一下):

,

Cherry Zhou:

dear,正如您所说,这个例程是针对汇编的哦,不可以这样用。

将大量数据push到堆栈,然后 C 函数尝试返回,这样将会造成的结果是:查找的不是堆栈上的返回地址,而是您保存的数据,这就会导致每次都爆炸。

您可以将这些 ASM() 语句放入 ISR 中,不过前提是要考虑堆栈。

想实现C给出的examples最好的方法是integrate到您的项目中。

,

zm w:

好的,感谢您的解答。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F6779: MPY32被adc中断并在中断中使用后恢复到中断前的问题
分享到: 更多 (0)