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.

[参考译文] AWR2944:从 R5内核复位 DSP 内核

Guru**** 2429720 points


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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1517475/awr2944-reset-the-dsp-core-from-the-r5-core

器件型号:AWR2944

工具/软件:

您好、

 现在我们执行一个程序,在演示运行中,由于一些原因,我无法确认,DSP 内核停止向 R5F 内核发送 COMAND ,函数 MmwDemo_handleObjectDetResult 无法调用,在这种情况下 ,我只想从 R5F 内核复位 DSP 内核,而不是软件热复位? 我该如何意识到?谢谢。

BR、

拉塔

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

    尊敬的 Rata:

    如您连接的 E2E 中所述、您可以参考 SDK 中 有关 DSP 断电和唤醒的功率测量演示。

    C:\ti\mmwave_mcuplus_sdk_ \mmwave_mcuplus_sdk_ \ti\demo\awr294x\power_measurement

    此致、

    Samhitha

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

    尊敬的 Samhitha:

      感谢您的回复、我提到了 power_measurement 演示。 此演示旨在  通过 关闭或为 DSP 内核上电来降低 AWR294x 的功耗。  一些代码可能有用 ,但我不知道代码的作用,例如:

     代码1:

    static void MmwDemo_MssLoadingTask(void * args)
    {
        uint32_t timeToLoad = 0;
        uint64_t currTStamp = 0;
    
        while(1)
        {
            SemaphoreP_pend(&gMmwMssMCB.powerMeas.frameStartSemaphore, SystemP_WAIT_FOREVER);
            timeToLoad = ((gMmwMssMCB.framePeriod * gMmwMssMCB.powerMeas.mssLoadingPercent) / 100);
            if(gMmwMssMCB.powerMeas.mssLoading)
            {
                while (1)
                {
                    currTStamp = ClockP_getTimeUsec();
                    if(((currTStamp - gMmwMssMCB.powerMeas.frameStartTimeStamp)/(1000)) > timeToLoad)
                    {
                        /* Check if DSP Clock Gate option is enabled*/
                        if((gMmwMssMCB.powerMeas.isdspclkgate) && (gMmwMssMCB.powerMeas.dspStateAfterFrameProc == 1))
                        {
                            /* Wait till DSP goes to Power OFF State. */
                            while(((*(volatile uint32_t *)0x06000020 & 0x30) != 0x00))
                            {
                                ;
                            }
                            *((volatile uint32_t *)0x060000B8) = 0x7U; // Gate DSP Clock
                        }
    
                        break;
                    }
                    MmwDemo_matrixMultiply();
                }
            }
        }

    代码2:

    static void frameStartISR (void* arg)
    {
        gMmwMssMCB.powerMeas.frameStartTimeStamp = ClockP_getTimeUsec();
        ptrDPCCfg->mssFrameProcessedCounter++;
        *((volatile uint32_t *)	0x0600008C) = 0x00000222;
        SemaphoreP_post(&gMmwMssMCB.powerMeas.frameStartSemaphore);
        TimerP_start(gTimerBaseAddr[CONFIG_TIMER0]);
    }
    

    代码3:

    static void TimerP_isr0(void *args)
    {
        TimerP_clearOverflowInt(gTimerBaseAddr[CONFIG_TIMER0]);
        HwiP_clearInt(CONFIG_TIMER0_INT_NUM);
        TimerP_stop(gTimerBaseAddr[CONFIG_TIMER0]);
    
        if(gMmwMssMCB.powerMeas.dspStateAfterFrameProc == MMWDEMO_DSS_PG_ENABLE)
        {
            CSL_dss_rcmRegs *ptrDssRcmRegs = (CSL_dss_rcmRegs *)CSL_DSS_RCM_U_BASE;
    
            if((ptrDssRcmRegs->DSP_PD_STATUS & 0x30) == 0x00)
            {
                if(gMmwMssMCB.powerMeas.isdspclkgate == MMWDEMO_DSS_CG_ENABLE)
                {
                     /* Un-Gate DSP Clock */
                    ptrDssRcmRegs->DSS_DSP_CLK_GATE = 0x0;
                }
    
                 /* Restore DSP Clock */
                ptrDssRcmRegs->DSS_DSP_CLK_SRC_SEL = MMWDEMO_DSP_CLK_SRC_DSP_PLL_MUX;
    
                /* Unmask Wakeup Evenet */
                ptrDssRcmRegs->DSP_PD_WAKEUP_MASK0 &= 0xFFFEFFFFU;
    
                /* Trigger Wakeup */
                ptrDssRcmRegs->DSP_PD_TRIGGER_WAKUP |= 0x1U;
    
                /* Trigger Wakeup - Enable Interrupts */
                ptrDssRcmRegs->DSP_PD_CTRL &= 0xFFFFFFFE;
            }
        }
    
        CSL_REG32_WR((volatile uint32_t*)(CONFIG_TIMER0_BASE_ADDR + CSL_RTI_RTIUC0), 0U);
        CSL_REG32_WR((volatile uint32_t*)(CONFIG_TIMER0_BASE_ADDR + CSL_RTI_RTIFRC0), 0U);
        CSL_REG32_WR((volatile uint32_t*)(CONFIG_TIMER0_BASE_ADDR + CSL_RTI_RTICOMP0), 1U);
    }

    可能上述代码有用、但我无法提取所需的代码、您能对此提供任何建议吗?  也就是说、哪个代码用于关闭 DSP 内核、哪个代码用于唤醒 MSS 演示中的 DSP 内核?

    谢谢!

    BR、

    拉塔

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

    尊敬的 Rata:

    您可以 在 dss_main.c 中检查 MMWDemo_dspPDCIntrCallBack 回调实现、以注册断电中断。 每当提出 CSL_DSS_INTR_PDC_INT 中断时、DSP 将断电。

    检查 mss_main.c 文件中的 TimerP_isr0以了解唤醒序列。  

    您还可以查看第 5.5.1.2节"软件序列"来关闭 TRM 的 DSP。

    此致、

    Samhitha

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

    您好、Samhitha、

      感谢您的回复、这对我有很大帮助。 我还有 同样的问题。  

    1.如果我  根据5.5.1.2软件序列实现 DSP 断电的功能来关断 TRM 的 DSP、那么代码是在 R5f 内核中实现的、对吗?  

     2.使用5.5.1.2软件序列关闭 DSP  

     "Power Off (关机)"的代码如下所示:

    void poweroff_dsp (void)

    CSL_DSS_rcmRegs * ptrDssRcmRegs =(CSL_DSS_rcmRegs *) CSL_DSS_RCM_U_BASE;

    // 1。 清除所有先前注册的事件
    *(volatile uint32_t *) 0x01800040 = 0xFFFFFFFF;
    *(volatile uint32_t *) 0x01800044 = 0xFFFFFFFF;
    *(volatile uint32_t *) 0x01800048 = 0xFFFFFFFF;
    *(volatile uint32_t *) 0x0180004C = 0xFFFFFFFF;
    // 2.设置 DSP 中断例程
    *(volatile uint32_t *) 0x01810000 || 0x1 << 16;
    ptrDssRcmRegs->DSS_DSP_CLK_SRC_SEL = 0x111;
    ClockP_USleep (1);
    //// 3。 如果 DSP 在自主模式下上电而没有程序下载、则将该值设置为1
    *((volatile uint32_t *) 0x02620020)&=~0x1;
    ////在 DSS_RCM:DSP_PD_WAKEUP_MASK[0-2]中取消屏蔽用作唤醒事件的事件。
    ptrDssRcmRegs->DSP_PD_WAKEUP_MASK0=0x0;
    ptrDssRcmRegs->DSP_PD_WAKEUP_MASK1=0x0;
    ptrDssRcmRegs->DSP_PD_WAKEUP_MASK2=0x0;

    // 5. 取消屏蔽事件、使其在下一次上电后作为硬件事件脉冲接收
    ptrDssRcmRegs->DSP_PD_MISSIND_EVENT_MASK0=0;
    ptrDssRcmRegs->DSP_PD_MISSING_EVENT_MASK1=0;
    ptrDssRcmRegs->DSP_PD_MISSIND_EVENT_MASK2=0;


    // 6.屏蔽来自 DSP 的所有中断
    ptrDssRcmRegs->DSP_PD_CTRL|=0x01;
    // 7. 触发断电
    ptrDssRcmRegs->DSP_TRIGGER_SLEEP=0x01;
    // 8. DSP 电源域的状态可以由其他主子系统 R5F 内核轮询、以确保 DSP 断电。
    while ((((ptrDssRcmRegs->DSP_PD_STATUS>>4)&0x03)!=0))

    }
    }

    上电代码为:

    void poweron_dsp (void)

    CSL_DSS_rcmRegs * ptrDssRcmRegs =(CSL_DSS_rcmRegs *) CSL_DSS_RCM_U_BASE;
    /*恢复 DSP 时钟*/
    ptrDssRcmRegs->DSS_DSP_CLK_SRC_SEL = 0x222;

    /*取消屏蔽唤醒事件*/
    ptrDssRcmRegs->DSP_PD_WAKEUP_MASK0 <= 0xFFFEFFFFU;

    /*触发器唤醒*/
    ptrDssRcmRegs->DSP_TRIGGER_WAKUP |= 0x1U;

    /*触发器唤醒-启用中断*/
    ptrDssRcmRegs->DSP_PD_CTRL 且= 0xFFFFFFFE;
    }

    我已经将这段代码放入我的工程中、但它不起作用、代码有什么问题吗?

    谢谢!

    BR、

    拉塔

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

    尊敬的 Rata:

    我检查实施情况、明天再联系您。

    此致、

    Samhitha

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

    尊敬的 Samhitha:

      我的问题是否有答复? 我期待您的反馈。谢谢!

    BR、

    拉塔

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

    尊敬的 Rata:

    首先、您要在  poweroff_dsp 开头写入清除的所有寄存器、甚至您 用于设置 DSP 中断例程的寄存器都是 DSP_ICFG 寄存器、只能由 DSP 内核访问。 请务必检查要写入哪些寄存器 。 MSS 存储器映射中没有 DSP_ICFP 寄存器空间。

     在电源管理演示的 C66x 内核中配置了 DSP 断电中断的回调函数。 我建议您 在 MSS 应用程序中检查 TimerP_ISr0以及 DSS 应用中的 MMWDemo_dspPDCIntrCallBack 回调寄存器。

    此致、

    Samhitha