123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #include "sdk_common.h"
- #include "app_timer.h"
- #include "tick.h"
- #include "nrf_drv_timer.h"
- #include "nrf_drv_rtc.h"
- #include "nrf_pwr_mgmt.h"
- /********************** 变量区 *************************/
- static const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(2);
- static uint8_t isSleep = 0;
- volatile static uint32_t time_1ms = 0;
- #define time_cb_max 32
- static Tick_callback time_cb[time_cb_max]={0};
- /********************** 函数声明区 *************************/
- static void rtc_tick_handler(nrf_drv_rtc_int_type_t int_type)
- {
- uint32_t err_code;
- if (int_type == NRF_DRV_RTC_INT_COMPARE0)
- {
- // SEGGER_RTT_printf(0,"1");
- // uint32_t tem1 = NRF_RTC0->COUNTER;
- nrf_drv_rtc_counter_clear(&rtc);
- err_code = nrf_drv_rtc_cc_set(&rtc,NRF_DRV_RTC_INT_COMPARE0,HeartTime_Interval*33,true); APP_ERROR_CHECK(err_code);
- if(isSleep==0){
- time_1ms+=HeartTime_Interval;
- for(int i=0;i<time_cb_max;i++) { //SEGGER_RTT_printf(0,"time_cb[%d]=%d\n",i,time_cb[i]);
- if(time_cb[i]){
- time_cb[i]((uint32_t*)(&time_1ms)); //回调函数
- }
- }
- // uint32_t tem2 = NRF_RTC0->COUNTER;
- // if(tem2<tem1) tem2 += 16777216;
- // if(tem2-tem1>0) SEGGER_RTT_printf(0,"rtc_tick_handler(%d)\n",tem2-tem1);
- }
- }
- else if (int_type == NRF_DRV_RTC_INT_TICK)
- {
- // SEGGER_RTT_printf(0,"NRF_DRV_RTC_INT_TICK(0x%X)\n",NRF_RTC0->COUNTER);
- }
- }
- /********************** 外部函数声明区 *************************/
- //=== 系统滴答时间 ===//
- uint32_t Tick_GetTicks(void)
- {
- return time_1ms;
- }
- int Tick_Regist(Tick_callback cb)
- {
- for(int i=0;i<time_cb_max;i++) {
- if(time_cb[i]==cb) return -2;
- if(time_cb[i]==0){
- time_cb[i] = cb; //回调函数
- return 0;
- }
- }
- return -1;
- }
- int Tick_UnRegist(Tick_callback cb)
- {
- for(int i=0;i<time_cb_max;i++){
- if(time_cb[i] == cb){
- time_cb[i] = 0;
- return 0;
- }
- }
- return -1;
- }
- uint32_t rtc_sleep(uint8_t is_wearshoes)
- {
- uint32_t tem1 = NRF_RTC0->COUNTER;
- uint32_t ret = 0;
- uint32_t err_code;
- isSleep = 1;
- if(is_wearshoes==0){ err_code = nrf_drv_rtc_cc_set(&rtc,0,StandByPower_Interval * 33,true); APP_ERROR_CHECK(err_code);}
- else { err_code = nrf_drv_rtc_cc_set(&rtc,0,LowPower_Interval * 33,true); APP_ERROR_CHECK(err_code);}
- nrf_drv_rtc_counter_clear(&rtc);
- while(nrf_drv_rtc_counter_get(&rtc) != 0);
- //进入睡眠
- for(int i=0;i<5;i++){
- uint32_t cnt1 = NRF_RTC0->COUNTER;
- nrf_pwr_mgmt_run();
- // idle_state_handle();
- uint32_t cnt2 = NRF_RTC0->COUNTER;
- if(cnt2<cnt1) cnt2 += 16777216;
- if(cnt2-cnt1>32) break;
- }
-
- err_code = nrf_drv_rtc_cc_set(&rtc,0,HeartTime_Interval*33,true); APP_ERROR_CHECK(err_code);
- nrf_drv_rtc_counter_clear(&rtc);
- while(nrf_drv_rtc_counter_get(&rtc) != 0);
- isSleep = 0;
- uint32_t tem2 = NRF_RTC0->COUNTER;
- if(tem2<tem1) tem2 += 16777216;
- ret = (tem2-tem1)/32.768;
- return ret;
- }
- static void cb_timeeWakeup(uint32_t t)
- {
- time_1ms += t;
- //SEGGER_RTT_printf(0,"cb_timeeWakeup(%d)\n",time_1ms);
- }
- //=== 系统滴答时间初始化 ===//
- void Tick_Init(void)
- {
- uint32_t err_code;
- nrf_drv_rtc_config_t config = NRF_DRV_RTC_DEFAULT_CONFIG;
- config.interrupt_priority = RTC2_IRQ_PRIORITY;
- config.prescaler = 0;// f(RTC) = 32.768kHZ/(prescaler+1) = 8HZ = 125ms
- err_code = nrf_drv_rtc_init(&rtc, &config, rtc_tick_handler); APP_ERROR_CHECK(err_code);
-
- err_code = nrf_drv_rtc_cc_set(&rtc,NRF_DRV_RTC_INT_COMPARE0,HeartTime_Interval*33,true); APP_ERROR_CHECK(err_code);
- nrf_drv_rtc_counter_clear(&rtc);
- nrf_drv_rtc_enable(&rtc);
- // Wakeup_Regist(cb_timeeWakeup);
- }
|