BLE5.2 1.0
开发文档说明
xc_drv_rtc.c
浏览该文件的文档.
1
25/*-----------------------------------------------------------------------------------
26 INCLUDE HEADE FILES
27 ------------------------------------------------------------------------------------*/
28#include "xc6xxx.h"
29/*------------------------------------------------------------------------------------
30 Local Variables
31 -------------------------------------------------------------------------------------*/
32static volatile uint8_t calibration_flag = 0;
33
34/*------------------------------------------------------------------------------------
35 Global Variables
36 -------------------------------------------------------------------------------------*/
37
38uint8_t AO_Timer_Callback(uint8_t calib_flag);
39
49
50/*------------------------------------------------------------------------------------
51 Func Prototype
52 -------------------------------------------------------------------------------------*/
53
54/*------------------------------------------------------------------------------------
55 Functions
56 -------------------------------------------------------------------------------------*/
57void xc_rtc_start(void) { rtc_icr__rtc__cnt_e__setf(RTC_ICR_CNTE_ENABLE); }
58
59void xc_rtc_stop(void) { rtc_icr__rtc__cnt_e__setf(RTC_ICR_CNTE_DISABLE); }
60
62{
63 if (rtc_cfg->MatchTime.ch == RTC_MATCH_T1) {
64 rtc_cmr_one_pack(rtc_cfg->MatchTime.Week, rtc_cfg->MatchTime.Hour,
65 rtc_cfg->MatchTime.Min, rtc_cfg->MatchTime.Sec);
66 } else if (rtc_cfg->MatchTime.ch == RTC_MATCH_T2) {
67 rtc_cmr_two_pack(rtc_cfg->MatchTime.Week, rtc_cfg->MatchTime.Hour,
68 rtc_cfg->MatchTime.Min, rtc_cfg->MatchTime.Sec);
69 } else if (rtc_cfg->MatchTime.ch == RTC_MATCH_T3) {
70 rtc_cmr_three_pack(rtc_cfg->MatchTime.Week, rtc_cfg->MatchTime.Hour,
71 rtc_cfg->MatchTime.Min, rtc_cfg->MatchTime.Sec);
72 }
73}
74
76
78{
79 cpr_ctlapbclken_grctl__rtc_pclk_en__setf(ENABLE);
80
81 cprao_aon_clken_grctl__rtc_clk_en__setf(ENABLE);
82
83 rtc_icr_set(DISABLE);
84
85 rtc_raw_limit__setf(xc_clock_lfclk_in_get());
86
87 rtc_datelimitSet(rtc_cfg);
88 rtc_dateSet(rtc_cfg);
89
90 if (rtc_cfg->MatchTimeEnable) {
91 xc_rtc_matchtime_set(rtc_cfg);
93 }
94
95 if (rtc_cfg->SecIT_Enable) {
96 rtc_config_secit(rtc_cfg);
97 }
98 if (rtc_cfg->MinIT_Enable) {
99 rtc_config_minit(rtc_cfg);
100 }
101 if (rtc_cfg->HourIT_Enable) {
102 rtc_config_hourit(rtc_cfg);
103 }
104 if (rtc_cfg->DayIT_Enable) {
105 rtc_config_dayit(rtc_cfg);
106 }
107}
108
109uint8_t AO_Timer_Callback(uint8_t calib_flag)
110{
111 calib_flag = 1;
112 return calib_flag;
113}
114
115void RTC_Handler(void)
116{
117 uint32_t val;
118
119 val = rtc_all_intr_ao_get();
120
121 if (val & RTC_AO_ALL_INTR_AO_TIMER_INTR_Msk) {
122 rtc_ao_timer_ctl__rtc_ao_timer_clr__setf(RTC_AO_TIMER_CTL_AO_TIMER_CLR_SET);
123 rtc_ao_timer_ctl__rtc_ao_timer_en__setf(RTC_AO_TIMER_CTL_AO_TIMER_EN_DISABLE);
124
126 }
127
128 val = rtc_isr_eoi_get();
129
130 if (val) {
131 rtc_isr_eoi_set(val);
132
133 if ((val & RTC_ICR_T1E_Msk) == RTC_ICR_T1E_Msk){
135 }
136 if ((val & RTC_ICR_T2E_Msk) == RTC_ICR_T2E_Msk){
138 }
139 if ((val & RTC_ICR_T3E_Msk) == RTC_ICR_T3E_Msk){
141 }
142
143 if ((val & RTC_ICR_DaE_Msk) == RTC_ICR_DaE_Msk){
145 }
146 if ((val & RTC_ICR_HoE_Msk) == RTC_ICR_HoE_Msk){
148 }
149 if ((val & RTC_ICR_MiE_Msk) == RTC_ICR_MiE_Msk){
151 }
152 if ((val & RTC_ICR_SeE_Msk) == RTC_ICR_SeE_Msk){
154 }
155 }
156}
157
158__WEAK uint8_t T1_CMR_Callback(void) { return 0; }
159
160__WEAK uint8_t T2_CMR_Callback(void) { return 0; }
161
162__WEAK uint8_t T3_CMR_Callback(void) { return 0; }
163
164__WEAK uint8_t Sec_Callback(void) { return 0; }
165
166__WEAK uint8_t Min_Callback(void) { return 0; }
167
168__WEAK uint8_t Hour_Callback(void) { return 0; }
169
170__WEAK uint8_t Day_Callback(void) { return 0; }
171
172/***********************************************************************************
173 ***************************** RC32 Calibration
174 ******************************
175 ***********************************************************************************/
184{
185 volatile int32_t hw_timeout = 10000;
186 uint32_t val;
187 float freq = 0.0;
188
189 rtc_ao_timer_ctl__rtc_ao_timer_value__setf(32);
190 rtc_ao_timer_ctl__rtc_freq_timer_en__setf(1);
191
192 while ((!(calibration_flag)) && (hw_timeout > 0)) {
193 __nop();
194 hw_timeout--;
195 }
196
197 if (hw_timeout < 0) {
198 return 1;
199 }
200
201 val = rtc_freq_32k_timer_val_get();
202 val *= (32000000.0f / xc_clock_hfclk_in_get());
203
204 rtc_ao_timer_ctl__rtc_ao_timer_en__setf(DISABLE);
205 rtc_ao_timer_ctl__rtc_ao_timer_clr__setf(ENABLE);
206
207 freq = (float)(15625.0f / (float)val) * 32768.0f;
208 DEBUG("Calib freq: %u\n", (uint32_t)freq);
209
210 rtc_raw_limit__setf((uint32_t)freq);
211
212 return 0;
213}
Rtc_MatchTimeTypeDef_t MatchTime
Definition xc_drv_rtc.h:132
bool MatchTimeEnable
Definition xc_drv_rtc.h:133
uint8_t(* T3_CMR_Callback)(void)
Definition xc_drv_rtc.h:145
uint8_t(* T2_CMR_Callback)(void)
Definition xc_drv_rtc.h:144
uint8_t(* Hour_Callback)(void)
Definition xc_drv_rtc.h:148
uint8_t(* AO_Timer_Callback)(uint8_t calib_flag)
Definition xc_drv_rtc.h:142
uint8_t(* Sec_Callback)(void)
Definition xc_drv_rtc.h:146
uint8_t(* Min_Callback)(void)
Definition xc_drv_rtc.h:147
uint8_t(* T1_CMR_Callback)(void)
Definition xc_drv_rtc.h:143
uint8_t(* Day_Callback)(void)
Definition xc_drv_rtc.h:149
CLOCK_LFCLK_In_Typedef xc_clock_lfclk_in_get(void)
xc_clock_lfclk_in_get
CLOCK_HFCLK_In_Typedef xc_clock_hfclk_in_get(void)
xc_clock_hfclk_in_get
void xc_rtc_stop(void)
Definition xc_drv_rtc.c:59
RTC_Intr_Cb_t RTC_Intr_cb
Definition xc_drv_rtc.c:40
__WEAK uint8_t T2_CMR_Callback(void)
Definition xc_drv_rtc.c:160
void xc_rtc_date_get(Rtc_DateTypeDef_t *Date)
Definition xc_drv_rtc.c:75
static void xc_rtc_matchtime_set(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.c:61
void xc_rtc_start(void)
Definition xc_drv_rtc.c:57
void RTC_Handler(void)
Definition xc_drv_rtc.c:115
static volatile uint8_t calibration_flag
Definition xc_drv_rtc.c:32
__WEAK uint8_t Min_Callback(void)
Definition xc_drv_rtc.c:166
uint8_t xc_rc32k_count_calib()
RC32k_Count_Calib
Definition xc_drv_rtc.c:183
__WEAK uint8_t Hour_Callback(void)
Definition xc_drv_rtc.c:168
__WEAK uint8_t Sec_Callback(void)
Definition xc_drv_rtc.c:164
uint8_t AO_Timer_Callback(uint8_t calib_flag)
Definition xc_drv_rtc.c:109
__WEAK uint8_t T3_CMR_Callback(void)
Definition xc_drv_rtc.c:162
__WEAK uint8_t T1_CMR_Callback(void)
Definition xc_drv_rtc.c:158
void xc_rtc_init(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.c:77
__WEAK uint8_t Day_Callback(void)
Definition xc_drv_rtc.c:170
static __inline void __rtc_dateget(Rtc_DateTypeDef_t *Date)
Definition xc_drv_rtc.h:158
static __inline void rtc_config_minit(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.h:216
static __inline void rtc_dateSet(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.h:174
@ RTC_MATCH_T3
Definition xc_drv_rtc.h:100
@ RTC_MATCH_T1
Definition xc_drv_rtc.h:98
@ RTC_MATCH_T2
Definition xc_drv_rtc.h:99
static __inline void rtc_config_secit(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.h:207
static __inline void rtc_config_dayit(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.h:234
static __inline void rtc_config_matchtimeit(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.h:183
static __inline void rtc_config_hourit(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.h:225
static __inline void rtc_datelimitSet(RTC_InitCfg_t *rtc_cfg)
Definition xc_drv_rtc.h:167