您的位置:首页 > 编程语言

[nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

2016-08-09 19:07 537 查看
一、实验内容:

  配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断。

TICK 中断中驱动指示灯D1 翻转状态, 即指示灯D1 以8Hz 的速率翻转状态

COMPARE0 中断中点亮指示灯D2

二、nRF51822的内部RTC结构:

  NRF51822 有两个RTC 时钟:RTC0,RTC1。两个RTC 均为24 位,使用LFCLK 低频时钟,并带有12 位分频器,可产生TICK、compare 和溢出事件。RTC 原理框图如下图所示:



三、计数器递增频率的计算:

fRTC[KHz]=32.768/(PRESCALER+1)

  由上式可以看出,设置递增频率也就是设置相应的PRESCALER,如设置递增频率为8Hz。那么,PRESCALER 值如下:

    PRESCALER = round(四舍五入) (32.768 kHz / 8 Hz) – 1 = 4095

  此时,递增周期是:125ms。

四、核心源码解析:

main:

int main(void)
{
leds_config();
lfclk_config();
rtc_config();

while (true)
{
__SEV();
__WFE();
__WFE();
}
}


RTC初始化:

static void rtc_config(void)
{
uint32_t err_code;

//Initialize RTC instance
err_code = nrf_drv_rtc_init(&rtc, NULL, rtc_handler);//初始化RTC
     APP_ERROR_CHECK(err_code);

//Enable tick event & interrupt
nrf_drv_rtc_tick_enable(&rtc, true);//使能tick事件

//Set compare channel to trigger interrupt after COMPARE_COUNTERTIME seconds
err_code = nrf_drv_rtc_cc_set(&rtc, 0, COMPARE_COUNTERTIME * RTC0_CONFIG_FREQUENCY, true);
APP_ERROR_CHECK(err_code);

//Power on RTC instance
nrf_drv_rtc_enable(&rtc);
}


RTC中断回调函数:

/** @brief: Function for handling the RTC0 interrupts.
* Triggered on TICK and COMPARE0 match.
*/
static void rtc_handler(nrf_drv_rtc_int_type_t int_type)
{
if (int_type == NRF_DRV_RTC_INT_COMPARE0)
{
nrf_gpio_pin_toggle(COMPARE_EVENT_OUTPUT);
}
else if (int_type == NRF_DRV_RTC_INT_TICK)
{
nrf_gpio_pin_toggle(TICK_EVENT_OUTPUT);
}
}


@nRF51822基础实验系列:

[nRF51822] 7、基础实验代码解析大全(前十)

[nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI

[nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC

@beautifulzzzz - 物联网&普适计算实践者
e-mail:beautifulzzzz@qq.com
i-blog:blog.beautifulzzzz.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: