sleep.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. SlwTrace(INF, "Sleeping",1);
  32. MODEM_PWRKEY_LOW;
  33. GPS_PWREN_LOW;
  34. // SysTick->CTRL = 0x00;//?????
  35. // SysTick->VAL = 0x00;//??val,?????
  36. //
  37. IWDG_ReloadCounter();
  38. ////
  39. //// ENTERSTOPMODE:
  40. //// //设置闹铃时间
  41. //// dev_rtc_setAlarm(10);
  42. ////
  43. //// // 进入停机模式
  44. EXTI_ClearITPendingBit(EXTI_Line9 | EXTI_Line17 ); // 清
  45. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
  46. PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
  47. PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
  48. //// // RTC时间到达
  49. //// if(dev_rtc_isAlarm())
  50. //// {
  51. //// //
  52. //// IWDG_ReloadCounter();
  53. //// //
  54. //// goto ENTERSTOPMODE;
  55. //// }
  56. }
  57. #endif
  58. void dev_rtc_setAlarm(int AlarmValue)
  59. {
  60. /* Clear the RTC SEC flag */
  61. RTC_ClearFlag(RTC_FLAG_SEC);
  62. /* Wait clear RTC flag sccess */
  63. while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);
  64. /* Wait until last write operation on RTC registers has finished */
  65. RTC_WaitForLastTask();
  66. /* Sets the RTC alarm value */
  67. RTC_SetAlarm(RTC_GetCounter() + AlarmValue);
  68. /* Wait until last write operation on RTC registers has finished */
  69. RTC_WaitForLastTask();
  70. }
  71. unsigned char dev_rtc_isAlarm(void)
  72. {
  73. if(g_bRTCAlarm)
  74. {
  75. /* Clear the RTC alarm flag */
  76. g_bRTCAlarm = 0;
  77. return 1;
  78. }
  79. return 0;
  80. }