工具/软件:
您好、
现在我们执行一个程序,在演示运行中,由于一些原因,我无法确认,DSP 内核停止向 R5F 内核发送 COMAND ,函数 MmwDemo_handleObjectDetResult 无法调用,在这种情况下 ,我只想从 R5F 内核复位 DSP 内核,而不是软件热复位? 我该如何意识到?谢谢。
BR、
拉塔
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.
工具/软件:
您好、
现在我们执行一个程序,在演示运行中,由于一些原因,我无法确认,DSP 内核停止向 R5F 内核发送 COMAND ,函数 MmwDemo_handleObjectDetResult 无法调用,在这种情况下 ,我只想从 R5F 内核复位 DSP 内核,而不是软件热复位? 我该如何意识到?谢谢。
BR、
拉塔
尊敬的 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:
首先、您要在 poweroff_dsp 开头写入清除的所有寄存器、甚至您 用于设置 DSP 中断例程的寄存器都是 DSP_ICFG 寄存器、只能由 DSP 内核访问。 请务必检查要写入哪些寄存器 。 MSS 存储器映射中没有 DSP_ICFP 寄存器空间。
在电源管理演示的 C66x 内核中配置了 DSP 断电中断的回调函数。 我建议您 在 MSS 应用程序中检查 TimerP_ISr0以及 DSS 应用中的 MMWDemo_dspPDCIntrCallBack 回调寄存器。
此致、
Samhitha