请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:OMAP-L138 主题中讨论的其他器件:OMAPL138、
工具/软件:TI-RTOS
大家好。
现在、我将在 OMAPL138中开发功能 ARM 将 DSP 置于睡眠模式。
我已经通过 OMAPL138的 ARM 将 DSP 置于睡眠模式。 但是、当我通过 ARM 唤醒 DSP 时、DSP 不会唤醒、并且在 DSP 不工作之后。 我不明白为什么?
我 按照 SPRUH77的10.7.4 C674x 超级模块时钟开/关中详述的步骤进行操作。
以下是我的代码:
ARM 代码:
/*********
*@文件 main.c
*@作者
*@版本 V0.0.0 *
@日期
*@简介
*@修订
版 /
/
** 包括
「香港」 /#include
#include
#include
#include
#include
#include
#include
#include "main.h"
#include "interrupt.h"
#include "delay.h"
#include "lcdkOMAPL138.h"
/*静态函数*/
静态空 PMU_DSPExitSleep 模式(void);
静态空 PMU_DSPSleep 模式(void);
//
void main 函数*/ void main (
*** while (dSPEffitSlepMode)(void 10000/(void));void PMPU (d100001)(void PMPU (void 10dsps)
**@简介 睡眠 DSP
**@参数 无
**@返回 无
**@时间 2019年3
月29日,星期五,下午1:51 **@修订
版 /
static void PMU_DSPEnterSleep 模式(void)
{
volatile unsigned int timeout = 0xFFFFFF;
unsigned int status = 0;
unsigned int regTmp=0;
SOS_DEBUG ("ARM:设置 DSP 睡眠\r\n);
//PSCModuleControl_1 (SOC_PSC_0_regs、HW_PSC_DSP、PSC_POWERDOMAIN_PD_DSP、\
PSC_MDCTL_NEW_DISABLE);
/* C674x 超级模块时钟关闭*/
/*步骤1:ARM 停止所有主器件访问 DSP 和 DSP 存储器*/
/*步骤2:ARM 轮询所有主器件的写入完成状态*/
/*步骤3:ARM 启动以下 DSP 时钟关闭过程*/
/*步骤3a:DSP 时钟停止命令*/
regTmp =(HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP))和~PSC_MDCTL_NEXT);
HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP)= regTmp | PSC_MDCTL_NEW_DISABLE;
/*步骤3b:将1写入 GO [1]位*/
HWREG (SOC_PSC_0_regs + PSC_PTCMD)= HWREG (SOC_PSC_0_regs + PSC_PTCMD)| PSC_PTCMD_GO1;
/*步骤3c:检查(轮询0)电源域转换状态寄存器(PSC0.PTSTAT)中的 GOSTAT[1]位*/
操作
{
状态= HWREG (SOC_PSC_0_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT1;
}
while (status && timeout--);
/*步骤3D:检查(轮询2h) DSP LPSC 模块状态寄存器(PSC0.MDSTAT15)中的 STATE 位字段*/
如果(超时!= 0)
{
超时= 0xFFFFFF;
状态= PSC_MDCTL_NEW_DISABLE;
操作
{
超时--;
}
while (timeout &&(HWREG (SOC_PSC_0_regs + PSC_mdstat (HW_PSC_DSP))& PSC_mdstat_State)!= status);
}
如果(超时=0)
{
SOS_DEBUG ("ARM:设置 DSP 睡眠失败!\r\n");
}
其他
{
SOS_DEBUG ("ARM:设置 DSP 睡眠完成!\r\n");
}
}
/*********
**@简介 睡眠 DSP
**@参数 无
**@返回 无
**@时间 2019年3
月29日,星期五,下午1:56 **@修订
版 /
static void PMU_DSPExitSleep 模式(void)
{
SOS_DEBUG ("ARM:WAKEUP DSP\r\n);
volatile unsigned int timeout = 0xFFFFFF;
unsigned int status = 0;
unsigned int regTmp = 0;
//上的// C674x 超级模块时钟
/*步骤1:等待电源域转换状态寄存器(PSC0.PTSTAT)中的 GOSTAT[1]位清零。 */
DO
{
status = HWREG (SOC_PSC_0_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT1;
SOS_DEBUG ("../r\n");
}
while (status & timeout--);
/*步骤2:向 DSP 本地电源睡眠控制器(LPSC)模块控制寄存器(PSC0.MDCTL15)中的下一个位字段写入3h。*/
regTmp =(HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP))和~PSC_MDCTL_NEXT);
HWREG (SOC_PSC_0_regs + PSC_MDCTL (HW_PSC_DSP)= regTmp | PSC_MDCTL_NEW_ENABLE;
/*步骤3:向 GO [1]位写入1 */
HWREG (SOC_PSC_0_regs + PSC_PTCMD)= HWREG (SOC_PSC_0_regs + PSC_PTCMD)| PSC_PTCMD_GO1;
/*步骤4:检查(轮询0) PSC0.PTSTAT 中的 GOSTAT[1]位*/
超时= 0xFFFFFF;
操作
{
状态= HWREG (SOC_PSC_0_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT1;
}
while (status && timeout--);
/*步骤5:等待 DSP LPSC 模块状态寄存器(PSC0.MDSTAT15)中的 STATE 位字段更改为3h.*/
如果(超时!= 0)
{
超时= 0xFFFFFF;
状态= PSC_MDCTL_NEW_ENABLE;
操作
{
超时--;
}
while (timeout &&(HWREG (SOC_PSC_0_regs + PSC_mdstat (HW_PSC_DSP))& PSC_mdstat_State)!= status);
}
如果(超时=0)
{
SOS_DEBUG ("ARM:唤醒 DSP 失败!\r\n");
}
其他
{
SOS_DEBUG ("ARM:唤醒 DSP 完成!\r\n");
}
/*用于唤醒 DSP 的 SYSCFG_CHIPSIG_CHIPSIG2中断*/
regTmp = HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CHIPSIG)| SYSCFG_CHIPSIG_CHIPSIG2;//0x00000004;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CHIPSIG)= regTmp;
}
DSP 代码:
#include
#include
#include
#include "hw_syscfg0_OMAPL138.h"
#include "hw_types.h"
#include "SoC_OMAPL138.h"
#include "中间 件/调试/调试.h"
#include "in中间 件/ipc/ipc.h"
uint32_t isSleep DSP = 0;
uint32_t noSleep = 0;
while (void 1)
{1 (void)}
/*切换 LED */
TOGGLE_LED();
延迟(5000);
}
/*********
**@简介来自断电控制
的中断句柄**@paramfunc_param
**@returnnone
**@time
**@revision
******** /
void PDC_IRQHandler (void)
{
IntEventClear (SYS_INT_PDC_INT);
//将0001 5555h 写入 PDCCMD *
HWREG (SOC_PWRDWN_PDC_regs)= 0x00015555;
isSlepDSP = 1;
SOS_DEBUG ("PDC 接口\r\n);
asm (" IDLE ");
}
/*************
**@简介来自 ARM
的中断句柄**@paramfunc_param
**@returnnone
**@time
**@revision
******** /
void IPC_IRQ_handler ()
{
Hwi_disableInterrupt (5);
if (isSlepDSP)
{
WAKEUP_IRQHandler();
isSlepDSP = 0;
noSlep++;
SOS_DEBUG ("DSP 为睡眠、noSleep:%d\r\n"、noSleep);
}
其他
{
SOS_DEBUG ("DSP 处于活动状态\r\n);
}
Hwi_enableInterrupt (5);
}
注意:SOS_DEBUG 是 UART 提供的调试功能。
运行结果:ARM 正常运行。 但 DSP 打印日志"PDC 接口"、然后 DSP 不工作。
有人可以帮助我将 DSP 置于睡眠状态并将其唤醒吗?
谢谢,最棒的地方!
Huy DAI
