chen
2024-07-29 55579b9ada2fc22edcae817e7d6e65710c47edd3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
 * its subsidiaries and affiliates (collectly called MKSEMI).
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form, except as embedded into an MKSEMI
 *    integrated circuit in a product or a software update for such product,
 *    must reproduce the above copyright notice, this list of conditions and
 *    the following disclaimer in the documentation and/or other materials
 *    provided with the distribution.
 *
 * 3. Neither the name of MKSEMI nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * 4. This software, with or without modification, must only be used with a
 *    MKSEMI integrated circuit.
 *
 * 5. Any software provided in binary form under this license must not be
 *    reverse engineered, decompiled, modified and/or disassembled.
 *
 * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
#ifndef MK_RTC_H_
#define MK_RTC_H_
#include "mk_common.h"
 
/**
 * @addtogroup MK8000_RTC
 * @{
 */
 
#ifndef RTC_FREE_COUNTER_EN
#define RTC_FREE_COUNTER_EN (0)
#endif
 
#if RTC_FREE_COUNTER_EN
 
/* RTC device instance */
enum RTC_DEV_T
{
    RTC_ID0 = 0,
    RTC_MAX_NUM
};
 
struct RTC_HANDLE_T
{
    RTC_TypeDef *const base;
    const IRQn_Type alarm_irq;
    drv_callback_t alarm_callback;
    uint32_t rtc_open_flag;
};
 
#ifdef __cplusplus
extern "C" {
#endif
 
int rtc_open(enum RTC_DEV_T id);
int rtc_close(enum RTC_DEV_T id);
 
uint32_t rtc_get(enum RTC_DEV_T id);
 
int rtc_set_alarm(enum RTC_DEV_T id, uint32_t target, drv_callback_t callback);
void rtc_clear_alarm(enum RTC_DEV_T id);
void RTC_ALARM_IRQHandler(void);
 
#ifdef __cplusplus
}
#endif
 
#else
 
/* RTC device instance */
enum RTC_DEV_T
{
    RTC_ID0 = 0,
    RTC_MAX_NUM
};
 
struct RTC_TIME_T
{
    uint16_t year;  /*!< Range from 1970 to 2099.*/
    uint8_t month;  /*!< Range from 1 to 12.*/
    uint8_t day;    /*!< Range from 1 to 31 (depending on month).*/
    uint8_t hour;   /*!< Range from 0 to 23.*/
    uint8_t minute; /*!< Range from 0 to 59.*/
    uint8_t second; /*!< Range from 0 to 59.*/
    uint8_t reserved;
};
 
struct RTC_HANDLE_T
{
    RTC_TypeDef *const base;
    const IRQn_Type tick_irq;
    const IRQn_Type alarm_irq;
    drv_callback_t tick_callback;
    drv_callback_t alarm_callback;
    uint16_t tick_int_en;
    uint16_t rtc_open_flag;
};
 
#ifdef __cplusplus
extern "C" {
#endif
 
int rtc_open(enum RTC_DEV_T id, drv_callback_t callback);
int rtc_close(enum RTC_DEV_T id);
 
int rtc_set(enum RTC_DEV_T id, struct RTC_TIME_T *time);
int rtc_get(enum RTC_DEV_T id, struct RTC_TIME_T *time);
 
int rtc_set_alarm(enum RTC_DEV_T id, struct RTC_TIME_T *time, drv_callback_t callback);
void rtc_clear_alarm(enum RTC_DEV_T id);
 
void RTC_TICK_IRQHandler(void);
void RTC_ALARM_IRQHandler(void);
 
#ifdef __cplusplus
}
#endif
#endif
 
/* RCO 32K clock measure time */
enum RCO32_MEAS_TIME_T
{
    RCO32K_MEAS_TIME_8_CYCLES = 0,
    RCO32K_MEAS_TIME_16_CYCLES,
    RCO32K_MEAS_TIME_32_CYCLES, // ~1ms
    RCO32K_MEAS_TIME_64_CYCLES,
    RCO32K_MEAS_TIME_128_CYCLES,
    RCO32K_MEAS_TIME_256_CYCLES,
    RCO32K_MEAS_TIME_512_CYCLES,
    RCO32K_MEAS_TIME_1024_CYCLES,
};
 
void rco32k_clk_calibrate(enum RCO32_MEAS_TIME_T time);
void RCO32K_CAL_IRQHandler(void);
 
/**
 * @}
 */
 
#endif /* MK_RTC_H_ */