ret_code_t nrf_drv_rtc_init(nrf_drv_rtc_t const * const p_instance, nrf_drv_rtc_config_t const * p_config, nrf_drv_rtc_handler_t handler) { if (handler) { m_handlers[p_instance->instance_id] = handler; } else { return NRF_ERROR_INVALID_PARAM; } if (p_config == NULL) { p_config = &m_default_config[p_instance->instance_id]; } if (m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED) { return NRF_ERROR_INVALID_STATE; } nrf_drv_common_irq_enable(p_instance->irq, p_config->interrupt_priority); nrf_rtc_prescaler_set(p_instance->p_reg, p_config->prescaler); m_cb[p_instance->instance_id].reliable = p_config->reliable; m_cb[p_instance->instance_id].tick_latency = p_config->tick_latency; m_cb[p_instance->instance_id].state = NRF_DRV_STATE_INITIALIZED; return NRF_SUCCESS; }
nrfx_err_t nrfx_rtc_init(nrfx_rtc_t const * const p_instance, nrfx_rtc_config_t const * p_config, nrfx_rtc_handler_t handler) { NRFX_ASSERT(p_config); NRFX_ASSERT(handler); nrfx_err_t err_code; m_handlers[p_instance->instance_id] = handler; if (m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED) { err_code = NRFX_ERROR_INVALID_STATE; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } NRFX_IRQ_PRIORITY_SET(p_instance->irq, p_config->interrupt_priority); NRFX_IRQ_ENABLE(p_instance->irq); nrf_rtc_prescaler_set(p_instance->p_reg, p_config->prescaler); m_cb[p_instance->instance_id].reliable = p_config->reliable; m_cb[p_instance->instance_id].tick_latency = p_config->tick_latency; m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_INITIALIZED; err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; }
int z_clock_driver_init(struct device *device) { struct device *clock; ARG_UNUSED(device); clock = device_get_binding(CONFIG_CLOCK_CONTROL_NRF_K32SRC_DRV_NAME); if (!clock) { return -1; } clock_control_on(clock, (void *)CLOCK_CONTROL_NRF_K32SRC); /* TODO: replace with counter driver to access RTC */ nrf_rtc_prescaler_set(RTC, 0); nrf_rtc_cc_set(RTC, 0, CYC_PER_TICK); nrf_rtc_event_enable(RTC, RTC_EVTENSET_COMPARE0_Msk); nrf_rtc_int_enable(RTC, RTC_INTENSET_COMPARE0_Msk); /* Clear the event flag and possible pending interrupt */ nrf_rtc_event_clear(RTC, NRF_RTC_EVENT_COMPARE_0); NVIC_ClearPendingIRQ(RTC1_IRQn); IRQ_CONNECT(RTC1_IRQn, 1, rtc1_nrf_isr, 0, 0); irq_enable(RTC1_IRQn); nrf_rtc_task_trigger(RTC, NRF_RTC_TASK_CLEAR); nrf_rtc_task_trigger(RTC, NRF_RTC_TASK_START); if (!IS_ENABLED(TICKLESS_KERNEL)) { set_comparator(counter() + CYC_PER_TICK); } return 0; }
ret_code_t nrf_drv_rtc_init(nrf_drv_rtc_t const * const p_instance, nrf_drv_rtc_config_t const * p_config, nrf_drv_rtc_handler_t handler) { if (handler) { m_handlers[p_instance->instance_id] = handler; } #if !defined(SUPPORT_RTOS) // nrf_drv_rtc_init() is invoked with an empty handler when initialized // to be used with an RTOS else { return NRF_ERROR_INVALID_PARAM; } #endif if (p_config == NULL) { p_config = &m_default_config[p_instance->instance_id]; } if (m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED) { return NRF_ERROR_INVALID_STATE; } nrf_drv_common_irq_enable(p_instance->irq, p_config->interrupt_priority); nrf_rtc_prescaler_set(p_instance->p_reg, p_config->prescaler); m_cb[p_instance->instance_id].reliable = p_config->reliable; m_cb[p_instance->instance_id].tick_latency = p_config->tick_latency; m_cb[p_instance->instance_id].state = NRF_DRV_STATE_INITIALIZED; return NRF_SUCCESS; }
void nrf5AlarmInit(void) { sTimeOffset = 0; memset(sTimerData, 0, sizeof(sTimerData)); // Setup low frequency clock. nrf_drv_clock_lfclk_request(NULL); while (!nrf_drv_clock_lfclk_is_running()) {} // Setup RTC timer. NVIC_SetPriority(RTC_IRQN, RTC_IRQ_PRIORITY); NVIC_ClearPendingIRQ(RTC_IRQN); NVIC_EnableIRQ(RTC_IRQN); nrf_rtc_prescaler_set(RTC_INSTANCE, 0); nrf_rtc_event_clear(RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW); nrf_rtc_event_enable(RTC_INSTANCE, RTC_EVTEN_OVRFLW_Msk); nrf_rtc_int_enable(RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK); for (uint32_t i = 0; i < kNumTimers; i++) { nrf_rtc_event_clear(RTC_INSTANCE, sChannelData[i].mCompareEvent); nrf_rtc_event_disable(RTC_INSTANCE, sChannelData[i].mCompareEventMask); nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[i].mCompareInt); } nrf_rtc_task_trigger(RTC_INSTANCE, NRF_RTC_TASK_START); }
/* * Setup the RTC time to generate the tick interrupts at the required * frequency. */ void vPortSetupTimerInterrupt( void ) { /* Request LF clock */ nrf_drv_clock_lfclk_request(); /* Configure SysTick to interrupt at the requested rate. */ nrf_rtc_prescaler_set(portNRF_RTC_REG, portNRF_RTC_PRESCALER); nrf_rtc_int_enable (portNRF_RTC_REG, RTC_INTENSET_TICK_Msk); nrf_rtc_task_trigger (portNRF_RTC_REG, NRF_RTC_TASK_CLEAR); nrf_rtc_task_trigger (portNRF_RTC_REG, NRF_RTC_TASK_START); NVIC_SetPriority(portNRF_RTC_IRQn, configKERNEL_INTERRUPT_PRIORITY); NVIC_EnableIRQ(portNRF_RTC_IRQn); }
void common_rtc_init(void) { if (m_common_rtc_enabled) { return; } errata_20(); NVIC_SetVector(RTC1_IRQn, (uint32_t)RTC1_IRQHandler); // RTC is driven by the low frequency (32.768 kHz) clock, a proper request // must be made to have it running. // Currently this clock is started in 'SystemInit' (see "system_nrf51.c" // or "system_nrf52.c", respectively). nrf_rtc_prescaler_set(COMMON_RTC_INSTANCE, 0); nrf_rtc_event_clear(COMMON_RTC_INSTANCE, US_TICKER_EVENT); #if defined(TARGET_MCU_NRF51822) nrf_rtc_event_clear(COMMON_RTC_INSTANCE, OS_TICK_EVENT); #endif #if DEVICE_LOWPOWERTIMER nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT); #endif nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW); // Interrupts on all related events are enabled permanently. Particular // events will be enabled or disabled as needed (such approach is more // energy efficient). nrf_rtc_int_enable(COMMON_RTC_INSTANCE, #if DEVICE_LOWPOWERTIMER LP_TICKER_INT_MASK | #endif US_TICKER_INT_MASK | NRF_RTC_INT_OVERFLOW_MASK); // This event is enabled permanently, since overflow indications are needed // continuously. nrf_rtc_event_enable(COMMON_RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK); // All other relevant events are initially disabled. nrf_rtc_event_disable(COMMON_RTC_INSTANCE, #if defined(TARGET_MCU_NRF51822) OS_TICK_INT_MASK | #endif #if DEVICE_LOWPOWERTIMER LP_TICKER_INT_MASK | #endif US_TICKER_INT_MASK); nrf_drv_common_irq_enable(nrf_drv_get_IRQn(COMMON_RTC_INSTANCE), #ifdef NRF51 APP_IRQ_PRIORITY_LOW #elif defined(NRF52) || defined(NRF52840_XXAA) APP_IRQ_PRIORITY_LOWEST #endif ); nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_START); m_common_rtc_enabled = true; }