sleep.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "includes.h"
  2. //进入低功耗会死机,暂时使用以下操作模拟。20mA~30mA左右
  3. //unsigned char g_bRTCAlarm=0;
  4. #if 1
  5. void Sleeping(void)
  6. {
  7. SlwTrace(INF, "Sleeping",1);
  8. MODEM_LED1_LOW;MODEM_LED2_LOW;
  9. //KEYBOARD_BACKLIGHT_LOW;
  10. SpeakerDisable();MicDisable();
  11. LCD_BL_LOW;
  12. MODEM_RESET_HIGH;
  13. //MODEM_PWRKEY_LOW;
  14. GPS_PWREN_LOW;
  15. IWDG_Configuration(3000);
  16. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, DISABLE);
  17. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3, DISABLE);
  18. ADC_Cmd (ADC1,DISABLE);//使能或者失能指定的ADC
  19. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
  20. while(1)
  21. {
  22. uTimerHardDly(1000);
  23. IWDG_ReloadCounter();
  24. }
  25. }
  26. #else
  27. void Sleeping(void)
  28. {
  29. SlwTrace(INF, "Sleeping",1);
  30. KEYBOARD_BACKLIGHT_LOW;
  31. SpeakerDisable();MicDisable();
  32. LCD_BL_LOW;
  33. MODEM_RESET_HIGH;
  34. // MODEM_PWRKEY_LOW;
  35. GPS_PWREN_LOW;
  36. //GetVbat();
  37. // SysTick->CTRL = 0x00;//?????
  38. // SysTick->VAL = 0x00;//??val,?????
  39. //
  40. IWDG_Configuration(3000);//////////////
  41. //DBGMCU_Config(DBGMCU_STOP, ENABLE);
  42. ENTERSTOPMODE:
  43. //设置闹铃时间
  44. dev_rtc_setAlarm(15);
  45. // 进入停机模式
  46. printf("time go go step1\r\n");
  47. EXTI_ClearITPendingBit(EXTI_Line17); // 清//EXTI_Line9 |
  48. //printf("Vbat==========%d\r\n",GetOneceVbat());
  49. ADC_Cmd (ADC1,DISABLE);
  50. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
  51. PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
  52. PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
  53. // RTC时间到达
  54. if(dev_rtc_isAlarm())
  55. {
  56. IWDG_ReloadCounter();
  57. SystemInit();
  58. ADCInit();
  59. ADC_Cmd (ADC1,ENABLE);
  60. if(GetOneceVbat()>77){ // 77--345V 由于从停机模式醒来,测试ADC不准 只能打印知晓值。
  61. printf("Wake Up\r\n");
  62. while(1);
  63. }
  64. goto ENTERSTOPMODE;
  65. }
  66. }
  67. #endif
  68. #if 0
  69. void dev_rtc_setAlarm(int AlarmValue)
  70. {
  71. RTC_ITConfig(RTC_IT_ALR, ENABLE);
  72. /* Clear the RTC SEC flag */
  73. RTC_ClearFlag(RTC_FLAG_SEC);
  74. /* Wait clear RTC flag success */
  75. while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET); //
  76. /* Wait until last write operation on RTC registers has finished */
  77. RTC_WaitForLastTask();
  78. /* Sets the RTC alarm value */
  79. RTC_SetAlarm(RTC_GetCounter() + AlarmValue);
  80. /* Wait until last write operation on RTC registers has finished */
  81. RTC_WaitForLastTask();
  82. }
  83. unsigned char dev_rtc_isAlarm(void)
  84. {
  85. if(g_bRTCAlarm)
  86. {
  87. /* Clear the RTC alarm flag */
  88. g_bRTCAlarm = 0;
  89. return 1;
  90. }
  91. return 0;
  92. }
  93. #endif