我使用芯片 MSP430FR6043对 FFT 进行相同的测试、使用 DSP 库 DSPLIB_1_30_00_02、但当芯 片运行 FFT 和 iFFT 时、偶尔会进入 LEA 忙的错误状态。 为了解决此问题、我想知道什么会导致 LEA 忙?
谢谢
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.
我使用芯片 MSP430FR6043对 FFT 进行相同的测试、使用 DSP 库 DSPLIB_1_30_00_02、但当芯 片运行 FFT 和 iFFT 时、偶尔会进入 LEA 忙的错误状态。 为了解决此问题、我想知道什么会导致 LEA 忙?
谢谢
大家好、冬天
感谢您的快速回复。
我直接使用 DSPLIB 中的示例代码、我发现 FFT 过程中有多个状态判断、因此您意味着我应该添加多个永久循环? 顺便说一下,由于示例代码不包含 LEA 状态判断的永久循环 ,您是否同意 DSP 示例代码中存在一些潜在风险?
此致、
Yue
MSP_STATUS MSP_cmplx_FFT_auto_Q15 (const MSP_cmplx_FFT_Q15_params *参数、_Q15 * src、uint16_t *移位)
{
uint16_t cmdId;
uint16_t log2Size;
uint16_t length;
MSP_STATUS 状态;
MSP_LEA_FFTCOMPLEXAUTOSCALING_PARAMS * leaParams;
/*将输入长度保存到本地。 *
length = params->length;
/*位与输入的顺序相反。 *
if (params->bitReverse){
/*创建并初始化位反转参数结构。 *
MSP_cmplx_bitrev_Q15_params paramsBitRev;
paramsBitRev.length = params->length;
/*对源数据执行位反转。 *
状态= MSP_cmplx_bitrev_Q15 (¶msBitRev、src);
/*检查操作是否失败。 *
if (status!= MSP_SUCCESS){
退货状态;
}
}
/*计算 log2Size 参数。 *
log2Size = 0;
while (length > 1){
log2Size++;
长度>=1;
}
length = params->length;
#ifndef MSP_disable_diagnostics
/*检查长度是否为2的幂。 *
if ((length &(length-1))){
返回 MSP_SIZE;
}
/*检查数据数组是否对齐并处于有效的内存段中。 *
if (!(MSP_LEA_VALLE_ADDRESS (src、length*2))){
返回 MSP_LEA_INVALID_ADDRESS;
}
/*检查是否定义了正确的版本。 *
if (MSP_LEA_REVISION!= MSP_LEA_getRevision ()){
返回 MSP_LEA_INCORRING_REVISION;
}
/*获取 LEA 模块的锁定。 *
如果(!MSP_Lea_acquireLock()){
返回 MSP_LEA_BUSY;
}
#endif //MSP_disable_diagnostics
//初始化 LEA (如果未启用)。 *
if (!(LEAPMCTL & LEACMDEN)){
MSP_LEA_init ();
}
/*分配 MSP_LEA_FFTCOMPLEXAUTOSCALING_PARAMS 结构。 *
leaParams =(MSP_LEA_FFTCOMPLEXAUTOSCALING_PARAMS *) MSP_LEA_LOADMemory (sizeof (MSP_LEA_FFTCOMPLEXAUTOSCALING_PARAMS)/sizeof (uint32_t));
/*设置 MSP_LEA_FFTCOMPLEXAUTOSCALING_PARAMS 结构。 *
leaParams->vectorSizeBy2=长度>> 1;
leaParams->log2Size = log2Size;
/*将源参数加载到 LEA。 *
LEAPMS0 = MSP_LEA_convert_address (src);
LEAPMS1 = MSP_LEA_convert_address (leaParams);
#if (MSP_LEA_REVISION < MSP_LEA_REVISION_B)
/*将函数加载到代码存储器中*/
cmdId = MSP_Lea_loadCommand (LEACMD__FFTCOMPLEXAUTOSCALING、MSP_LEA_FFTCOMPLEXAUTOSCALING、
大小(MSP_LEA_FFTCOMPLEXAUTOSCALING)/大小(MSP_LEA_FFTCOMPLEXAUTOSCALING [0]);
#else //MSP_LEA_REVISION
/*调用 LEACMD_FFTCOMPLEXAUTOSCALING 命令。 *
cmdId = LEACMD_FFTCOMPLEXAUTOSCALING;
#endif //MSP_LEA_REVISION。
/*调用命令。 *
MSP_Lea_invokeCommand (cmdId);
/*获取自动缩放结果*/
*shift = LEAPMDST;
/*免费 MSP_LEA_FFTCOMPLEXAUTOSCALING_PARAMS 结构。 *
MSP_LEA_freeMemory (sizeof (MSP_LEA_FFTCOMPLEXAUTOSCALING_PARAMS)/sizeof (uint32_t));
/*设置状态标志。 *
状态= MSP_SUCCESS;
#ifndef MSP_disable_diagnostics
/*检查 LEA 中断标志是否有任何错误。 *
IF (MSP_LEA_IFG 和 LEACOVLIFG){
状态= MSP_LEA_COMMAND_OVERflow;
}
否则、如果(MSP_LEA_IFG 和 LEAOORIFG){
状态= MSP_LEA_OUT_OUT_OUT_RANGE;
}
如果(MSP_LEA_IFG 和 LEASDIIFG){
状态= MSP_LEA_scalar_inconsistency;
}
#endif
/* LEA 模块的自由锁定和返回状态。 *
MSP_Lea_freeLock ();
退货状态;
}
您是否在计划中使用 LPM? DSPLIB (用于 LEA)还使用 LPM、这可能导致错误唤醒-> LEA_BUSY。 [兴趣点位于 include/DSPLib_Lea.h 中、尤其是 MSP_Lea_invkeCommand ()。]
看起来可以"-DMSP_DISABLE_LPM0"来解决此问题、或者(为了避免警告)"-DMSP_LEA_REVISION=MSP_LEA_REVISION_A"。 这些会将 LPM 变成一个旋转环路。 (我模糊地记得 LEA Rev A 有自己的 Erratum 与虚假的唤醒有关。)
几年前我这么做的时候、我用 DSPLIB 源来将函数(我感兴趣的函数)进行两个阶段、这样我就可以自己执行 LPM。