core_pm.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "user.h"
  2. typedef struct
  3. {
  4. uint32_t HWFlagBit;
  5. uint32_t DrvFlagBit;
  6. }PM_CtrlStruct;
  7. static PM_CtrlStruct prvPM;
  8. void PM_Init(void)
  9. {
  10. GPIO->WAKE_TYPE_EN = (1 << 12) | (1 << 11);
  11. // GPIO->WAKE_P0_EN = 0xffffffff;
  12. // GPIO->WAKE_P1_EN = 0xffffffff;
  13. // GPIO->WAKE_P2_EN = 0xffffffff;
  14. GPIO->WAKE_P0_EN = 0;
  15. GPIO->WAKE_P1_EN = 0;
  16. GPIO->WAKE_P2_EN = 0;
  17. }
  18. void PM_SetHardwareRunFlag(uint32_t PmHWSn, uint32_t OnOff)
  19. {
  20. if (OnOff)
  21. {
  22. prvPM.HWFlagBit |= (1 << PmHWSn);
  23. }
  24. else
  25. {
  26. prvPM.HWFlagBit &= ~(1 << PmHWSn);
  27. }
  28. }
  29. void PM_SetDriverRunFlag(uint32_t PmDrvSn, uint32_t OnOff)
  30. {
  31. if (OnOff)
  32. {
  33. prvPM.DrvFlagBit |= (1 << PmDrvSn);
  34. }
  35. else
  36. {
  37. prvPM.DrvFlagBit &= ~(1 << PmDrvSn);
  38. }
  39. }
  40. void PM_Print(void)
  41. {
  42. DBG("%x,%x", prvPM.HWFlagBit, prvPM.DrvFlagBit);
  43. }
  44. int32_t PM_Sleep(void)
  45. {
  46. uint64_t StartTick;
  47. uint32_t Temp;
  48. if (prvPM.HWFlagBit || prvPM.DrvFlagBit) return -ERROR_DEVICE_BUSY;
  49. __disable_irq();
  50. StartTick = RTC_GetUTC();
  51. SYSCTRL->FREQ_SEL = (SYSCTRL->FREQ_SEL & ~(SYSCTRL_FREQ_SEL_POWERMODE_Mask)) | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU_MEM;
  52. Temp = TRNG->RNG_ANA;
  53. TRNG->RNG_ANA = Temp | TRNG_RNG_AMA_PD_ALL_Mask;
  54. __WFI();
  55. TRNG->RNG_ANA = Temp;
  56. WDT_Feed();
  57. SysTickAddSleepTime((RTC_GetUTC() - StartTick) * CORE_TICK_1S);
  58. Timer_WakeupRun();
  59. __enable_irq();
  60. return ERROR_NONE;
  61. }