| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #include "user.h"
- typedef struct
- {
- uint32_t HWFlagBit;
- uint32_t DrvFlagBit;
- }PM_CtrlStruct;
- static PM_CtrlStruct prvPM;
- void PM_Init(void)
- {
- GPIO->WAKE_TYPE_EN = (1 << 12) | (1 << 11);
- // GPIO->WAKE_P0_EN = 0xffffffff;
- // GPIO->WAKE_P1_EN = 0xffffffff;
- // GPIO->WAKE_P2_EN = 0xffffffff;
- GPIO->WAKE_P0_EN = 0;
- GPIO->WAKE_P1_EN = 0;
- GPIO->WAKE_P2_EN = 0;
- }
- void PM_SetHardwareRunFlag(uint32_t PmHWSn, uint32_t OnOff)
- {
- if (OnOff)
- {
- prvPM.HWFlagBit |= (1 << PmHWSn);
- }
- else
- {
- prvPM.HWFlagBit &= ~(1 << PmHWSn);
- }
- }
- void PM_SetDriverRunFlag(uint32_t PmDrvSn, uint32_t OnOff)
- {
- if (OnOff)
- {
- prvPM.DrvFlagBit |= (1 << PmDrvSn);
- }
- else
- {
- prvPM.DrvFlagBit &= ~(1 << PmDrvSn);
- }
- }
- void PM_Print(void)
- {
- DBG("%x,%x", prvPM.HWFlagBit, prvPM.DrvFlagBit);
- }
- int32_t PM_Sleep(void)
- {
- uint64_t StartTick;
- uint32_t Temp;
- if (prvPM.HWFlagBit || prvPM.DrvFlagBit) return -ERROR_DEVICE_BUSY;
- __disable_irq();
- StartTick = RTC_GetUTC();
- SYSCTRL->FREQ_SEL = (SYSCTRL->FREQ_SEL & ~(SYSCTRL_FREQ_SEL_POWERMODE_Mask)) | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU_MEM;
- Temp = TRNG->RNG_ANA;
- TRNG->RNG_ANA = Temp | TRNG_RNG_AMA_PD_ALL_Mask;
- __WFI();
- TRNG->RNG_ANA = Temp;
- WDT_Feed();
- SysTickAddSleepTime((RTC_GetUTC() - StartTick) * CORE_TICK_1S);
- Timer_WakeupRun();
- __enable_irq();
- return ERROR_NONE;
- }
|