core_pm.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. // PM_Print();
  36. }
  37. void PM_SetDriverRunFlag(uint32_t PmDrvSn, uint32_t OnOff)
  38. {
  39. if (OnOff)
  40. {
  41. prvPM.DrvFlagBit |= (1 << PmDrvSn);
  42. }
  43. else
  44. {
  45. prvPM.DrvFlagBit &= ~(1 << PmDrvSn);
  46. }
  47. // PM_Print();
  48. }
  49. void PM_Print(void)
  50. {
  51. DBG("%x,%x", prvPM.HWFlagBit, prvPM.DrvFlagBit);
  52. }
  53. int32_t PM_Sleep(void)
  54. {
  55. uint64_t StartTick;
  56. volatile uint32_t Temp, Temp2, Temp3;
  57. if (prvPM.HWFlagBit || prvPM.DrvFlagBit) return -ERROR_DEVICE_BUSY;
  58. __disable_irq();
  59. SYSCTRL->ANA_CTRL |= BIT(7)|BIT(5)|BIT(4);
  60. SYSCTRL->LDO25_CR |= BIT(4);
  61. Temp2 = ADC0->ADC_CR1;
  62. Temp3 = DAC->DAC_CR1;
  63. ADC0->ADC_CR1 |= BIT(8);
  64. ADC0->ADC_CR1 &= ~BIT(6);
  65. DAC->DAC_CR1 |= BIT(4);
  66. StartTick = RTC_GetUTC();
  67. Temp = TRNG->RNG_ANA;
  68. TRNG->RNG_ANA = Temp | TRNG_RNG_AMA_PD_ALL_Mask;
  69. // SYSCTRL->PHER_CTRL |= BIT(20);
  70. __WFI();
  71. // SYSCTRL->LDO25_CR &= ~BIT(5);
  72. // SYSCTRL->PHER_CTRL &= ~BIT(20);
  73. TRNG->RNG_ANA = Temp;
  74. ADC0->ADC_CR1 = Temp2;
  75. DAC->DAC_CR1 = Temp3;
  76. SYSCTRL->LDO25_CR &= ~BIT(4);
  77. SYSCTRL->ANA_CTRL &= ~(BIT(7)|BIT(5)|BIT(4));
  78. WDT_Feed();
  79. SysTickAddSleepTime((RTC_GetUTC() - StartTick) * CORE_TICK_1S);
  80. Timer_WakeupRun();
  81. __enable_irq();
  82. return ERROR_NONE;
  83. }
  84. void PM_Set12MSource(uint8_t XTAL, uint32_t DelayCnt)
  85. {
  86. volatile uint32_t delay = DelayCnt;
  87. if (XTAL == ((SYSCTRL->FREQ_SEL & BIT(12)) >> 12))
  88. {
  89. __disable_irq();
  90. if (XTAL)
  91. {
  92. SYSCTRL->FREQ_SEL &= ~BIT(12);
  93. }
  94. else
  95. {
  96. SYSCTRL->FREQ_SEL |= BIT(12);
  97. }
  98. while(--delay) {;}
  99. __enable_irq();
  100. }
  101. }
  102. void PM_Set32KSource(uint8_t XTAL)
  103. {
  104. if (XTAL == ((BPU->SEN_ANA0 & BIT(10)) >> 10)) return ;
  105. if (XTAL)
  106. {
  107. BPU->SEN_ANA0 |= BIT(10);
  108. }
  109. else
  110. {
  111. BPU->SEN_ANA0 &= ~BIT(10);
  112. }
  113. }