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:Lea Busy

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP430FR6043

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/816401/msp430fr6043-lea-busy

器件型号:MSP430FR6043

我使用芯片 MSP430FR6043对 FFT 进行相同的测试、使用 DSP 库 DSPLIB_1_30_00_02、但当芯 片运行 FFT 和 iFFT 时、偶尔会进入 LEA 忙的错误状态。 为了解决此问题、我想知道什么会导致 LEA 忙?  

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅 DSP API 返回状态的定义。 LEA 忙意味着仍有计算任务正在运行。 您应该调用 MSP_checkStatus(status)函数来检查状态标志、如果不是 MSP_SUCCESS、则永远循环。 阅读 DSP 库安装目录中的 DSPLIB-UserGuide 以了解更多信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、冬天

    感谢您的快速回复。

    我直接使用 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 (&paramsBitRev、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 ();
    退货状态;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅以下示例。 每次运行后 、应调用 MSP_checkStatus (status)函数来检查 状态标志。  并且 MSP_checkStatus(status)函数中已经有永久循环。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、冬天

    感谢您的患者回复。

    我检查了 MSP_checkStatus 函数并了解了它的工作原理、但我不想在程序的永久循环中迷路。 我的问题是、如何避免 LEA 忙状态、 在使用 LEA 之前是否应检查 LEA 错误状态?

    此致。

    Yue

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否在计划中使用 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。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我认为您是对的、中断器会影响 FFT 的运行。 我关闭了 Tim 并运行了2天、LEA 忙状态甚至没有出现一次。

    此致!

    Yue