1 /*
2  * Copyright (c) 2014 - 2023, Nordic Semiconductor ASA
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice, this
11  *    list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the copyright holder nor the names of its
18  *    contributors may be used to endorse or promote products derived from this
19  *    software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef NRF_LPCOMP_H_
35 #define NRF_LPCOMP_H_
36 
37 #include <nrfx.h>
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 /**
44  * @defgroup nrf_lpcomp_hal LPCOMP HAL
45  * @{
46  * @ingroup nrf_lpcomp
47  * @brief   Hardware access layer for managing the Low Power Comparator (LPCOMP) peripheral.
48  */
49 
50 #if defined(LPCOMP_PSEL_PIN_Msk) || defined(__NRFX_DOXYGEN__)
51 /** @brief Symbol indicating whether the configuration of analog input using pin number is present. */
52 #define NRF_LPCOMP_HAS_AIN_AS_PIN 1
53 #else
54 #define NRF_LPCOMP_HAS_AIN_AS_PIN 0
55 #endif
56 
57 #if defined(LPCOMP_HYST_HYST_Msk) || defined(__NRFX_DOXYGEN__)
58 /** @brief Symbol indicating whether the hysteresis is present. */
59 #define NRF_LPCOMP_HAS_HYST 1
60 #else
61 #define NRF_LPCOMP_HAS_HYST 0
62 #endif
63 
64 /** @brief LPCOMP tasks. */
65 typedef enum
66 {
67     NRF_LPCOMP_TASK_START  = offsetof(NRF_LPCOMP_Type, TASKS_START), ///< LPCOMP start sampling task.
68     NRF_LPCOMP_TASK_STOP   = offsetof(NRF_LPCOMP_Type, TASKS_STOP),  ///< LPCOMP stop sampling task.
69     NRF_LPCOMP_TASK_SAMPLE = offsetof(NRF_LPCOMP_Type, TASKS_SAMPLE) ///< Sample comparator value.
70 } nrf_lpcomp_task_t;
71 
72 /** @brief LPCOMP events. */
73 typedef enum
74 {
75     NRF_LPCOMP_EVENT_READY = offsetof(NRF_LPCOMP_Type, EVENTS_READY), ///< LPCOMP is ready and output is valid.
76     NRF_LPCOMP_EVENT_DOWN  = offsetof(NRF_LPCOMP_Type, EVENTS_DOWN),  ///< Input voltage crossed the threshold going down.
77     NRF_LPCOMP_EVENT_UP    = offsetof(NRF_LPCOMP_Type, EVENTS_UP),    ///< Input voltage crossed the threshold going up.
78     NRF_LPCOMP_EVENT_CROSS = offsetof(NRF_LPCOMP_Type, EVENTS_CROSS)  ///< Input voltage crossed the threshold in any direction.
79 } nrf_lpcomp_event_t;
80 
81 /** @brief LPCOMP interrupts. */
82 typedef enum
83 {
84     NRF_LPCOMP_INT_READY_MASK = LPCOMP_INTENSET_READY_Msk, ///< Interrupt on READY event.
85     NRF_LPCOMP_INT_DOWN_MASK  = LPCOMP_INTENSET_DOWN_Msk,  ///< Interrupt on DOWN event.
86     NRF_LPCOMP_INT_UP_MASK    = LPCOMP_INTENSET_UP_Msk,    ///< Interrupt on UP event.
87     NRF_LPCOMP_INT_CROSS_MASK = LPCOMP_INTENSET_CROSS_Msk  ///< Interrupt on CROSS event.
88 } nrf_lpcomp_int_mask_t;
89 
90 /** @brief LPCOMP shortcut masks. */
91 typedef enum
92 {
93     NRF_LPCOMP_SHORT_CROSS_STOP_MASK   = LPCOMP_SHORTS_CROSS_STOP_Msk,  ///< Shortcut between CROSS event and STOP task.
94     NRF_LPCOMP_SHORT_UP_STOP_MASK      = LPCOMP_SHORTS_UP_STOP_Msk,     ///< Shortcut between UP event and STOP task.
95     NRF_LPCOMP_SHORT_DOWN_STOP_MASK    = LPCOMP_SHORTS_DOWN_STOP_Msk,   ///< Shortcut between DOWN event and STOP task.
96     NRF_LPCOMP_SHORT_READY_STOP_MASK   = LPCOMP_SHORTS_READY_STOP_Msk,  ///< Shortcut between READY event and STOP task.
97     NRF_LPCOMP_SHORT_READY_SAMPLE_MASK = LPCOMP_SHORTS_READY_SAMPLE_Msk ///< Shortcut between READY event and SAMPLE task.
98 } nrf_lpcomp_short_mask_t;
99 
100 /** @brief LPCOMP reference selection. */
101 typedef enum
102 {
103 #if (LPCOMP_REFSEL_RESOLUTION == 8) || defined(__NRFX_DOXYGEN__)
104     NRF_LPCOMP_REF_SUPPLY_1_8   = LPCOMP_REFSEL_REFSEL_SupplyOneEighthPrescaling,      ///< Use supply with a 1/8 prescaler as reference.
105     NRF_LPCOMP_REF_SUPPLY_2_8   = LPCOMP_REFSEL_REFSEL_SupplyTwoEighthsPrescaling,     ///< Use supply with a 2/8 prescaler as reference.
106     NRF_LPCOMP_REF_SUPPLY_3_8   = LPCOMP_REFSEL_REFSEL_SupplyThreeEighthsPrescaling,   ///< Use supply with a 3/8 prescaler as reference.
107     NRF_LPCOMP_REF_SUPPLY_4_8   = LPCOMP_REFSEL_REFSEL_SupplyFourEighthsPrescaling,    ///< Use supply with a 4/8 prescaler as reference.
108     NRF_LPCOMP_REF_SUPPLY_5_8   = LPCOMP_REFSEL_REFSEL_SupplyFiveEighthsPrescaling,    ///< Use supply with a 5/8 prescaler as reference.
109     NRF_LPCOMP_REF_SUPPLY_6_8   = LPCOMP_REFSEL_REFSEL_SupplySixEighthsPrescaling,     ///< Use supply with a 6/8 prescaler as reference.
110     NRF_LPCOMP_REF_SUPPLY_7_8   = LPCOMP_REFSEL_REFSEL_SupplySevenEighthsPrescaling,   ///< Use supply with a 7/8 prescaler as reference.
111 #elif (LPCOMP_REFSEL_RESOLUTION == 16) || defined(__NRFX_DOXYGEN__)
112     NRF_LPCOMP_REF_SUPPLY_1_8   = LPCOMP_REFSEL_REFSEL_Ref1_8Vdd,                      ///< Use supply with a 1/8 prescaler as reference.
113     NRF_LPCOMP_REF_SUPPLY_2_8   = LPCOMP_REFSEL_REFSEL_Ref2_8Vdd,                      ///< Use supply with a 2/8 prescaler as reference.
114     NRF_LPCOMP_REF_SUPPLY_3_8   = LPCOMP_REFSEL_REFSEL_Ref3_8Vdd,                      ///< Use supply with a 3/8 prescaler as reference.
115     NRF_LPCOMP_REF_SUPPLY_4_8   = LPCOMP_REFSEL_REFSEL_Ref4_8Vdd,                      ///< Use supply with a 4/8 prescaler as reference.
116     NRF_LPCOMP_REF_SUPPLY_5_8   = LPCOMP_REFSEL_REFSEL_Ref5_8Vdd,                      ///< Use supply with a 5/8 prescaler as reference.
117     NRF_LPCOMP_REF_SUPPLY_6_8   = LPCOMP_REFSEL_REFSEL_Ref6_8Vdd,                      ///< Use supply with a 6/8 prescaler as reference.
118     NRF_LPCOMP_REF_SUPPLY_7_8   = LPCOMP_REFSEL_REFSEL_Ref7_8Vdd,                      ///< Use supply with a 7/8 prescaler as reference.
119     NRF_LPCOMP_REF_SUPPLY_1_16  = LPCOMP_REFSEL_REFSEL_Ref1_16Vdd,                     ///< Use supply with a 1/16 prescaler as reference.
120     NRF_LPCOMP_REF_SUPPLY_3_16  = LPCOMP_REFSEL_REFSEL_Ref3_16Vdd,                     ///< Use supply with a 3/16 prescaler as reference.
121     NRF_LPCOMP_REF_SUPPLY_5_16  = LPCOMP_REFSEL_REFSEL_Ref5_16Vdd,                     ///< Use supply with a 5/16 prescaler as reference.
122     NRF_LPCOMP_REF_SUPPLY_7_16  = LPCOMP_REFSEL_REFSEL_Ref7_16Vdd,                     ///< Use supply with a 7/16 prescaler as reference.
123     NRF_LPCOMP_REF_SUPPLY_9_16  = LPCOMP_REFSEL_REFSEL_Ref9_16Vdd,                     ///< Use supply with a 9/16 prescaler as reference.
124     NRF_LPCOMP_REF_SUPPLY_11_16 = LPCOMP_REFSEL_REFSEL_Ref11_16Vdd,                    ///< Use supply with a 11/16 prescaler as reference.
125     NRF_LPCOMP_REF_SUPPLY_13_16 = LPCOMP_REFSEL_REFSEL_Ref13_16Vdd,                    ///< Use supply with a 13/16 prescaler as reference.
126     NRF_LPCOMP_REF_SUPPLY_15_16 = LPCOMP_REFSEL_REFSEL_Ref15_16Vdd,                    ///< Use supply with a 15/16 prescaler as reference.
127 #endif
128     NRF_LPCOMP_REF_EXT_REF      = LPCOMP_REFSEL_REFSEL_ARef,                           ///< Use external analog reference.
129 #if !NRF_LPCOMP_HAS_AIN_AS_PIN
130     NRF_LPCOMP_REF_EXT_REF0     = LPCOMP_REFSEL_REFSEL_ARef |
131                                   (LPCOMP_EXTREFSEL_EXTREFSEL_AnalogReference0 << 16), ///< @deprecated Use @ref nrf_lpcomp_ext_ref_t instead.
132     NRF_LPCOMP_REF_EXT_REF1     = LPCOMP_REFSEL_REFSEL_ARef |
133                                   (LPCOMP_EXTREFSEL_EXTREFSEL_AnalogReference1 << 16), ///< @deprecated Use @ref nrf_lpcomp_ext_ref_t instead.
134 #endif
135 } nrf_lpcomp_ref_t;
136 
137 /** @brief LPCOMP external reference selection. */
138 #if NRF_LPCOMP_HAS_AIN_AS_PIN
139 typedef uint32_t nrf_lpcomp_ext_ref_t;
140 #else
141 typedef enum
142 {
143     NRF_LPCOMP_EXT_REF_REF0 = LPCOMP_EXTREFSEL_EXTREFSEL_AnalogReference0, ///< External reference 0.
144     NRF_LPCOMP_EXT_REF_REF1 = LPCOMP_EXTREFSEL_EXTREFSEL_AnalogReference1, ///< External reference 1.
145 } nrf_lpcomp_ext_ref_t;
146 #endif
147 
148 /** @brief LPCOMP input selection. */
149 #if NRF_LPCOMP_HAS_AIN_AS_PIN
150 typedef uint32_t nrf_lpcomp_input_t;
151 #else
152 typedef enum
153 {
154     NRF_LPCOMP_INPUT_0 = LPCOMP_PSEL_PSEL_AnalogInput0, ///< Input 0.
155     NRF_LPCOMP_INPUT_1 = LPCOMP_PSEL_PSEL_AnalogInput1, ///< Input 1.
156     NRF_LPCOMP_INPUT_2 = LPCOMP_PSEL_PSEL_AnalogInput2, ///< Input 2.
157     NRF_LPCOMP_INPUT_3 = LPCOMP_PSEL_PSEL_AnalogInput3, ///< Input 3.
158     NRF_LPCOMP_INPUT_4 = LPCOMP_PSEL_PSEL_AnalogInput4, ///< Input 4.
159     NRF_LPCOMP_INPUT_5 = LPCOMP_PSEL_PSEL_AnalogInput5, ///< Input 5.
160     NRF_LPCOMP_INPUT_6 = LPCOMP_PSEL_PSEL_AnalogInput6, ///< Input 6.
161     NRF_LPCOMP_INPUT_7 = LPCOMP_PSEL_PSEL_AnalogInput7  ///< Input 7.
162 } nrf_lpcomp_input_t;
163 #endif
164 
165 /** @brief LPCOMP detection type selection. */
166 typedef enum
167 {
168     NRF_LPCOMP_DETECT_CROSS = LPCOMP_ANADETECT_ANADETECT_Cross, ///< Generate ANADETEC on crossing, both upwards and downwards crossing.
169     NRF_LPCOMP_DETECT_UP    = LPCOMP_ANADETECT_ANADETECT_Up,    ///< Generate ANADETEC on upwards crossing only.
170     NRF_LPCOMP_DETECT_DOWN  = LPCOMP_ANADETECT_ANADETECT_Down   ///< Generate ANADETEC on downwards crossing only.
171 } nrf_lpcomp_detect_t;
172 
173 #if NRF_LPCOMP_HAS_HYST
174 /** @brief LPCOMP hysteresis. */
175 typedef enum
176 {
177 #ifdef LPCOMP_HYST_HYST_NoHyst
178     NRF_LPCOMP_HYST_NOHYST  = LPCOMP_HYST_HYST_NoHyst,   ///< Comparator hysteresis disabled.
179 #else
180     NRF_LPCOMP_HYST_NOHYST  = LPCOMP_HYST_HYST_Disabled, ///< Comparator hysteresis disabled.
181 #endif
182 #ifdef LPCOMP_HYST_HYST_Hyst50mV
183     NRF_LPCOMP_HYST_ENABLED = LPCOMP_HYST_HYST_Hyst50mV  ///< Comparator hysteresis enabled (typically 50 mV).
184 #else
185     NRF_LPCOMP_HYST_ENABLED = LPCOMP_HYST_HYST_Enabled   ///< Comparator hysteresis enabled (typically 50 mV).
186 #endif
187 } nrf_lpcomp_hyst_t;
188 #endif // NRF_LPCOMP_HAS_HYST
189 
190 /** @brief LPCOMP configuration. */
191 typedef struct
192 {
193     nrf_lpcomp_ref_t        reference; ///< LPCOMP reference.
194     nrf_lpcomp_detect_t     detection; ///< LPCOMP detection type.
195 #if NRF_LPCOMP_HAS_HYST
196     nrf_lpcomp_hyst_t       hyst;      ///< LPCOMP hysteresis.
197 #endif // LPCOMP_FEATURE_HYST_PRESENT
198 } nrf_lpcomp_config_t;
199 
200 /**
201  * @brief Function for setting the specified LPCOMP task.
202  *
203  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
204  * @param[in] task  LPCOMP task to be set.
205  */
206 NRF_STATIC_INLINE void nrf_lpcomp_task_trigger(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_task_t task);
207 
208 /**
209  * @brief Function for getting the address of the specified LPCOMP task register.
210  *
211  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
212  * @param[in] task  LPCOMP task.
213  *
214  * @return The address of the specified LPCOMP task.
215  */
216 NRF_STATIC_INLINE uint32_t nrf_lpcomp_task_address_get(NRF_LPCOMP_Type const * p_reg,
217                                                        nrf_lpcomp_task_t       task);
218 
219 /**
220  * @brief Function for retrieving the state of the LPCOMP event.
221  *
222  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
223  * @param[in] event Event to be checked.
224  *
225  * @retval true  The event has been generated.
226  * @retval false The event has not been generated.
227  */
228 NRF_STATIC_INLINE bool nrf_lpcomp_event_check(NRF_LPCOMP_Type const * p_reg,
229                                               nrf_lpcomp_event_t      event);
230 
231 /**
232  * @brief Function for clearing the specified LPCOMP event.
233  *
234  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
235  * @param[in] event LPCOMP event to be cleared.
236  */
237 NRF_STATIC_INLINE void nrf_lpcomp_event_clear(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_event_t event);
238 
239 /**
240  * @brief Function for getting the address of the specified LPCOMP event register.
241  *
242  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
243  * @param[in] event LPCOMP event.
244  *
245  * @return The address of the specified LPCOMP event.
246  */
247 NRF_STATIC_INLINE uint32_t nrf_lpcomp_event_address_get(NRF_LPCOMP_Type const * p_reg,
248                                                         nrf_lpcomp_event_t      event);
249 
250 /**
251  * @brief Function for setting LPCOMP shorts.
252  *
253  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
254  * @param[in] mask  Mask of shortcuts.
255  */
256 NRF_STATIC_INLINE void nrf_lpcomp_shorts_enable(NRF_LPCOMP_Type * p_reg, uint32_t mask);
257 
258 /**
259  * @brief Function for clearing LPCOMP shorts by mask.
260  *
261  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
262  * @param[in] mask  Mask of shortcuts.
263  */
264 NRF_STATIC_INLINE void nrf_lpcomp_shorts_disable(NRF_LPCOMP_Type * p_reg, uint32_t mask);
265 
266 /**
267  * @brief Function for for setting the specified shortcuts.
268  *
269  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
270  * @param[in] mask  Mask of shortcuts.
271  */
272 NRF_STATIC_INLINE void nrf_lpcomp_shorts_set(NRF_LPCOMP_Type * p_reg, uint32_t mask);
273 
274 /**
275  * @brief Function for enabling interrupts from LPCOMP.
276  *
277  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
278  * @param[in] mask  Mask of interrupts to be enabled.
279  *                  Use @ref nrf_lpcomp_int_mask_t values for bit masking.
280  *
281  * @sa nrf_lpcomp_int_disable
282  * @sa nrf_lpcomp_int_enable_check
283  */
284 NRF_STATIC_INLINE void nrf_lpcomp_int_enable(NRF_LPCOMP_Type * p_reg, uint32_t mask);
285 
286 /**
287  * @brief Function for disabling interrupts from LPCOMP.
288  *
289  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
290  * @param[in] mask  Mask of interrupts to be disabled.
291  *                  Use @ref nrf_lpcomp_int_mask_t values for bit masking.
292  *
293  * @sa nrf_lpcomp_int_enable
294  * @sa nrf_lpcomp_int_enable_check
295  */
296 NRF_STATIC_INLINE void nrf_lpcomp_int_disable(NRF_LPCOMP_Type * p_reg, uint32_t mask);
297 
298 /**
299  * @brief Function for checking if the specified interrupts are enabled.
300  *
301  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
302  * @param[in] mask  Mask of interrupts to be checked.
303  *                  Use @ref nrf_lpcomp_int_mask_t values for bit masking.
304  *
305  * @return Mask of enabled interrupts.
306  */
307 NRF_STATIC_INLINE uint32_t nrf_lpcomp_int_enable_check(NRF_LPCOMP_Type const * p_reg,
308                                                        uint32_t                mask);
309 
310 #if defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
311 /**
312  * @brief Function for setting subscribe configuration for a given LPCOMP task.
313  *
314  * @param[in] p_reg   Pointer to the structure of registers of the peripheral.
315  * @param[in] task    Task for which the configuration is set.
316  * @param[in] channel Channel through which events are subscribed.
317  */
318 NRF_STATIC_INLINE void nrf_lpcomp_subscribe_set(NRF_LPCOMP_Type * p_reg,
319                                                 nrf_lpcomp_task_t task,
320                                                 uint8_t           channel);
321 
322 /**
323  * @brief Function for clearing subscribe configuration for a given LPCOMP task.
324  *
325  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
326  * @param[in] task  Task for which the configuration is cleared.
327  */
328 NRF_STATIC_INLINE void nrf_lpcomp_subscribe_clear(NRF_LPCOMP_Type * p_reg,
329                                                   nrf_lpcomp_task_t task);
330 
331 /**
332  * @brief Function for setting publish configuration for a given LPCOMP event.
333  *
334  * @param[in] p_reg   Pointer to the structure of registers of the peripheral.
335  * @param[in] event   Event for which the configuration is set.
336  * @param[in] channel Channel through which the event is published.
337  */
338 NRF_STATIC_INLINE void nrf_lpcomp_publish_set(NRF_LPCOMP_Type *  p_reg,
339                                               nrf_lpcomp_event_t event,
340                                               uint8_t            channel);
341 
342 /**
343  * @brief Function for clearing publish configuration for a given LPCOMP event.
344  *
345  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
346  * @param[in] event Event for which the configuration is cleared.
347  */
348 NRF_STATIC_INLINE void nrf_lpcomp_publish_clear(NRF_LPCOMP_Type *  p_reg,
349                                                 nrf_lpcomp_event_t event);
350 #endif // defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
351 
352 /**
353  * @brief Function for configuring LPCOMP.
354  *
355  * This function powers on LPCOMP and configures it. LPCOMP is in DISABLE state after configuration,
356  * so it must be enabled before using it. All shorts are inactive, events are cleared, and LPCOMP is stopped.
357  *
358  * @deprecated Use the dedicated functions instead.
359  *
360  * @param[in] p_reg    Pointer to the structure of registers of the peripheral.
361  * @param[in] p_config Configuration.
362  */
363 NRF_STATIC_INLINE void nrf_lpcomp_configure(NRF_LPCOMP_Type *           p_reg,
364                                             nrf_lpcomp_config_t const * p_config);
365 
366 /**
367  * @brief Function for setting the reference source.
368  *
369  * @param[in] p_reg     Pointer to the structure of registers of the peripheral.
370  * @param[in] reference LPCOMP reference selection.
371  */
372 NRF_STATIC_INLINE void nrf_lpcomp_ref_set(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_ref_t reference);
373 
374 /**
375  * @brief Function for setting the external analog reference source.
376  *
377  * To use external reference first call @ref nrf_lpcomp_ref_set with NRF_LPCOMP_REF_EXT_REF argument.
378  *
379  * @param[in] p_reg   Pointer to the structure of registers of the peripheral.
380  * @param[in] ext_ref LPCOMP external analog reference selection.
381  */
382 NRF_STATIC_INLINE void nrf_lpcomp_ext_ref_set(NRF_LPCOMP_Type *    p_reg,
383                                               nrf_lpcomp_ext_ref_t ext_ref);
384 
385 /**
386  * @brief Function for selecting an active LPCOMP input.
387  *
388  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
389  * @param[in] input Input to be selected.
390  */
391 NRF_STATIC_INLINE void nrf_lpcomp_input_select(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_input_t input);
392 
393 /**
394  * @brief Function for setting the detection type.
395  *
396  * @param[in] p_reg     Pointer to the structure of registers of the peripheral.
397  * @param[in] detection LPCOMP detection type.
398  */
399 NRF_STATIC_INLINE void nrf_lpcomp_detection_set(NRF_LPCOMP_Type *   p_reg,
400                                                 nrf_lpcomp_detect_t detection);
401 
402 #if NRF_LPCOMP_HAS_HYST
403 /**
404  * @brief Function for setting the hysteresis.
405  *
406  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
407  * @param[in] hyst  LPCOMP comparator hysteresis.
408  */
409 NRF_STATIC_INLINE void nrf_lpcomp_hysteresis_set(NRF_LPCOMP_Type * p_reg,
410                                                  nrf_lpcomp_hyst_t hyst);
411 #endif
412 
413 /**
414  * @brief Function for enabling the LPCOMP.
415  *
416  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
417  */
418 NRF_STATIC_INLINE void nrf_lpcomp_enable(NRF_LPCOMP_Type * p_reg);
419 
420 /**
421  * @brief Function for disabling the LPCOMP.
422  *
423  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
424  */
425 NRF_STATIC_INLINE void nrf_lpcomp_disable(NRF_LPCOMP_Type * p_reg);
426 
427 /**
428  * @brief Function for checking if the LPCOMP peripheral is enabled.
429  *
430  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
431  *
432  * @retval true  The LPCOMP peripheral is enabled.
433  * @retval false The LPCOMP peripheral is not enabled.
434  */
435 NRF_STATIC_INLINE bool nrf_lpcomp_enable_check(NRF_LPCOMP_Type * p_reg);
436 
437 /**
438  * @brief Function for getting the last LPCOMP compare result.
439  *
440  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
441  *
442  * @return The last compare result. If 0, then VIN+ < VIN-. If 1, then VIN- < VIN+.
443  */
444 NRF_STATIC_INLINE uint32_t nrf_lpcomp_result_get(NRF_LPCOMP_Type const * p_reg);
445 
446 #ifndef NRF_DECLARE_ONLY
447 
nrf_lpcomp_task_trigger(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_task_t task)448 NRF_STATIC_INLINE void nrf_lpcomp_task_trigger(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_task_t task)
449 {
450     *( (volatile uint32_t *)( (uint8_t *)p_reg + (uint32_t)task) ) = 1;
451 }
452 
nrf_lpcomp_task_address_get(NRF_LPCOMP_Type const * p_reg,nrf_lpcomp_task_t task)453 NRF_STATIC_INLINE uint32_t nrf_lpcomp_task_address_get(NRF_LPCOMP_Type const * p_reg,
454                                                        nrf_lpcomp_task_t       task)
455 {
456     return nrf_task_event_address_get(p_reg, task);
457 }
458 
nrf_lpcomp_event_check(NRF_LPCOMP_Type const * p_reg,nrf_lpcomp_event_t event)459 NRF_STATIC_INLINE bool nrf_lpcomp_event_check(NRF_LPCOMP_Type const * p_reg,
460                                               nrf_lpcomp_event_t      event)
461 {
462     return nrf_event_check(p_reg, event);
463 }
464 
nrf_lpcomp_event_clear(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_event_t event)465 NRF_STATIC_INLINE void nrf_lpcomp_event_clear(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_event_t event)
466 {
467     *( (volatile uint32_t *)( (uint8_t *)p_reg + (uint32_t)event) ) = 0;
468     nrf_event_readback((uint8_t *)p_reg + (uint32_t)event);
469 }
470 
nrf_lpcomp_event_address_get(NRF_LPCOMP_Type const * p_reg,nrf_lpcomp_event_t event)471 NRF_STATIC_INLINE uint32_t nrf_lpcomp_event_address_get(NRF_LPCOMP_Type const * p_reg,
472                                                         nrf_lpcomp_event_t      event)
473 {
474     return nrf_task_event_address_get(p_reg, event);
475 }
476 
nrf_lpcomp_shorts_enable(NRF_LPCOMP_Type * p_reg,uint32_t mask)477 NRF_STATIC_INLINE void nrf_lpcomp_shorts_enable(NRF_LPCOMP_Type * p_reg, uint32_t mask)
478 {
479     p_reg->SHORTS |= mask;
480 }
481 
nrf_lpcomp_shorts_disable(NRF_LPCOMP_Type * p_reg,uint32_t mask)482 NRF_STATIC_INLINE void nrf_lpcomp_shorts_disable(NRF_LPCOMP_Type * p_reg, uint32_t mask)
483 {
484     p_reg->SHORTS &= ~mask;
485 }
486 
nrf_lpcomp_shorts_set(NRF_LPCOMP_Type * p_reg,uint32_t mask)487 NRF_STATIC_INLINE void nrf_lpcomp_shorts_set(NRF_LPCOMP_Type * p_reg, uint32_t mask)
488 {
489     p_reg->SHORTS = mask;
490 }
491 
nrf_lpcomp_int_enable(NRF_LPCOMP_Type * p_reg,uint32_t mask)492 NRF_STATIC_INLINE void nrf_lpcomp_int_enable(NRF_LPCOMP_Type * p_reg, uint32_t mask)
493 {
494     p_reg->INTENSET = mask;
495 }
496 
nrf_lpcomp_int_disable(NRF_LPCOMP_Type * p_reg,uint32_t mask)497 NRF_STATIC_INLINE void nrf_lpcomp_int_disable(NRF_LPCOMP_Type * p_reg, uint32_t mask)
498 {
499     p_reg->INTENCLR = mask;
500 }
501 
nrf_lpcomp_int_enable_check(NRF_LPCOMP_Type const * p_reg,uint32_t mask)502 NRF_STATIC_INLINE uint32_t nrf_lpcomp_int_enable_check(NRF_LPCOMP_Type const * p_reg,
503                                                        uint32_t                mask)
504 {
505     return p_reg->INTENSET & mask; // when read this register will return the value of INTEN.
506 }
507 
508 #if defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
nrf_lpcomp_subscribe_set(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_task_t task,uint8_t channel)509 NRF_STATIC_INLINE void nrf_lpcomp_subscribe_set(NRF_LPCOMP_Type * p_reg,
510                                                 nrf_lpcomp_task_t task,
511                                                 uint8_t           channel)
512 {
513     *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) =
514             ((uint32_t)channel | NRF_SUBSCRIBE_PUBLISH_ENABLE);
515 }
516 
nrf_lpcomp_subscribe_clear(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_task_t task)517 NRF_STATIC_INLINE void nrf_lpcomp_subscribe_clear(NRF_LPCOMP_Type * p_reg,
518                                                   nrf_lpcomp_task_t task)
519 {
520     *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) = 0;
521 }
522 
nrf_lpcomp_publish_set(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_event_t event,uint8_t channel)523 NRF_STATIC_INLINE void nrf_lpcomp_publish_set(NRF_LPCOMP_Type *  p_reg,
524                                               nrf_lpcomp_event_t event,
525                                               uint8_t            channel)
526 {
527     *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) event + 0x80uL)) =
528             ((uint32_t)channel | NRF_SUBSCRIBE_PUBLISH_ENABLE);
529 }
530 
nrf_lpcomp_publish_clear(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_event_t event)531 NRF_STATIC_INLINE void nrf_lpcomp_publish_clear(NRF_LPCOMP_Type *  p_reg,
532                                                 nrf_lpcomp_event_t event)
533 {
534     *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) event + 0x80uL)) = 0;
535 }
536 #endif // defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
537 
nrf_lpcomp_configure(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_config_t const * p_config)538 NRF_STATIC_INLINE void nrf_lpcomp_configure(NRF_LPCOMP_Type *           p_reg,
539                                             nrf_lpcomp_config_t const * p_config)
540 {
541     p_reg->REFSEL = (p_config->reference << LPCOMP_REFSEL_REFSEL_Pos) & LPCOMP_REFSEL_REFSEL_Msk;
542 
543 #if !NRF_LPCOMP_HAS_AIN_AS_PIN
544     //If external source is choosen extract analog reference index.
545     if ((p_config->reference & LPCOMP_REFSEL_REFSEL_ARef)==LPCOMP_REFSEL_REFSEL_ARef)
546     {
547         uint32_t extref  = p_config->reference >> 16;
548         p_reg->EXTREFSEL = (extref << LPCOMP_EXTREFSEL_EXTREFSEL_Pos) &
549                            LPCOMP_EXTREFSEL_EXTREFSEL_Msk;
550     }
551 #endif
552 
553     p_reg->ANADETECT = (p_config->detection << LPCOMP_ANADETECT_ANADETECT_Pos) &
554                        LPCOMP_ANADETECT_ANADETECT_Msk;
555 #if NRF_LPCOMP_HAS_HYST
556     p_reg->HYST      = ((p_config->hyst) << LPCOMP_HYST_HYST_Pos) & LPCOMP_HYST_HYST_Msk;
557 #endif
558 }
559 
nrf_lpcomp_ref_set(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_ref_t reference)560 NRF_STATIC_INLINE void nrf_lpcomp_ref_set(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_ref_t reference)
561 {
562     p_reg->REFSEL = (reference << LPCOMP_REFSEL_REFSEL_Pos) & LPCOMP_REFSEL_REFSEL_Msk;
563 }
564 
nrf_lpcomp_ext_ref_set(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_ext_ref_t ext_ref)565 NRF_STATIC_INLINE void nrf_lpcomp_ext_ref_set(NRF_LPCOMP_Type *    p_reg,
566                                               nrf_lpcomp_ext_ref_t ext_ref)
567 {
568 #if NRF_LPCOMP_HAS_AIN_AS_PIN
569     p_reg->EXTREFSEL = ((NRF_PIN_NUMBER_TO_PIN(ext_ref) << LPCOMP_EXTREFSEL_PIN_Pos) &
570                         LPCOMP_EXTREFSEL_PIN_Msk)
571                         | ((NRF_PIN_NUMBER_TO_PORT(ext_ref) << LPCOMP_EXTREFSEL_PORT_Pos) &
572                         LPCOMP_EXTREFSEL_PORT_Msk);
573 #else
574     p_reg->EXTREFSEL = (ext_ref << LPCOMP_EXTREFSEL_EXTREFSEL_Pos) &
575                        LPCOMP_EXTREFSEL_EXTREFSEL_Msk;
576 #endif
577 }
578 
nrf_lpcomp_input_select(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_input_t input)579 NRF_STATIC_INLINE void nrf_lpcomp_input_select(NRF_LPCOMP_Type * p_reg, nrf_lpcomp_input_t input)
580 {
581 #if NRF_LPCOMP_HAS_AIN_AS_PIN
582     p_reg->PSEL = (NRF_PIN_NUMBER_TO_PORT(input) << LPCOMP_PSEL_PORT_Pos) |
583                   (NRF_PIN_NUMBER_TO_PIN(input) << LPCOMP_PSEL_PIN_Pos) |
584                   (p_reg->PSEL & ~(LPCOMP_PSEL_PORT_Msk | LPCOMP_PSEL_PIN_Msk));
585 #else
586     p_reg->PSEL = ((uint32_t)input << LPCOMP_PSEL_PSEL_Pos) | (p_reg->PSEL & ~LPCOMP_PSEL_PSEL_Msk);
587 #endif
588 }
589 
nrf_lpcomp_detection_set(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_detect_t detection)590 NRF_STATIC_INLINE void nrf_lpcomp_detection_set(NRF_LPCOMP_Type *   p_reg,
591                                                 nrf_lpcomp_detect_t detection)
592 {
593     p_reg->ANADETECT = (detection << LPCOMP_ANADETECT_ANADETECT_Pos) &
594                        LPCOMP_ANADETECT_ANADETECT_Msk;
595 }
596 
597 #if NRF_LPCOMP_HAS_HYST
nrf_lpcomp_hysteresis_set(NRF_LPCOMP_Type * p_reg,nrf_lpcomp_hyst_t hyst)598 NRF_STATIC_INLINE void nrf_lpcomp_hysteresis_set(NRF_LPCOMP_Type * p_reg,
599                                                  nrf_lpcomp_hyst_t hyst)
600 {
601     p_reg->HYST = ((hyst) << LPCOMP_HYST_HYST_Pos) & LPCOMP_HYST_HYST_Msk;
602 }
603 #endif
604 
nrf_lpcomp_enable(NRF_LPCOMP_Type * p_reg)605 NRF_STATIC_INLINE void nrf_lpcomp_enable(NRF_LPCOMP_Type * p_reg)
606 {
607     p_reg->ENABLE = LPCOMP_ENABLE_ENABLE_Enabled << LPCOMP_ENABLE_ENABLE_Pos;
608 }
609 
nrf_lpcomp_disable(NRF_LPCOMP_Type * p_reg)610 NRF_STATIC_INLINE void nrf_lpcomp_disable(NRF_LPCOMP_Type * p_reg)
611 {
612     p_reg->ENABLE = LPCOMP_ENABLE_ENABLE_Disabled << LPCOMP_ENABLE_ENABLE_Pos;
613 }
614 
nrf_lpcomp_enable_check(NRF_LPCOMP_Type * p_reg)615 NRF_STATIC_INLINE bool nrf_lpcomp_enable_check(NRF_LPCOMP_Type * p_reg)
616 {
617     return ((p_reg->ENABLE) & LPCOMP_ENABLE_ENABLE_Enabled) >> LPCOMP_ENABLE_ENABLE_Pos;
618 }
619 
nrf_lpcomp_result_get(NRF_LPCOMP_Type const * p_reg)620 NRF_STATIC_INLINE uint32_t nrf_lpcomp_result_get(NRF_LPCOMP_Type const * p_reg)
621 {
622     return (uint32_t)p_reg->RESULT;
623 }
624 
625 #endif // NRF_DECLARE_ONLY
626 
627 /** @} */
628 
629 #ifdef __cplusplus
630 }
631 #endif
632 
633 #endif // NRF_LPCOMP_H_
634