nRF51 Example 5 - RTC and Compare

Source Demo:

RT

My Demo:

Add a RTC and a Compare to control blinking.
RT

Please click “more” on the right!

Part of my source files

rtc.c

1
#include "nrf51.h"
#include "nrf_gpio.h"
#include "rtc.h"
#include "led.h"
#include <stdbool.h>

#define LFCLK_FREQUENCY           (32768UL)                               /**< LFCLK频率为HZ. */
#define RTC_FREQUENCY             (8UL)                                   /**< 所需的RTC工作时钟 RTC_FREQUENCY 为HZ. */
#define COMPARE_COUNTERTIME       (1UL)                                   /**< 比较参数值Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
#define COUNTER_PRESCALER         ((LFCLK_FREQUENCY/RTC_FREQUENCY) - 1)   /* f = LFCLK/(prescaler + 1) */


/** @brief 启动内部LFCLK晶振功能
 */
 void lfclk_config(void)
{
    NRF_CLOCK->LFCLKSRC             = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos);//配置低频时钟为外部低频时钟
    // NRF_CLOCK->EVENTS_LFCLKSTARTED  = 0;//关掉低频输出
    // NRF_CLOCK->EVENTS_HFCLKSTARTED  = 0;//关掉低频输出
    NRF_CLOCK->TASKS_LFCLKSTART     = 1;//开始低频输入
    while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)
    {
        //Do nothing.
    }
    // NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;//如果有输出立即关掉
}


/** @brief Function for configuring the RTC with TICK to 100Hz and COMPARE0 to 10 sec.
 */
 void rtc_config(void)
{
    NVIC_EnableIRQ(RTC0_IRQn);                                      // 使能 RTC中断.
    NRF_RTC0->PRESCALER     = COUNTER_PRESCALER;                    // 设置预分频值prescaler to a TICK of RTC_FREQUENCY.
    NRF_RTC0->CC[0]         = COMPARE_COUNTERTIME * RTC_FREQUENCY;  //比较器频率 Compare0 after approx COMPARE_COUNTERTIME seconds.

    // Enable TICK event and TICK interrupt:
    NRF_RTC0->EVTENSET      = RTC_EVTENSET_TICK_Msk;
    NRF_RTC0->INTENSET      = RTC_INTENSET_TICK_Msk;

    // Enable COMPARE0 event and COMPARE0 interrupt:
    NRF_RTC0->EVTENSET      = RTC_EVTENSET_COMPARE0_Msk;
    NRF_RTC0->INTENSET      = RTC_INTENSET_COMPARE0_Msk;


    NVIC_EnableIRQ(RTC1_IRQn);                                      // 使能 RTC中断.
    NRF_RTC1->PRESCALER     = COUNTER_PRESCALER;                    // 设置预分频值prescaler to a TICK of RTC_FREQUENCY.
    NRF_RTC1->CC[1]         = RTC_FREQUENCY;  //比较器频率 Compare0 after approx COMPARE_COUNTERTIME seconds.

    // Enable TICK event and TICK interrupt:
    NRF_RTC1->EVTENSET      = RTC_EVTENSET_TICK_Msk;
    NRF_RTC1->INTENSET      = RTC_INTENSET_TICK_Msk;

    // Enable COMPARE0 event and COMPARE0 interrupt:
    NRF_RTC1->EVTENSET      = RTC_EVTENSET_COMPARE1_Msk;
    NRF_RTC1->INTENSET      = RTC_INTENSET_COMPARE1_Msk;
}

/** @brief: Function for handling the RTC0 interrupts.
 * Triggered on TICK and COMPARE0 match.触发TICK和比较事件
 */
void RTC0_IRQHandler()
{
    if ((NRF_RTC0->EVENTS_TICK != 0) &&
        ((NRF_RTC0->INTENSET & RTC_INTENSET_TICK_Msk) != 0))
    {
        NRF_RTC0->EVENTS_TICK = 0;
        LED_Toggle(LED_1);
    }

    if ((NRF_RTC0->EVENTS_COMPARE[0] != 0) &&
        ((NRF_RTC0->INTENSET & RTC_INTENSET_COMPARE0_Msk) != 0))
    {
        NRF_RTC0->EVENTS_COMPARE[0] = 0;
        LED_Toggle(LED_2);
    }
}

void RTC1_IRQHandler()
{
    if ((NRF_RTC1->EVENTS_TICK != 0) &&
        ((NRF_RTC1->INTENSET & RTC_INTENSET_TICK_Msk) != 0))
    {
        NRF_RTC1->EVENTS_TICK = 0;
        LED_Toggle(LED_3);
    }

    if ((NRF_RTC0->EVENTS_COMPARE[1] != 0) &&
        ((NRF_RTC0->INTENSET & RTC_INTENSET_COMPARE0_Msk) != 0))
    {
        NRF_RTC1->EVENTS_COMPARE[1] = 0;
        NRF_RTC1->CC[1] += RTC_FREQUENCY;
        LED_Toggle(LED_3);
    }
}

Download my files


This work is licensed under a Creative Commons Attribution 4.0 International License.

文章目录
  1. 1. Source Demo:
  2. 2. My Demo:
  3. 3. Part of my source files
    1. 3.1. rtc.c
,