core_pm.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. SYSCTRL->ANA_CTRL |= 0x00f0;
  18. }
  19. void PM_SetHardwareRunFlag(uint32_t PmHWSn, uint32_t OnOff)
  20. {
  21. if (OnOff)
  22. {
  23. prvPM.HWFlagBit |= (1 << PmHWSn);
  24. }
  25. else
  26. {
  27. prvPM.HWFlagBit &= ~(1 << PmHWSn);
  28. }
  29. }
  30. void PM_SetDriverRunFlag(uint32_t PmDrvSn, uint32_t OnOff)
  31. {
  32. if (OnOff)
  33. {
  34. prvPM.DrvFlagBit |= (1 << PmDrvSn);
  35. }
  36. else
  37. {
  38. prvPM.DrvFlagBit &= ~(1 << PmDrvSn);
  39. }
  40. }
  41. void PM_Print(void)
  42. {
  43. DBG("%x,%x", prvPM.HWFlagBit, prvPM.DrvFlagBit);
  44. }
  45. int32_t __FUNC_IN_RAM__ PM_Sleep(void)
  46. {
  47. uint64_t StartTick;
  48. uint32_t Temp;
  49. if (prvPM.HWFlagBit || prvPM.DrvFlagBit) return -ERROR_DEVICE_BUSY;
  50. __disable_irq();
  51. StartTick = RTC_GetUTC();
  52. SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_KBD|SYSCTRL_APBPeriph_GPIO;
  53. SYSCTRL->FREQ_SEL = (SYSCTRL->FREQ_SEL & ~(SYSCTRL_FREQ_SEL_POWERMODE_Mask)) | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU_MEM;
  54. Temp = TRNG->RNG_ANA;
  55. TRNG->RNG_ANA = Temp | TRNG_RNG_AMA_PD_ALL_Mask;
  56. __WFI();
  57. TRNG->RNG_ANA = Temp;
  58. SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_ALL;
  59. WDT_Feed();
  60. SysTickAddSleepTime((RTC_GetUTC() - StartTick) * CORE_TICK_1S);
  61. Timer_WakeupRun();
  62. __enable_irq();
  63. return ERROR_NONE;
  64. }