123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*********************************************************************
- *
- * 文件名: User_Wdt.c
- * 功能描述:低功耗功能管理
- * 作者: 陈俊超
- * 时间:2020-11-20
- *
- ********************************************************************/
- #include "User_Sleep.h"
- #include "nrf_pwr_mgmt.h"
- #include "nrf_drv_clock.h"
- #include "nrf_gpio.h"
- #include "app_timer.h"
- #include "nrf_drv_rtc.h"
- #include "nrf_drv_clock.h"
- #include "nrf_drv_gpiote.h"
- #include "app_uart.h"
- /********************** 变量区 **************************************/
- #define RAM_RETENTION_OFF (0x00000003UL) /**< The flag used to turn off RAM retention on nRF52. */
- const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(2); /**< Declaring an instance of nrf_drv_rtc for RTC2. */
- #define COMPARE_COUNTERTIME (10UL) /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
- bool lowpowermode=false;//低功耗标志位
- /********************** 函数功能区 **************************************/
- /**********************************************************
- * 函数名字:SleepMode_init
- * 函数作用:看门狗初始化
- * 函数参数:无
- * 函数返回值:无
- ***********************************************************/
- void SleepMode_init(void)
- {
-
- }
- /**********************************************************
- * 函数名字:low_power_in
- * 函数作用:关闭IO口和串口,进入低电量模式
- * 函数参数:无
- * 函数返回值:无
- ***********************************************************/
- void low_power_in(void)
- {
- if(!lowpowermode)
- {
- nrf_drv_gpiote_out_set(PIN_OUT);
- nrf_drv_gpiote_out_uninit(PIN_OUT);//
- app_uart_close();
- lowpowermode=true;
- }
- }
- /**********************************************************
- * 函数名字:low_power_out
- * 函数作用:关闭IO口和串口,进入低电量模式
- * 函数参数:无
- * 函数返回值:无
- ***********************************************************/
- void low_power_out(void)
- {
- if(lowpowermode)
- {
- nrf_drv_gpiote_out_config_t out_config = GPIOTE_CONFIG_OUT_SIMPLE(false);
- nrf_drv_gpiote_out_init(PIN_OUT, &out_config);
- nrf_drv_gpiote_out_set(PIN_OUT);
- uart_init();
- advertising_start();
- nrf_gpio_pin_clear(PIN_OUT);
- lowpowermode=false;
- }
- }
- static void rtc_handler(nrf_drv_rtc_int_type_t int_type)
- {
- static int cun=0;
- if (int_type == NRF_DRV_RTC_INT_COMPARE0)
- {
- // nrf_gpio_pin_toggle(PIN_OUT);
- // advertising_start();
- // printf("rtc_handler...NRF_DRV_RTC_INT_COMPARE0 \r\n");
- }
- else if (int_type == NRF_DRV_RTC_INT_TICK)
- {
- //
- cun++;
- if(cun%(8*5)==0)
- {
- low_power_out();
- printf("rtc_handler...NRF_DRV_RTC_INT_TICK \r\n");
- }
- }
- }
- /**********************************************************
- * 函数名字:rtc_config
- * 函数作用:rtc驱动初始化和设置
- * 函数参数:无
- * 函数返回值:无
- ***********************************************************/
- void rtc_config(void)
- {
- uint32_t err_code;
- //Initialize RTC instance
- nrf_drv_rtc_config_t config = NRF_DRV_RTC_DEFAULT_CONFIG;
- config.prescaler = 8191;//4095;????????=32768/(config.prescaler+1)Hz;
- err_code = nrf_drv_rtc_init(&rtc, &config, rtc_handler);
- APP_ERROR_CHECK(err_code);
- //Enable tick event & interrupt
- nrf_drv_rtc_tick_enable(&rtc,true);
- //Set compare channel to trigger interrupt after COMPARE_COUNTERTIME seconds
- err_code = nrf_drv_rtc_cc_set(&rtc,0,COMPARE_COUNTERTIME * 8,true);
- APP_ERROR_CHECK(err_code);
- //Power on RTC instance
- nrf_drv_rtc_enable(&rtc);
- }
- /**********************************************************
- * 函数名字:IntoSystemOffMode
- * 函数作用:进入SystemOff超低功耗模式
- * 注意: 该模式下唤醒设备将会重启
- * 函数参数:无
- * 函数返回值:无
- ***********************************************************/
- void IntoSystemOffMode(void)
- {
- nrf_gpio_cfg_sense_input(WakeUp_PIN, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW );
-
- app_uart_close();//关闭串口
- #ifdef NRF51
- NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0Off << POWER_RAMON_OFFRAM0_Pos) |
- (POWER_RAMON_OFFRAM1_RAM1Off << POWER_RAMON_OFFRAM1_Pos);
- #endif //NRF51
- #ifdef NRF52
- NRF_POWER->RAM[0].POWER = RAM_RETENTION_OFF;
- NRF_POWER->RAM[1].POWER = RAM_RETENTION_OFF;
- NRF_POWER->RAM[2].POWER = RAM_RETENTION_OFF;
- NRF_POWER->RAM[3].POWER = RAM_RETENTION_OFF;
- NRF_POWER->RAM[4].POWER = RAM_RETENTION_OFF;
- NRF_POWER->RAM[5].POWER = RAM_RETENTION_OFF;
- NRF_POWER->RAM[6].POWER = RAM_RETENTION_OFF;
- NRF_POWER->RAM[7].POWER = RAM_RETENTION_OFF;
- #endif //NRF52
- NRF_POWER->SYSTEMOFF = 0x1;
- (void) NRF_POWER->SYSTEMOFF;
- while (true);
- }
|