/**@brief Function for updating the Capture Compare register. */ static void compare_reg_update(app_timer_id_t timer_id_head_old) { // Setup the timeout for timers on the head of the list if (m_timer_id_head != TIMER_NULL) { uint32_t ticks_to_expire = mp_nodes[m_timer_id_head].ticks_to_expire; uint32_t counter = rtc1_counter_get(); uint32_t cc = m_ticks_latest; uint32_t ticks_elapsed = ticks_diff_get(counter, cc) + RTC_COMPARE_OFFSET_MIN; if (timer_id_head_old == TIMER_NULL) { // No timers were already running, start RTC rtc1_start(); } cc += (ticks_elapsed < ticks_to_expire) ? ticks_to_expire : ticks_elapsed; cc &= MAX_RTC_CNT; rtc1_compare0_set(cc); if (ticks_diff_get(rtc1_counter_get(), counter) > ticks_diff_get(cc, counter)) { timer_timeouts_check_sched(); } } else { // No timers are running, stop RTC rtc1_stop(); } }
/**@brief Function for updating the Capture Compare register. */ static void compare_reg_update(timer_node_t * p_timer_id_head_old) { // Setup the timeout for timers on the head of the list if (mp_timer_id_head != NULL) { uint32_t ticks_to_expire = mp_timer_id_head->ticks_to_expire; uint32_t pre_counter_val = rtc1_counter_get(); uint32_t cc = m_ticks_latest; uint32_t ticks_elapsed = ticks_diff_get(pre_counter_val, cc) + RTC_COMPARE_OFFSET_MIN; if (!m_rtc1_running) { // No timers were already running, start RTC rtc1_start(); } cc += (ticks_elapsed < ticks_to_expire) ? ticks_to_expire : ticks_elapsed; cc &= MAX_RTC_COUNTER_VAL; rtc1_compare0_set(cc); uint32_t post_counter_val = rtc1_counter_get(); if ( (ticks_diff_get(post_counter_val, pre_counter_val) + RTC_COMPARE_OFFSET_MIN) > ticks_diff_get(cc, pre_counter_val) ) { // When this happens the COMPARE event may not be triggered by the RTC. // The nRF51 Series User Specification states that if the COUNTER value is N // (i.e post_counter_val = N), writing N or N + 1 to a CC register may not trigger a // COMPARE event. Hence the RTC interrupt is forcefully pended by calling the following // function. rtc1_compare0_set(rtc1_counter_get()); // this should prevent CC to fire again in the background while the code is in RTC-ISR nrf_delay_us(MAX_RTC_TASKS_DELAY); timer_timeouts_check_sched(); } } else { #if (APP_TIMER_KEEPS_RTC_ACTIVE == 0) // No timers are running, stop RTC rtc1_stop(); #endif //(APP_TIMER_KEEPS_RTC_ACTIVE == 0) } }
/**@brief Function for updating the Capture Compare register. */ static void compare_reg_update(app_timer_id_t timer_id_head_old) { // Setup the timeout for timers on the head of the list if (m_timer_id_head != TIMER_NULL) { uint32_t ticks_to_expire = mp_nodes[m_timer_id_head].ticks_to_expire; uint32_t pre_counter_val = rtc1_counter_get(); uint32_t cc = m_ticks_latest; uint32_t ticks_elapsed = ticks_diff_get(pre_counter_val, cc) + RTC_COMPARE_OFFSET_MIN; if (timer_id_head_old == TIMER_NULL) { // No timers were already running, start RTC rtc1_start(); } cc += (ticks_elapsed < ticks_to_expire) ? ticks_to_expire : ticks_elapsed; cc &= MAX_RTC_COUNTER_VAL; rtc1_compare0_set(cc); uint32_t post_counter_val = rtc1_counter_get(); if ( (ticks_diff_get(post_counter_val, pre_counter_val) + RTC_COMPARE_OFFSET_MIN) > ticks_diff_get(cc, pre_counter_val) ) { // When this happens the COMPARE event may not be triggered by the RTC. // The nRF51 Series User Specification states that if the COUNTER value is N // (i.e post_counter_val = N), writing N or N+1 to a CC register may not trigger a // COMPARE event. Hence the RTC interrupt is forcefully pended by calling the following // function. timer_timeouts_check_sched(); } } else { // No timers are running, stop RTC rtc1_stop(); } }