xref: /nrf52832-nimble/nordic/nrfx/drivers/include/nrfx_timer.h (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
1 /*
2  * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this
9  *    list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its
16  *    contributors may be used to endorse or promote products derived from this
17  *    software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef NRFX_TIMER_H__
33 #define NRFX_TIMER_H__
34 
35 #include <nrfx.h>
36 #include <hal/nrf_timer.h>
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 /**
43  * @defgroup nrfx_timer Timer driver
44  * @{
45  * @ingroup nrf_timer
46  * @brief   TIMER peripheral driver.
47  */
48 
49 /**
50  * @brief Timer driver instance data structure.
51  */
52 typedef struct
53 {
54     NRF_TIMER_Type * p_reg;            ///< Pointer to the structure with TIMER peripheral instance registers.
55     uint8_t          instance_id;      ///< Driver instance index.
56     uint8_t          cc_channel_count; ///< Number of capture/compare channels.
57 } nrfx_timer_t;
58 
59 /**
60  * @brief Macro for creating a timer driver instance.
61  */
62 #define NRFX_TIMER_INSTANCE(id)                                   \
63 {                                                                 \
64     .p_reg            = NRFX_CONCAT_2(NRF_TIMER, id),             \
65     .instance_id      = NRFX_CONCAT_3(NRFX_TIMER, id, _INST_IDX), \
66     .cc_channel_count = NRF_TIMER_CC_CHANNEL_COUNT(id),           \
67 }
68 
69 enum {
70 #if NRFX_CHECK(NRFX_TIMER0_ENABLED)
71     NRFX_TIMER0_INST_IDX,
72 #endif
73 #if NRFX_CHECK(NRFX_TIMER1_ENABLED)
74     NRFX_TIMER1_INST_IDX,
75 #endif
76 #if NRFX_CHECK(NRFX_TIMER2_ENABLED)
77     NRFX_TIMER2_INST_IDX,
78 #endif
79 #if NRFX_CHECK(NRFX_TIMER3_ENABLED)
80     NRFX_TIMER3_INST_IDX,
81 #endif
82 #if NRFX_CHECK(NRFX_TIMER4_ENABLED)
83     NRFX_TIMER4_INST_IDX,
84 #endif
85     NRFX_TIMER_ENABLED_COUNT
86 };
87 
88 /**
89  * @brief Timer driver instance configuration structure.
90  */
91 typedef struct
92 {
93     nrf_timer_frequency_t frequency;          ///< Frequency.
94     nrf_timer_mode_t      mode;               ///< Mode of operation.
95     nrf_timer_bit_width_t bit_width;          ///< Bit width.
96     uint8_t               interrupt_priority; ///< Interrupt priority.
97     void *                p_context;          ///< Context passed to interrupt handler.
98 } nrfx_timer_config_t;
99 
100 /**
101  * @brief Timer driver instance default configuration.
102  */
103 #define NRFX_TIMER_DEFAULT_CONFIG                                                    \
104 {                                                                                    \
105     .frequency          = (nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\
106     .mode               = (nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE,          \
107     .bit_width          = (nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,\
108     .interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY,                    \
109     .p_context          = NULL                                                       \
110 }
111 
112 /**
113  * @brief Timer driver event handler type.
114  *
115  * @param[in] event_type Timer event.
116  * @param[in] p_context  General purpose parameter set during initialization of
117  *                       the timer. This parameter can be used to pass
118  *                       additional information to the handler function, for
119  *                       example, the timer ID.
120  */
121 typedef void (* nrfx_timer_event_handler_t)(nrf_timer_event_t event_type,
122                                             void            * p_context);
123 
124 /**
125  * @brief Function for initializing the timer.
126  *
127  * @param[in] p_instance          Pointer to the driver instance structure.
128  * @param[in] p_config            Pointer to the structure with initial configuration.
129  * @param[in] timer_event_handler Event handler provided by the user.
130  *                                Must not be NULL.
131  *
132  * @retval NRFX_SUCCESS             If initialization was successful.
133  * @retval NRFX_ERROR_INVALID_STATE If the instance is already initialized.
134  */
135 nrfx_err_t nrfx_timer_init(nrfx_timer_t const * const  p_instance,
136                            nrfx_timer_config_t const * p_config,
137                            nrfx_timer_event_handler_t  timer_event_handler);
138 
139 /**
140  * @brief Function for uninitializing the timer.
141  *
142  * @param[in] p_instance Pointer to the driver instance structure.
143  */
144 void nrfx_timer_uninit(nrfx_timer_t const * const p_instance);
145 
146 /**
147  * @brief Function for turning on the timer.
148  *
149  * @param[in] p_instance Pointer to the driver instance structure.
150  */
151 void nrfx_timer_enable(nrfx_timer_t const * const p_instance);
152 
153 /**
154  * @brief Function for turning off the timer.
155  *
156  * Note that the timer will allow to enter the lowest possible SYSTEM_ON state
157  * only after this function is called.
158  *
159  * @param[in] p_instance Pointer to the driver instance structure.
160  */
161 void nrfx_timer_disable(nrfx_timer_t const * const p_instance);
162 
163 /**
164  * @brief Function for checking the timer state.
165  *
166  * @param[in] p_instance Pointer to the driver instance structure.
167  *
168  * @return True if timer is enabled, false otherwise.
169  */
170 bool nrfx_timer_is_enabled(nrfx_timer_t const * const p_instance);
171 
172 /**
173  * @brief Function for pausing the timer.
174  *
175  * @param[in] p_instance Pointer to the driver instance structure.
176  */
177 void nrfx_timer_pause(nrfx_timer_t const * const p_instance);
178 
179 /**
180  * @brief Function for resuming the timer.
181  *
182  * @param[in] p_instance Pointer to the driver instance structure.
183  */
184 void nrfx_timer_resume(nrfx_timer_t const * const p_instance);
185 
186 /**
187  * @brief Function for clearing the timer.
188  *
189  * @param[in] p_instance Pointer to the driver instance structure.
190  */
191 void nrfx_timer_clear(nrfx_timer_t const * const p_instance);
192 
193 /**
194  * @brief Function for incrementing the timer.
195  *
196  * @param[in] p_instance Pointer to the driver instance structure.
197  */
198 void nrfx_timer_increment(nrfx_timer_t const * const p_instance);
199 
200 /**
201  * @brief Function for returning the address of a specific timer task.
202  *
203  * @param[in] p_instance Pointer to the driver instance structure.
204  * @param[in] timer_task Timer task.
205  *
206  * @return Task address.
207  */
208 __STATIC_INLINE uint32_t nrfx_timer_task_address_get(nrfx_timer_t const * const p_instance,
209                                                      nrf_timer_task_t           timer_task);
210 
211 /**
212  * @brief Function for returning the address of a specific timer capture task.
213  *
214  * @param[in] p_instance Pointer to the driver instance structure.
215  * @param[in] channel    Capture channel number.
216  *
217  * @return Task address.
218  */
219 __STATIC_INLINE uint32_t nrfx_timer_capture_task_address_get(nrfx_timer_t const * const p_instance,
220                                                              uint32_t                   channel);
221 
222 /**
223  * @brief Function for returning the address of a specific timer event.
224  *
225  * @param[in] p_instance  Pointer to the driver instance structure.
226  * @param[in] timer_event Timer event.
227  *
228  * @return Event address.
229  */
230 __STATIC_INLINE uint32_t nrfx_timer_event_address_get(nrfx_timer_t const * const p_instance,
231                                                       nrf_timer_event_t          timer_event);
232 
233 /**
234  * @brief Function for returning the address of a specific timer compare event.
235  *
236  * @param[in] p_instance Pointer to the driver instance structure.
237  * @param[in] channel    Compare channel number.
238  *
239  * @return Event address.
240  */
241 __STATIC_INLINE uint32_t nrfx_timer_compare_event_address_get(nrfx_timer_t const * const p_instance,
242                                                               uint32_t                   channel);
243 
244 /**
245  * @brief Function for capturing the timer value.
246  *
247  * @param[in] p_instance Pointer to the driver instance structure.
248  * @param[in] cc_channel Capture channel number.
249  *
250  * @return Captured value.
251  */
252 uint32_t nrfx_timer_capture(nrfx_timer_t const * const p_instance,
253                             nrf_timer_cc_channel_t     cc_channel);
254 
255 /**
256  * @brief Function for returning the capture value from a specific channel.
257  *
258  * Use this function to read channel values when PPI is used for capturing.
259  *
260  * @param[in] p_instance Pointer to the driver instance structure.
261  * @param[in] cc_channel Capture channel number.
262  *
263  * @return Captured value.
264  */
265 __STATIC_INLINE uint32_t nrfx_timer_capture_get(nrfx_timer_t const * const p_instance,
266                                                 nrf_timer_cc_channel_t     cc_channel);
267 
268 /**
269  * @brief Function for setting the timer channel in compare mode.
270  *
271  * @param[in] p_instance Pointer to the driver instance structure.
272  * @param[in] cc_channel Compare channel number.
273  * @param[in] cc_value   Compare value.
274  * @param[in] enable_int Enable or disable the interrupt for the compare channel.
275  */
276 void nrfx_timer_compare(nrfx_timer_t const * const p_instance,
277                         nrf_timer_cc_channel_t     cc_channel,
278                         uint32_t                   cc_value,
279                         bool                       enable_int);
280 
281 /**
282  * @brief Function for setting the timer channel in extended compare mode.
283  *
284  * @param[in] p_instance       Pointer to the driver instance structure.
285  * @param[in] cc_channel       Compare channel number.
286  * @param[in] cc_value         Compare value.
287  * @param[in] timer_short_mask Shortcut between the compare event on the channel
288  *                             and the timer task (STOP or CLEAR).
289  * @param[in] enable_int       Enable or disable the interrupt for the compare
290  *                             channel.
291  */
292 void nrfx_timer_extended_compare(nrfx_timer_t const * const p_instance,
293                                  nrf_timer_cc_channel_t     cc_channel,
294                                  uint32_t                   cc_value,
295                                  nrf_timer_short_mask_t     timer_short_mask,
296                                  bool                       enable_int);
297 
298 /**
299  * @brief Function for converting time in microseconds to timer ticks.
300  *
301  * @param[in] p_instance Pointer to the driver instance structure.
302  * @param[in] time_us    Time in microseconds.
303  *
304  * @return Number of ticks.
305  */
306 __STATIC_INLINE uint32_t nrfx_timer_us_to_ticks(nrfx_timer_t const * const p_instance,
307                                                 uint32_t                   time_us);
308 
309 /**
310  * @brief Function for converting time in milliseconds to timer ticks.
311  *
312  * @param[in] p_instance Pointer to the driver instance structure.
313  * @param[in] time_ms    Time in milliseconds.
314  *
315  * @return Number of ticks.
316  */
317 __STATIC_INLINE uint32_t nrfx_timer_ms_to_ticks(nrfx_timer_t const * const p_instance,
318                                                 uint32_t                   time_ms);
319 
320 /**
321  * @brief Function for enabling timer compare interrupt.
322  *
323  * @param[in] p_instance Pointer to the driver instance structure.
324  * @param[in] channel    Compare channel.
325  */
326 void nrfx_timer_compare_int_enable(nrfx_timer_t const * const p_instance,
327                                    uint32_t                   channel);
328 
329 /**
330  * @brief Function for disabling timer compare interrupt.
331  *
332  * @param[in] p_instance Pointer to the driver instance structure.
333  * @param[in] channel    Compare channel.
334  */
335 void nrfx_timer_compare_int_disable(nrfx_timer_t const * const p_instance,
336                                     uint32_t                   channel);
337 
338 
339 #ifndef SUPPRESS_INLINE_IMPLEMENTATION
340 
nrfx_timer_task_address_get(nrfx_timer_t const * const p_instance,nrf_timer_task_t timer_task)341 __STATIC_INLINE uint32_t nrfx_timer_task_address_get(nrfx_timer_t const * const p_instance,
342                                                      nrf_timer_task_t           timer_task)
343 {
344     return (uint32_t)nrf_timer_task_address_get(p_instance->p_reg, timer_task);
345 }
346 
nrfx_timer_capture_task_address_get(nrfx_timer_t const * const p_instance,uint32_t channel)347 __STATIC_INLINE uint32_t nrfx_timer_capture_task_address_get(nrfx_timer_t const * const p_instance,
348                                                              uint32_t                   channel)
349 {
350     NRFX_ASSERT(channel < p_instance->cc_channel_count);
351     return (uint32_t)nrf_timer_task_address_get(p_instance->p_reg,
352                          nrf_timer_capture_task_get(channel));
353 }
354 
nrfx_timer_event_address_get(nrfx_timer_t const * const p_instance,nrf_timer_event_t timer_event)355 __STATIC_INLINE uint32_t nrfx_timer_event_address_get(nrfx_timer_t const * const p_instance,
356                                                       nrf_timer_event_t          timer_event)
357 {
358     return (uint32_t)nrf_timer_event_address_get(p_instance->p_reg, timer_event);
359 }
360 
nrfx_timer_compare_event_address_get(nrfx_timer_t const * const p_instance,uint32_t channel)361 __STATIC_INLINE uint32_t nrfx_timer_compare_event_address_get(nrfx_timer_t const * const p_instance,
362                                                               uint32_t                   channel)
363 {
364     NRFX_ASSERT(channel < p_instance->cc_channel_count);
365     return (uint32_t)nrf_timer_event_address_get(p_instance->p_reg,
366                          nrf_timer_compare_event_get(channel));
367 }
368 
nrfx_timer_capture_get(nrfx_timer_t const * const p_instance,nrf_timer_cc_channel_t cc_channel)369 __STATIC_INLINE uint32_t nrfx_timer_capture_get(nrfx_timer_t const * const p_instance,
370                                                 nrf_timer_cc_channel_t     cc_channel)
371 {
372     return nrf_timer_cc_read(p_instance->p_reg, cc_channel);
373 }
374 
nrfx_timer_us_to_ticks(nrfx_timer_t const * const p_instance,uint32_t timer_us)375 __STATIC_INLINE uint32_t nrfx_timer_us_to_ticks(nrfx_timer_t const * const p_instance,
376                                                 uint32_t                   timer_us)
377 {
378     return nrf_timer_us_to_ticks(timer_us, nrf_timer_frequency_get(p_instance->p_reg));
379 }
380 
nrfx_timer_ms_to_ticks(nrfx_timer_t const * const p_instance,uint32_t timer_ms)381 __STATIC_INLINE uint32_t nrfx_timer_ms_to_ticks(nrfx_timer_t const * const p_instance,
382                                                 uint32_t                   timer_ms)
383 {
384     return nrf_timer_ms_to_ticks(timer_ms, nrf_timer_frequency_get(p_instance->p_reg));
385 }
386 
387 #endif // SUPPRESS_INLINE_IMPLEMENTATION
388 
389 
390 void nrfx_timer_0_irq_handler(void);
391 void nrfx_timer_1_irq_handler(void);
392 void nrfx_timer_2_irq_handler(void);
393 void nrfx_timer_3_irq_handler(void);
394 void nrfx_timer_4_irq_handler(void);
395 
396 
397 /** @} */
398 
399 #ifdef __cplusplus
400 }
401 #endif
402 
403 #endif // NRFX_TIMER_H__
404 
405