1 /***************************************************************************//**
2 * @file
3 * @brief System Real Time Counter (SYSRTC) Peripheral API
4 *******************************************************************************
5 * # License
6 * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
7 *******************************************************************************
8 *
9 * SPDX-License-Identifier: Zlib
10 *
11 * The licensor of this software is Silicon Laboratories Inc.
12 *
13 * This software is provided 'as-is', without any express or implied
14 * warranty. In no event will the authors be held liable for any damages
15 * arising from the use of this software.
16 *
17 * Permission is granted to anyone to use this software for any purpose,
18 * including commercial applications, and to alter it and redistribute it
19 * freely, subject to the following restrictions:
20 *
21 * 1. The origin of this software must not be misrepresented; you must not
22 * claim that you wrote the original software. If you use this software
23 * in a product, an acknowledgment in the product documentation would be
24 * appreciated but is not required.
25 * 2. Altered source versions must be plainly marked as such, and must not be
26 * misrepresented as being the original software.
27 * 3. This notice may not be removed or altered from any source distribution.
28 *
29 ******************************************************************************/
30
31 #include "sl_hal_sysrtc.h"
32 #if defined(SYSRTC_COUNT) && (SYSRTC_COUNT > 0)
33 #include "sl_assert.h"
34 #include "stddef.h"
35
36 /***************************************************************************//**
37 * @addtogroup sysrtc SYSRTC - System Real Time Counter
38 * @brief System Real Time Counter (SYSRTC) Peripheral API
39 * @details
40 * This module contains functions to control the SYSRTC peripheral of Silicon
41 * Labs 32-bit MCUs and SoCs. The SYSRTC ensures timekeeping in low energy modes.
42 * @{
43 ******************************************************************************/
44
45 /*******************************************************************************
46 ************************** GLOBAL FUNCTIONS *******************************
47 ******************************************************************************/
48
49 extern __INLINE void sl_hal_sysrtc_wait_sync(void);
50 extern __INLINE void sl_hal_sysrtc_wait_ready(void);
51 extern __INLINE void sl_hal_sysrtc_start(void);
52 extern __INLINE void sl_hal_sysrtc_stop(void);
53 extern __INLINE uint32_t sl_hal_sysrtc_get_status(void);
54 extern __INLINE void sl_hal_sysrtc_lock(void);
55 extern __INLINE void sl_hal_sysrtc_unlock(void);
56 extern __INLINE uint32_t sl_hal_sysrtc_get_counter(void);
57 extern __INLINE void sl_hal_sysrtc_set_counter(uint32_t value);
58
59 /***************************************************************************//**
60 * Initializes SYSRTC module.
61 ******************************************************************************/
sl_hal_sysrtc_init(const sl_hal_sysrtc_config_t * p_config)62 void sl_hal_sysrtc_init(const sl_hal_sysrtc_config_t *p_config)
63 {
64 // Wait to be ready
65 sl_hal_sysrtc_wait_ready();
66
67 if (SYSRTC0->EN == SYSRTC_EN_EN) {
68 // Disable the module
69 sl_hal_sysrtc_disable();
70 // Wait to be ready
71 sl_hal_sysrtc_wait_ready();
72 }
73
74 // Set configuration
75 SYSRTC0->CFG = (p_config->enable_debug_run ? 1UL : 0UL) << _SYSRTC_CFG_DEBUGRUN_SHIFT;
76 }
77
78 /***************************************************************************//**
79 * Enables SYSRTC counting.
80 ******************************************************************************/
sl_hal_sysrtc_enable(void)81 void sl_hal_sysrtc_enable(void)
82 {
83 // Wait if disabling
84 sl_hal_sysrtc_wait_ready();
85
86 // Enable SYSRTC module
87 SYSRTC0->EN_SET = SYSRTC_EN_EN;
88
89 // Start counter
90 SYSRTC0->CMD = SYSRTC_CMD_START;
91 }
92
93 /***************************************************************************//**
94 * Disables SYSRTC counting.
95 ******************************************************************************/
sl_hal_sysrtc_disable(void)96 void sl_hal_sysrtc_disable(void)
97 {
98 if (SYSRTC0->EN != SYSRTC_EN_EN) {
99 return;
100 }
101
102 // Stop counter
103 sl_hal_sysrtc_stop();
104
105 // Disable module
106 SYSRTC0->EN_CLR = SYSRTC_EN_EN;
107 }
108
109 /***************************************************************************//**
110 * Restores SYSRTC to its reset state.
111 ******************************************************************************/
sl_hal_sysrtc_reset(void)112 void sl_hal_sysrtc_reset(void)
113 {
114 // Reset timer
115 SYSRTC0->SWRST = SYSRTC_SWRST_SWRST;
116 }
117
118 /***************************************************************************//**
119 * Initializes the selected SYSRTC group.
120 ******************************************************************************/
sl_hal_sysrtc_init_group(uint8_t group_number,sl_hal_sysrtc_group_config_t const * p_group_config)121 void sl_hal_sysrtc_init_group(uint8_t group_number,
122 sl_hal_sysrtc_group_config_t const *p_group_config)
123 {
124 uint32_t temp = 0;
125
126 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
127
128 switch (group_number) {
129 case 0:
130 temp = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP0_CTRL_CMP0EN_SHIFT);
131 if (p_group_config->p_compare_channel0_config != NULL) {
132 temp |= ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP0_CTRL_CMP0CMOA_SHIFT);
133 }
134
135 #ifdef SYSRTC_GRP0_CTRL_CMP1EN
136 temp |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP0_CTRL_CMP1EN_SHIFT);
137 if (p_group_config->p_compare_channel1_config != NULL) {
138 temp |= ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP0_CTRL_CMP1CMOA_SHIFT);
139 }
140 #endif
141 #ifdef SYSRTC_GRP0_CTRL_CAP0EN
142 temp |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP0_CTRL_CAP0EN_SHIFT);
143 if (p_group_config->p_capture_channel0_config != NULL) {
144 temp |= ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP0_CTRL_CAP0EDGE_SHIFT);
145 }
146 #endif
147 SYSRTC0->GRP0_CTRL = temp;
148 break;
149
150 #if SYSRTC_GROUP_NUMBER > 1
151 case 1:
152 temp = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP1_CTRL_CMP0EN_SHIFT);
153 if (p_group_config->p_compare_channel0_config != NULL) {
154 temp |= ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP1_CTRL_CMP0CMOA_SHIFT);
155 }
156 #ifdef SYSRTC_GRP1_CTRL_CMP1EN
157 temp |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP1_CTRL_CMP1EN_SHIFT);
158 if (p_group_config->p_compare_channel1_config != NULL) {
159 temp |= ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP1_CTRL_CMP1CMOA_SHIFT);
160 }
161 #endif
162 #ifdef SYSRTC_GRP1_CTRL_CAP0EN
163 temp |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP1_CTRL_CAP0EN_SHIFT);
164 if (p_group_config->p_capture_channel0_config != NULL) {
165 temp |= ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP1_CTRL_CAP0EDGE_SHIFT);
166 }
167 #endif
168 SYSRTC0->GRP1_CTRL = temp;
169 break;
170
171 #if SYSRTC_GROUP_NUMBER > 2
172 case 2:
173 // SYSRTC0->GRP2_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP2_CTRL_CMP0EN_SHIFT)
174 // | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP2_CTRL_CMP0CMOA_SHIFT);
175 #ifdef SYSRTC_GRP2_CTRL_CMP1EN
176 SYSRTC0->GRP2_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP2_CTRL_CMP1EN_SHIFT)
177 | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP2_CTRL_CMP1CMOA_SHIFT);
178 #endif
179 #ifdef SYSRTC_GRP2_CTRL_CAP0EN
180 SYSRTC0->GRP2_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP2_CTRL_CAP0EN_SHIFT)
181 | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP2_CTRL_CAP0EDGE_SHIFT);
182 #endif
183 break;
184
185 #if SYSRTC_GROUP_NUMBER > 3
186 case 3:
187 SYSRTC0->GRP3_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP3_CTRL_CMP0EN_SHIFT)
188 | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP3_CTRL_CMP0CMOA_SHIFT);
189 #ifdef SYSRTC_GRP3_CTRL_CMP1EN
190 SYSRTC0->GRP3_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP3_CTRL_CMP1EN_SHIFT)
191 | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP3_CTRL_CMP1CMOA_SHIFT);
192 #endif
193 #ifdef SYSRTC_GRP3_CTRL_CAP0EN
194 SYSRTC0->GRP3_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP3_CTRL_CAP0EN_SHIFT)
195 | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP3_CTRL_CAP0EDGE_SHIFT);
196 #endif
197 break;
198
199 #if SYSRTC_GROUP_NUMBER > 4
200 case 4:
201 SYSRTC0->GRP4_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP4_CTRL_CMP0EN_SHIFT)
202 | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP4_CTRL_CMP0CMOA_SHIFT);
203 #ifdef SYSRTC_GRP4_CTRL_CMP1EN
204 SYSRTC0->GRP4_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP4_CTRL_CMP1EN_SHIFT)
205 | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP4_CTRL_CMP1CMOA_SHIFT);
206 #endif
207 #ifdef SYSRTC_GRP4_CTRL_CAP0EN
208 SYSRTC0->GRP4_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP4_CTRL_CAP0EN_SHIFT)
209 | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP4_CTRL_CAP0EDGE_SHIFT);
210 #endif
211 break;
212
213 #if SYSRTC_GROUP_NUMBER > 5
214 case 5:
215 SYSRTC0->GRP5_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP5_CTRL_CMP0EN_SHIFT)
216 | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP5_CTRL_CMP0CMOA_SHIFT);
217 #ifdef SYSRTC_GRP5_CTRL_CMP1EN
218 SYSRTC0->GRP5_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP5_CTRL_CMP1EN_SHIFT)
219 | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP5_CTRL_CMP1CMOA_SHIFT);
220 #endif
221 #ifdef SYSRTC_GRP5_CTRL_CAP0EN
222 SYSRTC0->GRP5_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP5_CTRL_CAP0EN_SHIFT)
223 | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP5_CTRL_CAP0EDGE_SHIFT);
224 #endif
225 break;
226
227 #if SYSRTC_GROUP_NUMBER > 6
228 case 6:
229 SYSRTC0->GRP6_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP6_CTRL_CMP0EN_SHIFT)
230 | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP6_CTRL_CMP0CMOA_SHIFT);
231 #ifdef SYSRTC_GRP6_CTRL_CMP1EN
232 SYSRTC0->GRP6_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP6_CTRL_CMP1EN_SHIFT)
233 | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP6_CTRL_CMP1CMOA_SHIFT);
234 #endif
235 #ifdef SYSRTC_GRP6_CTRL_CAP0EN
236 SYSRTC0->GRP6_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP6_CTRL_CAP0EN_SHIFT)
237 | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP6_CTRL_CAP0EDGE_SHIFT);
238 #endif
239 break;
240
241 #if SYSRTC_GROUP_NUMBER > 7
242 case 7:
243 SYSRTC0->GRP7_CTRL = ((p_group_config->compare_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP7_CTRL_CMP0EN_SHIFT)
244 | ((uint32_t)p_group_config->p_compare_channel0_config->compare_match_out_action << _SYSRTC_GRP7_CTRL_CMP0CMOA_SHIFT);
245 #ifdef SYSRTC_GRP7_CTRL_CMP1EN
246 SYSRTC0->GRP7_CTRL |= ((p_group_config->compare_channel1_enable ? 1UL : 0UL) << _SYSRTC_GRP7_CTRL_CMP1EN_SHIFT)
247 | ((uint32_t)p_group_config->p_compare_channel1_config->compare_match_out_action << _SYSRTC_GRP7_CTRL_CMP1CMOA_SHIFT);
248 #endif
249 #ifdef SYSRTC_GRP7_CTRL_CAP0EN
250 SYSRTC0->GRP7_CTRL |= ((p_group_config->capture_channel0_enable ? 1UL : 0UL) << _SYSRTC_GRP7_CTRL_CAP0EN_SHIFT)
251 | ((uint32_t)p_group_config->p_capture_channel0_config->capture_input_edge << _SYSRTC_GRP7_CTRL_CAP0EDGE_SHIFT);
252 #endif
253 break;
254 #endif
255 #endif
256 #endif
257 #endif
258 #endif
259 #endif
260 #endif
261
262 default:
263 EFM_ASSERT(1);
264 }
265 }
266
267 /***************************************************************************//**
268 * Enables one or more SYSRTC interrupts for the given group.
269 ******************************************************************************/
sl_hal_sysrtc_enable_group_interrupts(uint8_t group_number,uint32_t flags)270 void sl_hal_sysrtc_enable_group_interrupts(uint8_t group_number,
271 uint32_t flags)
272 {
273 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
274
275 switch (group_number) {
276 case 0:
277 SYSRTC0->GRP0_IEN_SET = flags;
278 break;
279
280 #if SYSRTC_GROUP_NUMBER > 1
281 case 1:
282 SYSRTC0->GRP1_IEN_SET = flags;
283 break;
284
285 #if SYSRTC_GROUP_NUMBER > 2
286 case 2:
287 SYSRTC0->GRP2_IEN_SET = flags;
288 break;
289
290 #if SYSRTC_GROUP_NUMBER > 3
291 case 3:
292 SYSRTC0->GRP3_IEN_SET = flags;
293 break;
294
295 #if SYSRTC_GROUP_NUMBER > 4
296 case 4:
297 SYSRTC0->GRP4_IEN_SET = flags;
298 break;
299
300 #if SYSRTC_GROUP_NUMBER > 5
301 case 5:
302 SYSRTC0->GRP5_IEN_SET = flags;
303 break;
304
305 #if SYSRTC_GROUP_NUMBER > 6
306 case 6:
307 SYSRTC0->GRP6_IEN_SET = flags;
308 break;
309
310 #if SYSRTC_GROUP_NUMBER > 7
311 case 7:
312 SYSRTC0->GRP7_IEN_SET = flags;
313 break;
314 #endif
315 #endif
316 #endif
317 #endif
318 #endif
319 #endif
320 #endif
321
322 default:
323 EFM_ASSERT(1);
324 }
325 }
326
327 /***************************************************************************//**
328 * Disables one or more SYSRTC interrupts for the given group.
329 ******************************************************************************/
sl_hal_sysrtc_disable_group_interrupts(uint8_t group_number,uint32_t flags)330 void sl_hal_sysrtc_disable_group_interrupts(uint8_t group_number,
331 uint32_t flags)
332 {
333 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
334
335 switch (group_number) {
336 case 0:
337 SYSRTC0->GRP0_IEN_CLR = flags;
338 break;
339
340 #if SYSRTC_GROUP_NUMBER > 1
341 case 1:
342 SYSRTC0->GRP1_IEN_CLR = flags;
343 break;
344
345 #if SYSRTC_GROUP_NUMBER > 2
346 case 2:
347 SYSRTC0->GRP2_IEN_CLR = flags;
348 break;
349
350 #if SYSRTC_GROUP_NUMBER > 3
351 case 3:
352 SYSRTC0->GRP3_IEN_CLR = flags;
353 break;
354
355 #if SYSRTC_GROUP_NUMBER > 4
356 case 4:
357 SYSRTC0->GRP4_IEN_CLR = flags;
358 break;
359
360 #if SYSRTC_GROUP_NUMBER > 5
361 case 5:
362 SYSRTC0->GRP5_IEN_CLR = flags;
363 break;
364
365 #if SYSRTC_GROUP_NUMBER > 6
366 case 6:
367 SYSRTC0->GRP6_IEN_CLR = flags;
368 break;
369
370 #if SYSRTC_GROUP_NUMBER > 7
371 case 7:
372 SYSRTC0->GRP7_IEN_CLR = flags;
373 break;
374 #endif
375 #endif
376 #endif
377 #endif
378 #endif
379 #endif
380 #endif
381
382 default:
383 EFM_ASSERT(1);
384 }
385 }
386
387 /***************************************************************************//**
388 * Clears one or more pending SYSRTC interrupts for the given group.
389 ******************************************************************************/
sl_hal_sysrtc_clear_group_interrupts(uint8_t group_number,uint32_t flags)390 void sl_hal_sysrtc_clear_group_interrupts(uint8_t group_number,
391 uint32_t flags)
392 {
393 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
394
395 switch (group_number) {
396 case 0:
397 SYSRTC0->GRP0_IF_CLR = flags;
398 break;
399
400 #if SYSRTC_GROUP_NUMBER > 1
401 case 1:
402 SYSRTC0->GRP1_IF_CLR = flags;
403 break;
404
405 #if SYSRTC_GROUP_NUMBER > 2
406 case 2:
407 SYSRTC0->GRP2_IF_CLR = flags;
408 break;
409
410 #if SYSRTC_GROUP_NUMBER > 3
411 case 3:
412 SYSRTC0->GRP3_IF_CLR = flags;
413 break;
414
415 #if SYSRTC_GROUP_NUMBER > 4
416 case 4:
417 SYSRTC0->GRP4_IF_CLR = flags;
418 break;
419
420 #if SYSRTC_GROUP_NUMBER > 5
421 case 5:
422 SYSRTC0->GRP5_IF_CLR = flags;
423 break;
424
425 #if SYSRTC_GROUP_NUMBER > 6
426 case 6:
427 SYSRTC0->GRP6_IF_CLR = flags;
428 break;
429
430 #if SYSRTC_GROUP_NUMBER > 7
431 case 7:
432 SYSRTC0->GRP7_IF_CLR = flags;
433 break;
434 #endif
435 #endif
436 #endif
437 #endif
438 #endif
439 #endif
440 #endif
441
442 default:
443 EFM_ASSERT(1);
444 }
445 }
446
447 /***************************************************************************//**
448 * Gets pending SYSRTC interrupt flags for the given group.
449 ******************************************************************************/
sl_hal_sysrtc_get_group_interrupts(uint8_t group_number)450 uint32_t sl_hal_sysrtc_get_group_interrupts(uint8_t group_number)
451 {
452 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
453
454 switch (group_number) {
455 case 0:
456 return SYSRTC0->GRP0_IF;
457
458 #if SYSRTC_GROUP_NUMBER > 1
459 case 1:
460 return SYSRTC0->GRP1_IF;
461
462 #if SYSRTC_GROUP_NUMBER > 2
463 case 2:
464 return SYSRTC0->GRP2_IF;
465
466 #if SYSRTC_GROUP_NUMBER > 3
467 case 3:
468 return SYSRTC0->GRP3_IF;
469
470 #if SYSRTC_GROUP_NUMBER > 4
471 case 4:
472 return SYSRTC0->GRP4_IF;
473
474 #if SYSRTC_GROUP_NUMBER > 5
475 case 5:
476 return SYSRTC0->GRP5_IF;
477
478 #if SYSRTC_GROUP_NUMBER > 6
479 case 6:
480 return SYSRTC0->GRP6_IF;
481
482 #if SYSRTC_GROUP_NUMBER > 7
483 case 7:
484 return SYSRTC0->GRP7_IF;
485 #endif
486 #endif
487 #endif
488 #endif
489 #endif
490 #endif
491 #endif
492
493 default:
494 EFM_ASSERT(1);
495 return 0;
496 }
497 }
498
499 /***************************************************************************//**
500 * Gets enabled and pending SYSRTC interrupt flags.
501 ******************************************************************************/
sl_hal_sysrtc_get_group_enabled_interrupts(uint8_t group_number)502 uint32_t sl_hal_sysrtc_get_group_enabled_interrupts(uint8_t group_number)
503 {
504 uint32_t ien = 0;
505
506 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
507
508 switch (group_number) {
509 case 0:
510 ien = SYSRTC0->GRP0_IEN;
511 return SYSRTC0->GRP0_IF & ien;
512
513 #if SYSRTC_GROUP_NUMBER > 1
514 case 1:
515 ien = SYSRTC0->GRP1_IEN;
516 return SYSRTC0->GRP1_IF & ien;
517
518 #if SYSRTC_GROUP_NUMBER > 2
519 case 2:
520 ien = SYSRTC0->GRP2_IEN;
521 return SYSRTC0->GRP2_IF & ien;
522
523 #if SYSRTC_GROUP_NUMBER > 3
524 case 3:
525 ien = SYSRTC0->GRP3_IEN;
526 return SYSRTC0->GRP3_IF & ien;
527
528 #if SYSRTC_GROUP_NUMBER > 4
529 case 4:
530 ien = SYSRTC0->GRP4_IEN;
531 return SYSRTC0->GRP4_IF & ien;
532
533 #if SYSRTC_GROUP_NUMBER > 5
534 case 5:
535 ien = SYSRTC0->GRP5_IEN;
536 return SYSRTC0->GRP5_IF & ien;
537
538 #if SYSRTC_GROUP_NUMBER > 6
539 case 6:
540 ien = SYSRTC0->GRP6_IEN;
541 return SYSRTC0->GRP6_IF & ien;
542
543 #if SYSRTC_GROUP_NUMBER > 7
544 case 7:
545 ien = SYSRTC0->GRP7_IEN;
546 return SYSRTC0->GRP7_IF & ien;
547 #endif
548 #endif
549 #endif
550 #endif
551 #endif
552 #endif
553 #endif
554
555 default:
556 EFM_ASSERT(1);
557 return 0;
558 }
559 }
560
561 /***************************************************************************//**
562 * Sets one or more pending SYSRTC interrupts for the given group from Software.
563 ******************************************************************************/
sl_hal_sysrtc_set_group_interrupts(uint8_t group_number,uint32_t flags)564 void sl_hal_sysrtc_set_group_interrupts(uint8_t group_number,
565 uint32_t flags)
566 {
567 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
568
569 switch (group_number) {
570 case 0:
571 SYSRTC0->GRP0_IF_SET = flags;
572 break;
573
574 #if SYSRTC_GROUP_NUMBER > 1
575 case 1:
576 SYSRTC0->GRP1_IF_SET = flags;
577 break;
578
579 #if SYSRTC_GROUP_NUMBER > 2
580 case 2:
581 SYSRTC0->GRP2_IF_SET = flags;
582 break;
583
584 #if SYSRTC_GROUP_NUMBER > 3
585 case 3:
586 SYSRTC0->GRP3_IF_SET = flags;
587 break;
588
589 #if SYSRTC_GROUP_NUMBER > 4
590 case 4:
591 SYSRTC0->GRP4_IF_SET = flags;
592 break;
593
594 #if SYSRTC_GROUP_NUMBER > 5
595 case 5:
596 SYSRTC0->GRP5_IF_SET = flags;
597 break;
598
599 #if SYSRTC_GROUP_NUMBER > 6
600 case 6:
601 SYSRTC0->GRP6_IF_SET = flags;
602 break;
603
604 #if SYSRTC_GROUP_NUMBER > 7
605 case 7:
606 SYSRTC0->GRP7_IF_SET = flags;
607 break;
608 #endif
609 #endif
610 #endif
611 #endif
612 #endif
613 #endif
614 #endif
615
616 default:
617 EFM_ASSERT(1);
618 }
619 }
620
621 /***************************************************************************//**
622 * Gets SYSRTC compare register value for selected channel of given group.
623 ******************************************************************************/
sl_hal_sysrtc_get_group_compare_channel_value(uint8_t group_number,uint8_t channel)624 uint32_t sl_hal_sysrtc_get_group_compare_channel_value(uint8_t group_number,
625 uint8_t channel)
626 {
627 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
628
629 switch (group_number) {
630 case 0:
631 switch (channel) {
632 case 0:
633 return SYSRTC0->GRP0_CMP0VALUE;
634
635 #ifdef SYSRTC_GRP0_CTRL_CMP1EN
636 case 1:
637 return SYSRTC0->GRP0_CMP1VALUE;
638 #endif
639
640 default:
641 EFM_ASSERT(1);
642 return 0;
643 }
644 break;
645
646 #if SYSRTC_GROUP_NUMBER > 1
647 case 1:
648 switch (channel) {
649 case 0:
650 return SYSRTC0->GRP1_CMP0VALUE;
651
652 #ifdef SYSRTC_GRP1_CTRL_CMP1EN
653 case 1:
654 return SYSRTC0->GRP1_CMP1VALUE;
655 #endif
656
657 default:
658 EFM_ASSERT(1);
659 return 0;
660 }
661 break;
662
663 #if SYSRTC_GROUP_NUMBER > 2
664 case 2:
665 switch (channel) {
666 case 0:
667 return SYSRTC0->GRP2_CMP0VALUE;
668
669 #ifdef SYSRTC_GRP2_CTRL_CMP1EN
670 case 1:
671 return SYSRTC0->GRP2_CMP1VALUE;
672 #endif
673
674 default:
675 EFM_ASSERT(1);
676 return 0;
677 }
678 break;
679
680 #if SYSRTC_GROUP_NUMBER > 3
681 case 3:
682 switch (channel) {
683 case 0:
684 return SYSRTC0->GRP3_CMP0VALUE;
685
686 #ifdef SYSRTC_GRP3_CTRL_CMP1EN
687 case 1:
688 return SYSRTC0->GRP3_CMP1VALUE;
689 #endif
690
691 default:
692 EFM_ASSERT(1);
693 return 0;
694 }
695 break;
696
697 #if SYSRTC_GROUP_NUMBER > 4
698 case 4:
699 switch (channel) {
700 case 0:
701 return SYSRTC0->GRP4_CMP0VALUE;
702
703 #ifdef SYSRTC_GRP4_CTRL_CMP1EN
704 case 1:
705 return SYSRTC0->GRP4_CMP1VALUE;
706 #endif
707
708 default:
709 EFM_ASSERT(1);
710 return 0;
711 }
712 break;
713
714 #if SYSRTC_GROUP_NUMBER > 5
715 case 5:
716 switch (channel) {
717 case 0:
718 return SYSRTC0->GRP5_CMP0VALUE;
719
720 #ifdef SYSRTC_GRP5_CTRL_CMP1EN
721 case 1:
722 return SYSRTC0->GRP5_CMP1VALUE;
723 #endif
724
725 default:
726 EFM_ASSERT(1);
727 return 0;
728 }
729 break;
730
731 #if SYSRTC_GROUP_NUMBER > 6
732 case 6:
733 switch (channel) {
734 case 0:
735 return SYSRTC0->GRP6_CMP0VALUE;
736
737 #ifdef SYSRTC_GRP6_CTRL_CMP1EN
738 case 1:
739 return SYSRTC0->GRP6_CMP1VALUE;
740 #endif
741
742 default:
743 EFM_ASSERT(1);
744 return 0;
745 }
746 break;
747
748 #if SYSRTC_GROUP_NUMBER > 7
749 case 7:
750 switch (channel) {
751 case 0:
752 return SYSRTC0->GRP7_CMP0VALUE;
753
754 #ifdef SYSRTC_GRP7_CTRL_CMP1EN
755 case 1:
756 return SYSRTC0->GRP7_CMP1VALUE;
757 #endif
758
759 default:
760 EFM_ASSERT(1);
761 return 0;
762 }
763 break;
764 #endif
765 #endif
766 #endif
767 #endif
768 #endif
769 #endif
770 #endif
771
772 default:
773 EFM_ASSERT(1);
774 return 0;
775 }
776 }
777
778 /***************************************************************************//**
779 * Sets SYSRTC compare register value for selected channel of given group.
780 ******************************************************************************/
sl_hal_sysrtc_set_group_compare_channel_value(uint8_t group_number,uint8_t channel,uint32_t value)781 void sl_hal_sysrtc_set_group_compare_channel_value(uint8_t group_number,
782 uint8_t channel,
783 uint32_t value)
784 {
785 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
786
787 switch (group_number) {
788 case 0:
789 switch (channel) {
790 case 0:
791 SYSRTC0->GRP0_CMP0VALUE = value;
792 break;
793
794 #ifdef SYSRTC_GRP0_CTRL_CMP1EN
795 case 1:
796 SYSRTC0->GRP0_CMP1VALUE = value;
797 break;
798 #endif
799
800 default:
801 EFM_ASSERT(1);
802 }
803 break;
804
805 #if SYSRTC_GROUP_NUMBER > 1
806 case 1:
807 switch (channel) {
808 case 0:
809 SYSRTC0->GRP1_CMP0VALUE = value;
810 break;
811
812 #ifdef SYSRTC_GRP1_CTRL_CMP1EN
813 case 1:
814 SYSRTC0->GRP1_CMP1VALUE = value;
815 break;
816 #endif
817
818 default:
819 EFM_ASSERT(1);
820 }
821 break;
822
823 #if SYSRTC_GROUP_NUMBER > 2
824 case 2:
825 switch (channel) {
826 case 0:
827 SYSRTC0->GRP2_CMP0VALUE = value;
828 break;
829
830 #ifdef SYSRTC_GRP2_CTRL_CMP1EN
831 case 1:
832 SYSRTC0->GRP2_CMP1VALUE = value;
833 break;
834 #endif
835
836 default:
837 EFM_ASSERT(1);
838 }
839 break;
840
841 #if SYSRTC_GROUP_NUMBER > 3
842 case 3:
843 switch (channel) {
844 case 0:
845 SYSRTC0->GRP3_CMP0VALUE = value;
846 break;
847
848 #ifdef SYSRTC_GRP3_CTRL_CMP1EN
849 case 1:
850 SYSRTC0->GRP3_CMP1VALUE = value;
851 break;
852 #endif
853
854 default:
855 EFM_ASSERT(1);
856 }
857 break;
858
859 #if SYSRTC_GROUP_NUMBER > 4
860 case 4:
861 switch (channel) {
862 case 0:
863 SYSRTC0->GRP4_CMP0VALUE = value;
864 break;
865
866 #ifdef SYSRTC_GRP4_CTRL_CMP1EN
867 case 1:
868 SYSRTC0->GRP4_CMP1VALUE = value;
869 break;
870 #endif
871
872 default:
873 EFM_ASSERT(1);
874 }
875 break;
876
877 #if SYSRTC_GROUP_NUMBER > 5
878 case 5:
879 switch (channel) {
880 case 0:
881 SYSRTC0->GRP5_CMP0VALUE = value;
882 break;
883
884 #ifdef SYSRTC_GRP5_CTRL_CMP1EN
885 case 1:
886 SYSRTC0->GRP5_CMP1VALUE = value;
887 break;
888 #endif
889
890 default:
891 EFM_ASSERT(1);
892 }
893 break;
894
895 #if SYSRTC_GROUP_NUMBER > 6
896 case 6:
897 switch (channel) {
898 case 0:
899 SYSRTC0->GRP6_CMP0VALUE = value;
900 break;
901
902 #ifdef SYSRTC_GRP6_CTRL_CMP1EN
903 case 1:
904 SYSRTC0->GRP6_CMP1VALUE = value;
905 break;
906 #endif
907
908 default:
909 EFM_ASSERT(1);
910 }
911 break;
912
913 #if SYSRTC_GROUP_NUMBER > 7
914 case 7:
915 switch (channel) {
916 case 0:
917 SYSRTC0->GRP7_CMP0VALUE = value;
918 break;
919
920 #ifdef SYSRTC_GRP7_CTRL_CMP1EN
921 case 1:
922 SYSRTC0->GRP7_CMP1VALUE = value;
923 break;
924 #endif
925
926 default:
927 EFM_ASSERT(1);
928 }
929 break;
930 #endif
931 #endif
932 #endif
933 #endif
934 #endif
935 #endif
936 #endif
937
938 default:
939 EFM_ASSERT(1);
940 }
941 }
942
943 /***************************************************************************//**
944 * Gets SYSRTC input capture register value for selected channel of given group.
945 ******************************************************************************/
sl_hal_sysrtc_get_group_capture_channel_value(uint8_t group_number)946 uint32_t sl_hal_sysrtc_get_group_capture_channel_value(uint8_t group_number)
947 {
948 EFM_ASSERT(SYSRTC_GROUP_VALID(group_number));
949
950 switch (group_number) {
951 #ifdef SYSRTC_GRP0_CTRL_CAP0EN
952 case 0:
953 return SYSRTC0->GRP0_CAP0VALUE;
954 #endif
955
956 #if SYSRTC_GROUP_NUMBER > 1
957 #ifdef SYSRTC_GRP1_CTRL_CAP0EN
958 case 1:
959 return SYSRTC0->GRP1_CAP0VALUE;
960 #endif
961
962 #if SYSRTC_GROUP_NUMBER > 2
963 #ifdef SYSRTC_GRP2_CTRL_CAP0EN
964 case 2:
965 return SYSRTC0->GRP2_CAP0VALUE;
966 #endif
967
968 #if SYSRTC_GROUP_NUMBER > 3
969 #ifdef SYSRTC_GRP3_CTRL_CAP0EN
970 case 3:
971 return SYSRTC0->GRP3_CAP0VALUE;
972 #endif
973
974 #if SYSRTC_GROUP_NUMBER > 4
975 #ifdef SYSRTC_GRP4_CTRL_CAP0EN
976 case 4:
977 return SYSRTC0->GRP4_CAP0VALUE;
978 #endif
979
980 #if SYSRTC_GROUP_NUMBER > 5
981 #ifdef SYSRTC_GRP5_CTRL_CAP0EN
982 case 5:
983 return SYSRTC0->GRP5_CAP0VALUE;
984 #endif
985
986 #if SYSRTC_GROUP_NUMBER > 6
987 #ifdef SYSRTC_GRP6_CTRL_CAP0EN
988 case 6:
989 return SYSRTC0->GRP6_CAP0VALUE;
990 #endif
991
992 #if SYSRTC_GROUP_NUMBER > 7
993 #ifdef SYSRTC_GRP7_CTRL_CAP0EN
994 case 7:
995 return SYSRTC0->GRP7_CAP0VALUE;
996 #endif
997 #endif
998 #endif
999 #endif
1000 #endif
1001 #endif
1002 #endif
1003 #endif
1004
1005 default:
1006 EFM_ASSERT(1);
1007 return 0;
1008 }
1009 }
1010
1011 /** @} (end addtogroup sysrtc) */
1012 #endif /* defined(SYSRTC_COUNT) && (SYSRTC_COUNT > 0) */
1013