您好,
我尝试使用MSP430FR5994上的LEA来计算具有相当大系数的FIR滤波器。
我似乎找不到任何关于fir参数的'tapLength '成员应该做什么的文件,但我有一个例子,按照filter_ex1_fir _q15.c:
#define FI_length (128)
DSPLIB_DATA (FILTER_COEFFS_AUD,4)
_Q15 FILTER_COEFFS_AUD[FI_LENG]={..}
DSPLIB_DATA (结果,4)
_Q15结果[FIR_LENGLES+48];
DSPLIB_DATA (fir数据缓冲器,msp对齐,用于Q15 (FIR长度))
_Q15 fir数据缓冲区[2*FI_LENG];
静态int qq = 0;
msp_fif_q15_参数fif_params;
FIR_params.length = FI_length;
FI_params.tapLength = 128;
FIR_params.coeffs = FILTER_COEFFS_AUD;
FIR_params.enableCircularBuffer =真;
memset (result,qq,20 * sizeof (_Q15));
状态= MSP_FIR_Q15(&FIR_PARams,&FIR_DATA_BUFFER[2*FIR_LENGE -128],&result[24])
如果(memcmp (result,qq,20 * sizeof (_Q15)) {
/*抱怨*/
}
+QQ;
现在,状态始终为"正常"。
基本上,此代码是有效的。 但每隔一段时间,它就会触发memcmp()并进行投诉。
当我仔细观察时,CPU从其中一个保护字节读取0x80,而不是预期值(qq)。
调试器读取QQ。
所以,在MSP_fify_Q15()之后,内存访问发生了一些奇怪的事情。
问题是-我做错了什么? 如果我做错了事,为什么只“有时”发生呢?
它看起来有点像TRM 10.2 中描述的情况,但我不相信此芯片有DTC。
我已经尝试禁用整个块周围的中断,以防中断损坏了我背后的内存,而这不会产生任何影响。
我尝试用一些令牌手动代码来替换LEA调用,该代码可以执行适当的多路复用,这似乎很有效。
我的运行速度是16MHz,但是从DCO或HF XTAL运行同样的操作,我的印象是16MHz MCLK 在这种情况下是合法的?
我的MSP430FR5994将自己宣传为Rev C
msm_fy_q15()调用后的__delay_cycles(1000)似乎会使其更快地发生(但这可能是统计噪声)。
非常感激地接受了任何帮助..
(对于好奇的人来说,我的堆栈明显低于结果-显然这会导致堆栈明显损坏,并且如果受到影响,似乎会导致分支变为零)