core_pm.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. SENSOR->SEN_EXTS_START = 0x55;
  18. int i;
  19. for(i = 0; i < 19; i++)
  20. {
  21. SENSOR->SEN_EN[i] = 0x80000055;
  22. }
  23. SYSCTRL->MSR_CR1 |= BIT(27);
  24. }
  25. void PM_SetHardwareRunFlag(uint32_t PmHWSn, uint32_t OnOff)
  26. {
  27. if (OnOff)
  28. {
  29. prvPM.HWFlagBit |= (1 << PmHWSn);
  30. }
  31. else
  32. {
  33. prvPM.HWFlagBit &= ~(1 << PmHWSn);
  34. }
  35. }
  36. void PM_SetDriverRunFlag(uint32_t PmDrvSn, uint32_t OnOff)
  37. {
  38. if (OnOff)
  39. {
  40. prvPM.DrvFlagBit |= (1 << PmDrvSn);
  41. }
  42. else
  43. {
  44. prvPM.DrvFlagBit &= ~(1 << PmDrvSn);
  45. }
  46. }
  47. void PM_Print(void)
  48. {
  49. DBG("%x,%x", prvPM.HWFlagBit, prvPM.DrvFlagBit);
  50. }
  51. int32_t PM_Sleep(void)
  52. {
  53. uint64_t StartTick;
  54. uint32_t Temp;
  55. if (prvPM.HWFlagBit || prvPM.DrvFlagBit) return -ERROR_DEVICE_BUSY;
  56. __disable_irq();
  57. SYSCTRL->ANA_CTRL |= BIT(7)|BIT(5)|BIT(4);
  58. SYSCTRL->LDO25_CR |= BIT(4);
  59. ADC0->ADC_CR1 |= BIT(8);
  60. ADC0->ADC_CR1 &= ~BIT(6);
  61. DAC->DAC_CR1 |= BIT(4);
  62. StartTick = RTC_GetUTC();
  63. Temp = TRNG->RNG_ANA;
  64. TRNG->RNG_ANA = Temp | TRNG_RNG_AMA_PD_ALL_Mask;
  65. // SYSCTRL->PHER_CTRL |= BIT(20);
  66. __WFI();
  67. // SYSCTRL->LDO25_CR &= ~BIT(5);
  68. // SYSCTRL->PHER_CTRL &= ~BIT(20);
  69. TRNG->RNG_ANA = Temp;
  70. ADC0->ADC_CR1 &= ~BIT(8);
  71. ADC0->ADC_CR1 |= BIT(6);
  72. DAC->DAC_CR1 &= ~BIT(4);
  73. SYSCTRL->LDO25_CR &= ~BIT(4);
  74. SYSCTRL->ANA_CTRL &= ~(BIT(7)|BIT(5)|BIT(4));
  75. WDT_Feed();
  76. SysTickAddSleepTime((RTC_GetUTC() - StartTick) * CORE_TICK_1S);
  77. Timer_WakeupRun();
  78. __enable_irq();
  79. return ERROR_NONE;
  80. }