39
39
#include "us_ticker_api.h"
40
40
#include "common_rtc.h"
41
41
#include "app_util.h"
42
+ #include "lp_ticker_api.h"
42
43
43
44
44
45
//------------------------------------------------------------------------------
@@ -56,30 +57,19 @@ void common_rtc_irq_handler(void)
56
57
void COMMON_RTC_IRQ_HANDLER (void )
57
58
#endif
58
59
{
59
- nrf_rtc_event_t event ;
60
- uint32_t int_mask ;
61
-
62
- event = US_TICKER_EVENT ;
63
- int_mask = US_TICKER_INT_MASK ;
64
- if (nrf_rtc_event_pending (COMMON_RTC_INSTANCE , event )) {
65
- nrf_rtc_event_clear (COMMON_RTC_INSTANCE , event );
66
- nrf_rtc_event_disable (COMMON_RTC_INSTANCE , int_mask );
67
-
60
+ if (nrf_rtc_event_pending (COMMON_RTC_INSTANCE , US_TICKER_EVENT )) {
68
61
us_ticker_irq_handler ();
69
62
}
70
63
71
64
#if DEVICE_LOWPOWERTIMER
72
- event = LP_TICKER_EVENT ;
73
- int_mask = LP_TICKER_INT_MASK ;
74
- if (nrf_rtc_event_pending (COMMON_RTC_INSTANCE , event )) {
75
- nrf_rtc_event_clear (COMMON_RTC_INSTANCE , event );
76
- nrf_rtc_event_disable (COMMON_RTC_INSTANCE , int_mask );
65
+ if (nrf_rtc_event_pending (COMMON_RTC_INSTANCE , LP_TICKER_EVENT )) {
66
+
67
+ lp_ticker_irq_handler ();
77
68
}
78
69
#endif
79
70
80
- event = NRF_RTC_EVENT_OVERFLOW ;
81
- if (nrf_rtc_event_pending (COMMON_RTC_INSTANCE , event )) {
82
- nrf_rtc_event_clear (COMMON_RTC_INSTANCE , event );
71
+ if (nrf_rtc_event_pending (COMMON_RTC_INSTANCE , NRF_RTC_EVENT_OVERFLOW )) {
72
+ nrf_rtc_event_clear (COMMON_RTC_INSTANCE , NRF_RTC_EVENT_OVERFLOW );
83
73
// Don't disable this event. It shall occur periodically.
84
74
85
75
++ m_common_rtc_overflows ;
@@ -151,27 +141,16 @@ uint32_t common_rtc_32bit_ticks_get(void)
151
141
ticks += (m_common_rtc_overflows << RTC_COUNTER_BITS );
152
142
return ticks ;
153
143
}
154
- //------------------------------------------------------------------------------
155
-
156
-
157
- void us_ticker_init (void )
158
- {
159
- common_rtc_init ();
160
- }
161
144
162
- static uint64_t us_ticker_64bit_get (void )
145
+ uint64_t common_rtc_64bit_us_get (void )
163
146
{
164
147
uint32_t ticks = common_rtc_32bit_ticks_get ();
165
148
// [ticks -> microseconds]
166
149
return ROUNDED_DIV (((uint64_t )ticks ) * 1000000 , RTC_INPUT_FREQ );
167
150
}
168
151
169
- uint32_t us_ticker_read ()
170
- {
171
- return (uint32_t )us_ticker_64bit_get ();
172
- }
173
-
174
- void us_ticker_set_interrupt (timestamp_t timestamp )
152
+ void common_rtc_set_interrupt (uint32_t us_timestamp , uint32_t cc_channel ,
153
+ uint32_t int_mask )
175
154
{
176
155
// The internal counter is clocked with a frequency that cannot be easily
177
156
// multiplied to 1 MHz, therefore besides the translation of values
@@ -182,12 +161,13 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
182
161
// is then translated to counter ticks. Finally, the lower 24 bits of thus
183
162
// calculated value is written to the counter compare register to prepare
184
163
// the interrupt generation.
185
- uint64_t current_time64 = us_ticker_64bit_get ();
164
+ uint64_t current_time64 = common_rtc_64bit_us_get ();
186
165
// [add upper 32 bits from the current time to the timestamp value]
187
- uint64_t timestamp64 = timestamp + (current_time64 & ~(uint64_t )0xFFFFFFFF );
166
+ uint64_t timestamp64 = us_timestamp +
167
+ (current_time64 & ~(uint64_t )0xFFFFFFFF );
188
168
// [if the original timestamp value happens to be after the 32 bit counter
189
169
// of microsends overflows, correct the upper 32 bits accordingly]
190
- if (timestamp < (uint32_t )(current_time64 & 0xFFFFFFFF )) {
170
+ if (us_timestamp < (uint32_t )(current_time64 & 0xFFFFFFFF )) {
191
171
timestamp64 += ((uint64_t )1 << 32 );
192
172
}
193
173
// [microseconds -> ticks, always round the result up to avoid too early
@@ -205,9 +185,26 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
205
185
compare_value = closest_safe_compare ;
206
186
}
207
187
208
- nrf_rtc_cc_set (COMMON_RTC_INSTANCE , US_TICKER_CC_CHANNEL ,
209
- RTC_WRAP (compare_value ));
210
- nrf_rtc_event_enable (COMMON_RTC_INSTANCE , US_TICKER_INT_MASK );
188
+ nrf_rtc_cc_set (COMMON_RTC_INSTANCE , cc_channel , RTC_WRAP (compare_value ));
189
+ nrf_rtc_event_enable (COMMON_RTC_INSTANCE , int_mask );
190
+ }
191
+ //------------------------------------------------------------------------------
192
+
193
+
194
+ void us_ticker_init (void )
195
+ {
196
+ common_rtc_init ();
197
+ }
198
+
199
+ uint32_t us_ticker_read ()
200
+ {
201
+ return (uint32_t )common_rtc_64bit_us_get ();
202
+ }
203
+
204
+ void us_ticker_set_interrupt (timestamp_t timestamp )
205
+ {
206
+ common_rtc_set_interrupt (timestamp ,
207
+ US_TICKER_CC_CHANNEL , US_TICKER_INT_MASK );
211
208
}
212
209
213
210
void us_ticker_disable_interrupt (void )
@@ -217,6 +214,5 @@ void us_ticker_disable_interrupt(void)
217
214
218
215
void us_ticker_clear_interrupt (void )
219
216
{
220
- // No implementation needed. The event that triggers the interrupt is
221
- // cleared in 'common_rtc_irq_handler'.
217
+ nrf_rtc_event_clear (COMMON_RTC_INSTANCE , US_TICKER_EVENT );
222
218
}
0 commit comments