User_Sleep.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*********************************************************************
  2. *
  3. * 文件名: User_Wdt.c
  4. * 功能描述:低功耗功能管理
  5. * 作者: 陈俊超
  6. * 时间:2020-11-20
  7. *
  8. ********************************************************************/
  9. #include "User_Sleep.h"
  10. #include "nrf_pwr_mgmt.h"
  11. #include "nrf_drv_clock.h"
  12. #include "nrf_gpio.h"
  13. #include "app_timer.h"
  14. #include "nrf_drv_rtc.h"
  15. #include "nrf_drv_clock.h"
  16. #include "nrf_drv_gpiote.h"
  17. #include "app_uart.h"
  18. /********************** 变量区 **************************************/
  19. #define RAM_RETENTION_OFF (0x00000003UL) /**< The flag used to turn off RAM retention on nRF52. */
  20. const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(2); /**< Declaring an instance of nrf_drv_rtc for RTC2. */
  21. #define COMPARE_COUNTERTIME (10UL) /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
  22. bool lowpowermode=false;//低功耗标志位
  23. /********************** 函数功能区 **************************************/
  24. /**********************************************************
  25. * 函数名字:SleepMode_init
  26. * 函数作用:看门狗初始化
  27. * 函数参数:无
  28. * 函数返回值:无
  29. ***********************************************************/
  30. void SleepMode_init(void)
  31. {
  32. }
  33. /**********************************************************
  34. * 函数名字:low_power_in
  35. * 函数作用:关闭IO口和串口,进入低电量模式
  36. * 函数参数:无
  37. * 函数返回值:无
  38. ***********************************************************/
  39. void low_power_in(void)
  40. {
  41. if(!lowpowermode)
  42. {
  43. nrf_drv_gpiote_out_set(PIN_OUT);
  44. nrf_drv_gpiote_out_uninit(PIN_OUT);//
  45. app_uart_close();
  46. lowpowermode=true;
  47. }
  48. }
  49. /**********************************************************
  50. * 函数名字:low_power_out
  51. * 函数作用:关闭IO口和串口,进入低电量模式
  52. * 函数参数:无
  53. * 函数返回值:无
  54. ***********************************************************/
  55. void low_power_out(void)
  56. {
  57. if(lowpowermode)
  58. {
  59. nrf_drv_gpiote_out_config_t out_config = GPIOTE_CONFIG_OUT_SIMPLE(false);
  60. nrf_drv_gpiote_out_init(PIN_OUT, &out_config);
  61. nrf_drv_gpiote_out_set(PIN_OUT);
  62. uart_init();
  63. advertising_start();
  64. nrf_gpio_pin_clear(PIN_OUT);
  65. lowpowermode=false;
  66. }
  67. }
  68. static void rtc_handler(nrf_drv_rtc_int_type_t int_type)
  69. {
  70. static int cun=0;
  71. if (int_type == NRF_DRV_RTC_INT_COMPARE0)
  72. {
  73. // nrf_gpio_pin_toggle(PIN_OUT);
  74. // advertising_start();
  75. // printf("rtc_handler...NRF_DRV_RTC_INT_COMPARE0 \r\n");
  76. }
  77. else if (int_type == NRF_DRV_RTC_INT_TICK)
  78. {
  79. //
  80. cun++;
  81. if(cun%(8*5)==0)
  82. {
  83. low_power_out();
  84. printf("rtc_handler...NRF_DRV_RTC_INT_TICK \r\n");
  85. }
  86. }
  87. }
  88. /**********************************************************
  89. * 函数名字:rtc_config
  90. * 函数作用:rtc驱动初始化和设置
  91. * 函数参数:无
  92. * 函数返回值:无
  93. ***********************************************************/
  94. void rtc_config(void)
  95. {
  96. uint32_t err_code;
  97. //Initialize RTC instance
  98. nrf_drv_rtc_config_t config = NRF_DRV_RTC_DEFAULT_CONFIG;
  99. config.prescaler = 8191;//4095;????????=32768/(config.prescaler+1)Hz;
  100. err_code = nrf_drv_rtc_init(&rtc, &config, rtc_handler);
  101. APP_ERROR_CHECK(err_code);
  102. //Enable tick event & interrupt
  103. nrf_drv_rtc_tick_enable(&rtc,true);
  104. //Set compare channel to trigger interrupt after COMPARE_COUNTERTIME seconds
  105. err_code = nrf_drv_rtc_cc_set(&rtc,0,COMPARE_COUNTERTIME * 8,true);
  106. APP_ERROR_CHECK(err_code);
  107. //Power on RTC instance
  108. nrf_drv_rtc_enable(&rtc);
  109. }
  110. /**********************************************************
  111. * 函数名字:IntoSystemOffMode
  112. * 函数作用:进入SystemOff超低功耗模式
  113. * 注意: 该模式下唤醒设备将会重启
  114. * 函数参数:无
  115. * 函数返回值:无
  116. ***********************************************************/
  117. void IntoSystemOffMode(void)
  118. {
  119. nrf_gpio_cfg_sense_input(WakeUp_PIN, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW );
  120. app_uart_close();//关闭串口
  121. #ifdef NRF51
  122. NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0Off << POWER_RAMON_OFFRAM0_Pos) |
  123. (POWER_RAMON_OFFRAM1_RAM1Off << POWER_RAMON_OFFRAM1_Pos);
  124. #endif //NRF51
  125. #ifdef NRF52
  126. NRF_POWER->RAM[0].POWER = RAM_RETENTION_OFF;
  127. NRF_POWER->RAM[1].POWER = RAM_RETENTION_OFF;
  128. NRF_POWER->RAM[2].POWER = RAM_RETENTION_OFF;
  129. NRF_POWER->RAM[3].POWER = RAM_RETENTION_OFF;
  130. NRF_POWER->RAM[4].POWER = RAM_RETENTION_OFF;
  131. NRF_POWER->RAM[5].POWER = RAM_RETENTION_OFF;
  132. NRF_POWER->RAM[6].POWER = RAM_RETENTION_OFF;
  133. NRF_POWER->RAM[7].POWER = RAM_RETENTION_OFF;
  134. #endif //NRF52
  135. NRF_POWER->SYSTEMOFF = 0x1;
  136. (void) NRF_POWER->SYSTEMOFF;
  137. while (true);
  138. }