void
SysCtrlDeepSleep(void)
{
#ifndef NO_CLOCK_DIVIDER_RESTORE
bool bRestoreSys;
bool bRestoreIO;
uint32_t ui32Reg;
ui32Reg = HWREG(SYS_CTRL_CLOCK_STA);
bRestoreSys = (ui32Reg & SYS_CTRL_CLOCK_STA_SYS_DIV_M)==0;
bRestoreIO = (ui32Reg & SYS_CTRL_CLOCK_STA_IO_DIV_M)==0;
if(bRestoreSys || bRestoreIO)
{
ui32Reg = HWREG(SYS_CTRL_CLOCK_CTRL);
ui32Reg |= bRestoreSys? 0x1:0x0;
ui32Reg |= bRestoreIO? 0x100:0x0;
HWREG(SYS_CTRL_CLOCK_CTRL) = ui32Reg;
}
#endif
//
// Enable deep-sleep.
//
HWREG(NVIC_SYS_CTRL) |= NVIC_SYS_CTRL_SLEEPDEEP;
//
// Wait for an interrupt.
//
CPUwfi();
//
// Disable deep-sleep so that a future sleep will work correctly.
//
HWREG(NVIC_SYS_CTRL) &= ~(NVIC_SYS_CTRL_SLEEPDEEP);
#ifndef NO_CLOCK_DIVIDER_RESTORE
if(bRestoreSys || bRestoreIO)
{
ui32Reg = HWREG(SYS_CTRL_CLOCK_CTRL);
ui32Reg &= bRestoreSys ? ~SYS_CTRL_CLOCK_CTRL_SYS_DIV_M : 0xffffffff;
ui32Reg &= bRestoreIO ? ~SYS_CTRL_CLOCK_CTRL_IO_DIV_M : 0xffffffff;
HWREG(SYS_CTRL_CLOCK_CTRL) = ui32Reg;
}
#endif
}
从16M 切到32M,没有时钟stable(HAL_CLOCK_STABLE), 对吗?