Other Parts Discussed in Thread: TMS570LC4357
器件型号: TMS570LC4357
在此问题之后、尝试在器件进入睡眠状态时将闪存组置于睡眠状态(遵循参考手册第 2.4.3.1 节所述的顺序)会在唤醒中断时触发预取错误、最终在睡眠期间将 VDDIO 电流保持在 30mA 附近 (~100mW)、以保持一个闪存组通电、这对于我们的应用来说过高。
我们尝试将 TMS570LS0714PZ_LPC Ms_Wakeup 存储库中的代码调整为我们正在使用的 TMS570LC 器件、但不符合预期结果、因为 TMS570LC 器件缺少寄存器 FBFALLBACK 和 FPAC2 来控制闪存组回退电源模式、只允许通过 FBPWRMODE 寄存器更改当前模式。
将 SHUTDOWN / WAKEUP 序列和 GIO 中断处理程序置于 RAM(.ramTEXT 段)中不会改变结果。
我们是否缺少一些在睡眠模式下将闪存置于睡眠状态的配置?
以下是我们的开关/唤醒序列:
pragma SET_CODE_SECTION(“.ramTEXT")“)
void systemPowerDown(Uint32 模式)
{
uint32_t flashFbPwrMode;
uint32_t clkTest、cdis、cddis、ghvsrc、pllctl1、 pllctl2、pllctl3;
flashFbPwrMode = flashWREG->FBPWRMODE;//保存配置以在唤醒时恢复它
clkTest = systemREG1->CLKTEST;
csdis = systemREG1->CSDIS;
cddis = systemREG1->CDDIS;
pllctl1 = systemREG1->PLLCTL1;
pllctl2 = systemREG1->PLLCTL2;
pllctl3 = systemREG2->PLLCTL3;
ghvsrc = systemREG1->GHVSRC;
systemREG1->CLKTEST =(clkTest &~(1 << 25))|(1 << 24);//禁用范围检测
pmmTurnOFFLogicPowerDomain (PMM_LOGICPD4);
pmmTurnOFFLogicPowerDomain (PMM_LOGICPD5);
while (flashWREG->FBBUSY 和 ((1U << 7)|(1U << 1)|(1U << 0)));//等待所有闪存组处于空闲状态
FlashWREG->FBAC =(0x00 << 16)//OTP 编程被禁用
|(0x0F);//用于唤醒的 VREFAD 设置
flashWREG->FPAC1 &&~1U;//电荷泵备用电源模式=睡眠
FlashWREG->FBPWRMODE =(3U <<(0 * 2))//闪存组 0 电源模式(0:睡眠、1:待机、3:活动)
|(0U <<(1 * 2))//闪存组 1 功耗模式(0:睡眠、1:待机、3:活动)
|(0U <<(7 * 2));//闪存组 7 功耗模式(0:睡眠、1:待机、3:活动)
//禁用时钟源和域
systemREG1->CSDISSET = MODE & 0x000000FFU;
systemREG1->CDDIS =(MODE >> 8U)& 0x00000FFFU;
/*空闲 CPU */
asm volatile (
“ WFI \n“// wait-for-Interrupt 指令
“ nop \n“// 4 个噪声以清除管道
“ nop \n“
“ nop \n“
“ nop \n“
);
flashWREG->FBPWRMODE = flashFbPwrMode;//唤醒闪存
systemREG1->CSDISCLR =(~csdis)& 0x31;//首先启用 LF LPO、HF LPO 和振荡器
if (mode &~csdis &(1U << 1U))//如果禁用了 LP mode pll1
{
systemREG1->PLLCTL1 =(0U << 31U) //打滑时无复位
|(1U << 29U) //启用打滑旁路
|(0x1F << 24U)//锁定前输出分频器到最大值
|(pllctl1 和 0x00FFFFFF);
systemREG1->PLLCTL2 =(0U << 31U)//禁用频率 调制的组合
|(pllctl2 和 0x7FFFFFFF);
}
if (mode &~csdis &(1U << 6U))//如果禁用了 LP 模式、则 pll2
{
systemREG2->PLLCTL3 =(7U << 29U)//锁定前输出分频器最大值
|(pllctl3 和 0x1FFFFFFF);
}
systemREG1->CSDIS = cdis;
systemREG1->CDDIS = cddis;
//等待时钟被锁定、然后恢复剩余的 PLL 参数
while ((systemREG1->CSVSTAT &(~cdis)& 0xFF)!=((~cdis)& 0xFF));
systemREG1->PLLCTL1 = pllctl1;
systemREG1->PLLCTL2 = pllctl2;
systemREG1->GHVSRC = ghvsrc;
//恢复振荡器监视
systemREG1->CLKTEST = clkTest;
pmmTurnONLogicPowerDomain (PMM_LOGICPD4);
pmmTurnONLogicPowerDomain (PMM_LOGICPD5);
gioInit();
}
#pragma set_code_section ()