Wireless-Tech 可以使用app-timer这个模块,即可以产生一秒的软中断事件,又可以兼顾到功耗问题。因为它采用的是32.768khz的晶振。
恩恩,在ble_app_template 这个工程中,虚拟了3个RTC定时器,分别是RTC0,RTC1,RTC2,我不知道RTC0被用作什么地方了,每次初始化不能过check 检查模块,被异常中断了。我没有去debuger,RTC1好像被app_timer使用了,所以,我还可以使用RTC2。我还不确定RTC2是否直接初始化之后,就能低功耗,我初始化代码如下:
const nrfx_rtc_t rtc = NRFX_RTC_INSTANCE(2);
//标准的utc时间戳
uint32_t utctime_num = 0;
uint8_t ticktmp_n =0;
static void rtc_handler(nrfx_rtc_int_type_t int_type)
{
if (int_type == NRFX_RTC_INT_COMPARE0)
{
//NRF_LOG_INFO("RTC_COMPARE0.");
}
else if (int_type == NRFX_RTC_INT_TICK) //4096分频,大概是125ms触发一次。 8次一秒
{
if(ticktmp_n >= 8)
{
ticktmp_n = 0;
utctime_num++;
// 在每一次标准时间自加的时候,需要检查是否有闹钟等任何事情。
alarm_process_event();
}else
{
ticktmp_n++;
}
}else if(int_type == NRFX_RTC_INT_OVERFLOW)
{
//NRF_LOG_INFO("RTC_OVER.");
}
}
static void rtc_config(void)
{
uint32_t err_code;
nrfx_rtc_config_t config = NRFX_RTC_DEFAULT_CONFIG;
config.prescaler = 4095;
//config.prescaler = 8191; //无效,最大值好像是4095,其好像也是125ms触发一次。
err_code = nrfx_rtc_init(&rtc, &config, rtc_handler);
APP_ERROR_CHECK(err_code);
//Enable tick event & interrupt
nrfx_rtc_tick_enable(&rtc,true);
//我不需要比较事件,我在tick里面做。
//Set compare channel to trigger interrupt after COMPARE_COUNTERTIME seconds
//err_code = nrfx_rtc_cc_set(&rtc,0,COMPARE_COUNTERTIME * 8 ,true);
//APP_ERROR_CHECK(err_code);
//Power on RTC instance
nrfx_rtc_enable(&rtc);
}
我后续会看下,如果这样初始化RTC2,对功耗是否有影响。后续有结果会补充在帖子下面。
我也想到了使用app_timer中做好的这个模块,但是,我担心这个模块我设置每隔一秒中断一次,运行一个月以上,不知道会不会时间偏移的非常严重,出于这个担心,所以,我先把RTC2初始化好了。后续测试一下,有结果也补充在帖子下面。