sleep.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. os_tsk_delete(idModemUartTask);
  21. os_tsk_delete(idModemTask);
  22. //os_tsk_delete(idTTSTask);
  23. while(1)
  24. {
  25. os_dly_wait(1000);
  26. IWDG_ReloadCounter();
  27. }
  28. }
  29. #else
  30. void Sleeping(void)
  31. {
  32. SlwTrace(INF, "Sleeping",1);
  33. KEYBOARD_BACKLIGHT_LOW;
  34. SpeakerDisable();MicDisable();
  35. LCD_BL_LOW;
  36. MODEM_RESET_HIGH;
  37. MODEM_PWRKEY_LOW;
  38. GPS_PWREN_LOW;
  39. //GetVbat();
  40. // SysTick->CTRL = 0x00;//?????
  41. // SysTick->VAL = 0x00;//??val,?????
  42. //
  43. IWDG_Configuration(3000);//////////////
  44. //DBGMCU_Config(DBGMCU_STOP, ENABLE);
  45. ENTERSTOPMODE:
  46. //设置闹铃时间
  47. dev_rtc_setAlarm(15);
  48. // 进入停机模式
  49. printf("time go go step1\r\n");
  50. EXTI_ClearITPendingBit(EXTI_Line17); // 清//EXTI_Line9 |
  51. //printf("Vbat==========%d\r\n",GetOneceVbat());
  52. ADC_Cmd (ADC1,DISABLE);
  53. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
  54. PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
  55. PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
  56. // RTC时间到达
  57. if(dev_rtc_isAlarm())
  58. {
  59. IWDG_ReloadCounter();
  60. SystemInit();
  61. ADCInit();
  62. ADC_Cmd (ADC1,ENABLE);
  63. if(GetOneceVbat()>77){ // 77--345V 由于从停机模式醒来,测试ADC不准 只能打印知晓值。
  64. printf("Wake Up\r\n");
  65. while(1);
  66. }
  67. goto ENTERSTOPMODE;
  68. }
  69. }
  70. #endif
  71. void dev_rtc_setAlarm(int AlarmValue)
  72. {
  73. RTC_ITConfig(RTC_IT_ALR, ENABLE);
  74. /* Clear the RTC SEC flag */
  75. RTC_ClearFlag(RTC_FLAG_SEC);
  76. /* Wait clear RTC flag success */
  77. while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET); //
  78. /* Wait until last write operation on RTC registers has finished */
  79. RTC_WaitForLastTask();
  80. /* Sets the RTC alarm value */
  81. RTC_SetAlarm(RTC_GetCounter() + AlarmValue);
  82. /* Wait until last write operation on RTC registers has finished */
  83. RTC_WaitForLastTask();
  84. }
  85. unsigned char dev_rtc_isAlarm(void)
  86. {
  87. if(g_bRTCAlarm)
  88. {
  89. /* Clear the RTC alarm flag */
  90. g_bRTCAlarm = 0;
  91. return 1;
  92. }
  93. return 0;
  94. }