工具/软件:TI-RTOS
您好!
我的项目使用 OMAPL138。 然后转向深度睡眠模式和唤醒正常。 但是、当我用安全的 OMAPL138替换常规的 OMAPL138时、它无法进入深度睡眠模式。 安全 OMAP 由 JTAG 解锁并进行调试、但当转向深度睡眠时、它会在 " while (pscstatus)"处停止;
这是我的代码
uint32_t savePinMux;
uint32_t pscstatus;
uint32_t 计数;
//解锁 PLL 配置
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP0)&=
~SYSCFG_CFGCHIP0_PLL_MASTER_LOCK;
/*清除 PLL 锁定位*/
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP3)&=
~SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK;
//配置 GP0[8]-深度睡眠引脚-引脚编号9
//确保 DeepSleep 引脚是 DeepSleep 函数的引脚多路复用
savePinMux = HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (0));
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (0))= PINMUX0_31_28_DeepSleep &\
SavePinMux;
//清除自刷新/低功耗(SR_PD)位为0
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)和=~DDR2_mDDR_SDRCR_SR_PD;
//设置低功耗模式使能
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)|= DDR2_mDDR_SDRCR_LPMODEN;
//通过将 MCLKSTOPEN 设定为1来关闭 MCLK
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)|= DDR2_mDDR_SDRCR_MCLKSTOPEN;
//等待150个 CPU 时钟以允许 MCLK 停止
对于(count = 0;count < MCLK_STOP_TIME_DELAY;count++)
{
asm (" nop");
}
//禁用 SDRAM 的 VCLK (用于自刷新模式)
//关闭 DDR2的 PSC
//等待任何先前启动的转换
HWREG (SOC_PSC_1_regs + PSC_MDCTL (HW_PSC_DDR2_mDDR)=(PSC_MDCTL_NEW_DISABLE 和 PSC_MDCTL_NEXT);
HWREG (SOC_PSC_1_regs + PSC_PTCMD)= PSC_PTCMD_GO0;
操作
{
pscstatus = HWREG (SOC_PSC_1_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT0;
}
while (pscstatus);
//重新检查状态
pscstatus = PSC_MDCTL_NEW_DISABLE & PSC_MDCTL_NEXT;
while ((HWREG (SOC_PSC_1_regs + PSC_mdstat (HW_PSC_DDR2_mDDR))& PSC_mdstat_State)!= pscstatus);
/*必须先清除 PLLENSRC、PLLEN 位才会产生任何影响*/
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLENSRC;
// PLLEN = 0在 PLL0中将 PLL 置于旁路模式
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLEN;
//等待4个周期 OSCIN
for (count = 0;count < PLLEN_MUX_switch;count++)
{
asm (" nop");
}
在 PLL0中为// PLLPWRDN = 1
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLPWRDN;
/*在 PLLEN 有任何影响之前,必须清除 PLLENSRC。*/
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLENSRC;
// PLLEN = 0在 PLL1中将 PLL 置于旁路模式
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&&=~PLLC_PLLCTL_PLLEN;
//等待4个周期 OSCIN
for (count = 0;count < PLLEN_MUX_switch;count++)
{
asm (" nop");
}
在 PLL1中为// PLLPWRDN = 1
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLPWRDN;
// SLEEPCOUNT 位中的配置延迟(例如:0x0F)
HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)=\
((HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)和
~SYSCFG1_DEEPSLEEPCOUNT)| 0x000F);
//将 DeepSleep 中的 SLEEPENABLE 位设置为1
HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)|=SYSCFG1_DeepSlep_SLEEPENABLE;
//轮询位 SLEEPCOMPLETE
while (0 =(SYSCFG1_DeepSlep_SLEEPCOMPLETE 和 HWREG (SOC_SYSCFG_1_1_regs +)
SYSCFG1_DeepSleep)))
{
}
//将 DeepSleep 中的 SLEEPENABLE 位清零
HWREG (SOC_SYSCFG_1_regs + SYSCFG1_DeepSleep)&=\
~SYSCFG1_DEEPSLEEP_SLEEPENABLE;
//将 PLLCTL 中的 PLLRST 位清零
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLRST;
//清除 PLLCTL 中的 PLLPWRDN 位
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLPWRDN;
//将 PLLCTL 中的 PLLRST 位设置为1 -复位结束
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLRST;
//将 PLLCTL 中的 PLLRST 位清零
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&&=~PLLC_PLLCTL_PLLRST;
//清除 PLLCTL 中的 PLLPWRDN 位
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)&=~PLLC_PLLCTL_PLLPWRDN;
//将 PLLCTL 中的 PLLRST 位设置为1 -复位结束
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLRST;
//等待 PLL 锁定
对于(count = 0;count < pll_lock_time_cNT;count++)
{
asm (" nop");
}
//将 PLLCTL 中的 PLLEN 位置1 -移除旁路模式
HWREG (SOC_PLLC_0_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLEN;
//将 PLLCTL 中的 PLLEN 位置1 -移除旁路模式
HWREG (SOC_PLLC_1_regs + PLLC_PLLCTL)|= PLLC_PLLCTL_PLLEN;
/*设置 PLL 锁定位*/
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP0)|=
(0x01 <<SYSCFG_CFGCHIP0_PLL_MASTER_LOCK_SHIFT)
& SYSCFG_CFGCHIP0_PLL_MASTER_LOCK;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP3)&= CLK_PLL0_SYSCLK3;
/*设置 PLL 锁定位*/
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_CFGCHIP3)|=
(0x1 << SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK_SHIFT)
& SYSCFG_CFGCHIP3_PLL1_MASTER_LOCK;
//启用 SDRAM 的 VCLK
HWREG (SOC_PSC_1_regs + PSC_MDCTL (HW_PSC_DDR2_mDDR)=(PSC_MDCTL_NEW_ENABLE 和 PSC_MDCTL_NEXT);
HWREG (SOC_PSC_1_regs + PSC_PTCMD)= PSC_PTCMD_GO0;
操作
{
pscstatus = HWREG (SOC_PSC_1_regs + PSC_PTSTAT)& PSC_PTSTAT_GOSTAT0;
}
while (pscstatus);
//重新检查状态
pscstatus = PSC_MDCTL_NEW_ENABLE & PSC_MDCTL_NEXT;
while ((HWREG (SOC_PSC_1_regs + PSC_mdstat (HW_PSC_DDR2_mDDR))& PSC_mdstat_State)!= pscstatus);
//设置 DDR PHY 中的 RESET_PHY 位
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_MDR_DRPYCRC)|=\
DDR2_mDDR_DRPYRCR_RESET_PHY;
while (DDR2_mDDR_DRPYRCR_RESET_PHY 和\
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_MDR_DRPYCRC));
//清除 SDRCR 中的 MCLKSTOPEN 位
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)&=\
~DDR2_mDDR_SDRCR_MCLKSTOPEN;
//禁用自刷新率
//清除低功耗模式
HWREG (SOC_DDR2_0_CTRL_regs + DDR2_mDDR_SDRCR)&&=~DDR2_mDDR_SDRCR_LPMODEN;
谢谢、
Nhan
