/**@brief Generic function for handling RTC interrupt * * @param[in] p_reg Pointer to instance register structure. * @param[in] instance_id Index of instance. */ __STATIC_INLINE void nrf_drv_rtc_int_handler(NRF_RTC_Type * p_reg, uint32_t instance_id) { uint32_t i; uint32_t int_mask = (uint32_t)NRF_RTC_INT_COMPARE0_MASK; nrf_rtc_event_t event = NRF_RTC_EVENT_COMPARE_0; for (i = 0; i < RTC_CHANNEL_NUM; i++) { if (nrf_rtc_int_is_enabled(p_reg,int_mask) && nrf_rtc_event_pending(p_reg,event)) { nrf_rtc_event_disable(p_reg,int_mask); nrf_rtc_int_disable(p_reg,int_mask); nrf_rtc_event_clear(p_reg,event); m_handlers[instance_id]((nrf_drv_rtc_int_type_t)i); } int_mask <<= 1; event = (nrf_rtc_event_t)((uint32_t)event + sizeof(uint32_t)); } event = NRF_RTC_EVENT_TICK; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_TICK_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg, event); m_handlers[instance_id](NRF_DRV_RTC_INT_TICK); } event = NRF_RTC_EVENT_OVERFLOW; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_OVERFLOW_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg,event); m_handlers[instance_id](NRF_DRV_RTC_INT_OVERFLOW); } }
nrfx_err_t nrfx_rtc_cc_disable(nrfx_rtc_t const * const p_instance, uint32_t channel) { NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); NRFX_ASSERT(channel<p_instance->cc_channel_count); nrfx_err_t err_code; uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg,int_mask); if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) { nrf_rtc_int_disable(p_instance->p_reg,int_mask); if (nrf_rtc_event_pending(p_instance->p_reg,event)) { nrf_rtc_event_clear(p_instance->p_reg,event); err_code = NRFX_ERROR_TIMEOUT; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } } NRFX_LOG_INFO("RTC id: %d, channel disabled: %lu.", p_instance->instance_id, channel); err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; }
static void irq_handler(NRF_RTC_Type * p_reg, uint32_t instance_id, uint32_t channel_count) { uint32_t i; uint32_t int_mask = (uint32_t)NRF_RTC_INT_COMPARE0_MASK; nrf_rtc_event_t event = NRF_RTC_EVENT_COMPARE_0; for (i = 0; i < channel_count; i++) { if (nrf_rtc_int_is_enabled(p_reg,int_mask) && nrf_rtc_event_pending(p_reg,event)) { nrf_rtc_event_disable(p_reg,int_mask); nrf_rtc_int_disable(p_reg,int_mask); nrf_rtc_event_clear(p_reg,event); NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); m_handlers[instance_id]((nrfx_rtc_int_type_t)i); } int_mask <<= 1; event = (nrf_rtc_event_t)((uint32_t)event + sizeof(uint32_t)); } event = NRF_RTC_EVENT_TICK; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_TICK_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg, event); NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); m_handlers[instance_id](NRFX_RTC_INT_TICK); } event = NRF_RTC_EVENT_OVERFLOW; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_OVERFLOW_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg,event); NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); m_handlers[instance_id](NRFX_RTC_INT_OVERFLOW); } }
void RTC_IRQ_HANDLER(void) { // Handle overflow. if (nrf_rtc_event_pending(RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW)) { HandleOverflow(); } // Handle compare match. for (uint32_t i = 0; i < kNumTimers; i++) { if (nrf_rtc_int_is_enabled(RTC_INSTANCE, sChannelData[i].mCompareInt) && nrf_rtc_event_pending(RTC_INSTANCE, sChannelData[i].mCompareEvent)) { HandleCompareMatch((AlarmIndex)i, false); } } }
ret_code_t nrf_drv_rtc_cc_disable(nrf_drv_rtc_t const * const p_instance, uint32_t channel) { ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); ASSERT(channel<p_instance->cc_channel_count); uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg,int_mask); if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) { nrf_rtc_int_disable(p_instance->p_reg,int_mask); if (nrf_rtc_event_pending(p_instance->p_reg,event)) { nrf_rtc_event_clear(p_instance->p_reg,event); return NRF_ERROR_TIMEOUT; } } return NRF_SUCCESS; }