core_pm.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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->MSR_CR1 |= BIT(27);
  18. SYSCTRL->LDO25_CR |= BIT(4);
  19. SYSCTRL->ANA_CTRL |= BIT(7)|BIT(4)|BIT(5);
  20. SENSOR->SEN_EXTS_START = 0x55;
  21. int i;
  22. for(i = 0; i < 19; i++)
  23. {
  24. SENSOR->SEN_EN[i] = 0x80000055;
  25. }
  26. }
  27. void PM_SetHardwareRunFlag(uint32_t PmHWSn, uint32_t OnOff)
  28. {
  29. if (OnOff)
  30. {
  31. prvPM.HWFlagBit |= (1 << PmHWSn);
  32. }
  33. else
  34. {
  35. prvPM.HWFlagBit &= ~(1 << PmHWSn);
  36. }
  37. }
  38. void PM_SetDriverRunFlag(uint32_t PmDrvSn, uint32_t OnOff)
  39. {
  40. if (OnOff)
  41. {
  42. prvPM.DrvFlagBit |= (1 << PmDrvSn);
  43. }
  44. else
  45. {
  46. prvPM.DrvFlagBit &= ~(1 << PmDrvSn);
  47. }
  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. uint32_t Temp, Temp2, Temp3, Temp4;
  57. if (prvPM.HWFlagBit || prvPM.DrvFlagBit) return -ERROR_DEVICE_BUSY;
  58. __disable_irq();
  59. Temp2 = ADC0->ADC_CR1;
  60. Temp3 = DAC->DAC_CR1;
  61. Temp4 = ADC0->ADC_CR2;
  62. ADC0->ADC_CR1 |= BIT(8);
  63. ADC0->ADC_CR1 &= ~BIT(6);
  64. DAC->DAC_CR1 |= (1 << 4);
  65. ADC_IntelResistance(0);
  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. // SYSCTRL->LDO25_CR |= BIT(5);
  71. __WFI();
  72. // SYSCTRL->LDO25_CR &= ~BIT(5);
  73. // SYSCTRL->PHER_CTRL &= ~BIT(20);
  74. TRNG->RNG_ANA = Temp;
  75. ADC0->ADC_CR1 = Temp2;
  76. DAC->DAC_CR1 = Temp3;
  77. ADC0->ADC_CR2 = Temp4;
  78. WDT_Feed();
  79. SysTickAddSleepTime((RTC_GetUTC() - StartTick) * CORE_TICK_1S);
  80. Timer_WakeupRun();
  81. __enable_irq();
  82. return ERROR_NONE;
  83. }