BLE_TYQ_CH584M/StdPeriphDriver/CH58x_clk.c

647 lines
17 KiB
C
Raw Permalink Normal View History

2024-12-02 16:26:55 +08:00
/********************************** (C) COPYRIGHT *******************************
2025-02-21 14:38:41 +08:00
* File Name : CH58x_clk.c
2024-12-02 16:26:55 +08:00
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
2025-02-21 14:38:41 +08:00
* Description : source file(ch585/ch584)
2024-12-02 16:26:55 +08:00
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
2025-02-21 14:38:41 +08:00
#include "CH58x_common.h"
2024-12-02 16:26:55 +08:00
/*********************************************************************
* @fn LClk32K_Select
*
* @brief 32K <EFBFBD><EFBFBD>Ƶʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
*
* @param hc - ѡ<EFBFBD><EFBFBD>32Kʹ<EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ
*
* @return none
*/
void LClk32K_Select(LClk32KTypeDef hc)
{
uint8_t cfg = R8_CK32K_CONFIG;
if(hc == Clk32K_LSI)
{
cfg &= ~RB_CLK_OSC32K_XT;
LSECFG_Current(LSE_RCur_100);
}
else
{
cfg |= RB_CLK_OSC32K_XT;
}
sys_safe_access_enable();
R8_CK32K_CONFIG = cfg;
sys_safe_access_disable();
}
/*********************************************************************
* @fn LClk32K_Cfg
*
* @brief 32K <EFBFBD><EFBFBD>Ƶʱ<EFBFBD>ӵ<EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param hc - ѡ<EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>32K<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ32K
* @param s - <EFBFBD>Ƿ<EFBFBD><EFBFBD>򿪵<EFBFBD>Դ
*
* @return none
*/
void LClk32K_Cfg(LClk32KTypeDef hc, FunctionalState s)
{
uint8_t cfg = R8_CK32K_CONFIG;
if(hc == Clk32K_LSI)
{
if(s == DISABLE)
{
cfg &= ~RB_CLK_INT32K_PON;
}
else
{
cfg |= RB_CLK_INT32K_PON;
}
}
else
{
if(s == DISABLE)
{
cfg &= ~RB_CLK_XT32K_PON;
}
else
{
cfg |= RB_CLK_XT32K_PON;
}
}
sys_safe_access_enable();
R8_CK32K_CONFIG = cfg;
sys_safe_access_disable();
}
/*********************************************************************
* @fn HSECFG_Current
*
* @brief HSE<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƫ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - 75%,100%,125%,150%
*
* @return none
*/
void HSECFG_Current(HSECurrentTypeDef c)
{
uint8_t x32M_c;
x32M_c = R8_XT32M_TUNE;
x32M_c = (x32M_c & 0xfc) | (c & 0x03);
sys_safe_access_enable();
R8_XT32M_TUNE = x32M_c;
sys_safe_access_disable();
}
/*********************************************************************
* @fn HSECFG_Capacitance
*
* @brief HSE<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - refer to HSECapTypeDef
*
* @return none
*/
void HSECFG_Capacitance(HSECapTypeDef c)
{
uint8_t x32M_c;
x32M_c = R8_XT32M_TUNE;
2025-02-21 14:38:41 +08:00
x32M_c = (x32M_c & 0x0f) | (c << 4);
2024-12-02 16:26:55 +08:00
sys_safe_access_enable();
R8_XT32M_TUNE = x32M_c;
sys_safe_access_disable();
}
2025-02-21 14:38:41 +08:00
/*********************************************************************
* @fn LSICFG_Current
*
* @brief LSI<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƫ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - 70%,100%,140%,200%
*
* @return none
*/
void LSICFG_Current(LSICurrentTypeDef c)
{
uint8_t x32K_c;
x32K_c = R8_XT32K_TUNE;
x32K_c = (x32K_c & 0xf3) | ((c<<2) & 0x0C);
sys_safe_access_enable();
R8_XT32K_TUNE = x32K_c;
sys_safe_access_disable();
}
2024-12-02 16:26:55 +08:00
/*********************************************************************
* @fn LSECFG_Current
*
* @brief LSE<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƫ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - 70%,100%,140%,200%
*
* @return none
*/
void LSECFG_Current(LSECurrentTypeDef c)
{
uint8_t x32K_c;
x32K_c = R8_XT32K_TUNE;
x32K_c = (x32K_c & 0xfc) | (c & 0x03);
sys_safe_access_enable();
R8_XT32K_TUNE = x32K_c;
sys_safe_access_disable();
}
/*********************************************************************
* @fn LSECFG_Capacitance
*
* @brief LSE<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param c - refer to LSECapTypeDef
*
* @return none
*/
void LSECFG_Capacitance(LSECapTypeDef c)
{
uint8_t x32K_c;
x32K_c = R8_XT32K_TUNE;
x32K_c = (x32K_c & 0x0f) | (c << 4);
sys_safe_access_enable();
R8_XT32K_TUNE = x32K_c;
sys_safe_access_disable();
}
/*********************************************************************
* @fn Calibration_LSI
*
* @brief У׼<EFBFBD>ڲ<EFBFBD>32<EFBFBD><EFBFBD>
*
* @param cali_Lv - У׼<EFBFBD>ȼ<EFBFBD>ѡ<EFBFBD><EFBFBD> Level_32 <EFBFBD><EFBFBD>2.4ms 1000ppm (32M <EFBFBD><EFBFBD>Ƶ) 1100ppm (60M <EFBFBD><EFBFBD>Ƶ)
* Level_64 <EFBFBD><EFBFBD>4.4ms 800ppm (32M <EFBFBD><EFBFBD>Ƶ) 1000ppm (60M <EFBFBD><EFBFBD>Ƶ)
* Level_128 <EFBFBD><EFBFBD>8.4ms 600ppm (32M <EFBFBD><EFBFBD>Ƶ) 800ppm (60M <EFBFBD><EFBFBD>Ƶ)
*
* @return none
*/
void Calibration_LSI(Cali_LevelTypeDef cali_Lv)
{
2025-03-27 10:22:43 +08:00
uint64_t i;
2024-12-02 16:26:55 +08:00
long long cnt_offset;
2025-03-27 10:22:43 +08:00
uint8_t retry = 0;
uint8_t retry_all = 0;
int32_t freq_sys;
uint32_t cnt_32k = 0;
uint32_t irqv = 0;
2024-12-02 16:26:55 +08:00
freq_sys = GetSysClock();
sys_safe_access_enable();
R8_CK32K_CONFIG &= ~RB_CLK_OSC32K_FILT;
R8_CK32K_CONFIG |= RB_CLK_OSC32K_FILT;
sys_safe_access_disable();
while(1)
{
// <20>ֵ<EFBFBD>
sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_TOTAL;
R8_OSC_CAL_CTRL |= 1;
sys_safe_access_disable();
while(1)
{
sys_safe_access_enable();
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR;
R16_OSC_CAL_CNT |= RB_OSC_CAL_IF;
sys_safe_access_disable();
while( (R8_OSC_CAL_CTRL & RB_OSC_CNT_EN) == 0 )
{
sys_safe_access_enable();
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
sys_safe_access_disable();
}
while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT)); // <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>
SYS_DisableAllIrq(&irqv);
sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_EN;
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR;
R16_OSC_CAL_CNT |= RB_OSC_CAL_IF;
sys_safe_access_disable();
while( (R8_OSC_CAL_CTRL & RB_OSC_CNT_EN) == 0 )
{
sys_safe_access_enable();
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
sys_safe_access_disable();
}
while(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT);
cnt_32k = RTC_GetCycle32k();
while(RTC_GetCycle32k() == cnt_32k);
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR;
SYS_RecoverIrq(irqv);
while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT));
i = R16_OSC_CAL_CNT; // ʵʱУ׼<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
cnt_offset = (i & 0x3FFF) + R8_OSC_CAL_OV_CNT * 0x3FFF - 2000 * (freq_sys / 1000) / CAB_LSIFQ;
2025-02-21 14:38:41 +08:00
if(((cnt_offset > -35 * (freq_sys / 1000) / 60000) && (cnt_offset < 35 * (freq_sys / 1000) / 60000)) || retry > 2)
2024-12-02 16:26:55 +08:00
{
if(retry)
2025-02-21 14:38:41 +08:00
{
2024-12-02 16:26:55 +08:00
break;
2025-02-21 14:38:41 +08:00
}
2024-12-02 16:26:55 +08:00
}
retry++;
2025-02-21 14:38:41 +08:00
cnt_offset = (cnt_offset > 0) ? (((cnt_offset * 2) / (70 * (freq_sys/1000) / 60000)) + 1) / 2 : (((cnt_offset * 2) / (70 * (freq_sys/1000) / 60000 )) - 1) / 2;
2024-12-02 16:26:55 +08:00
sys_safe_access_enable();
R16_INT32K_TUNE += cnt_offset;
sys_safe_access_disable();
}
// ϸ<><CFB8>
// <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬶<EFBFBD><F3A3ACB6><EFBFBD>2<EFBFBD>β<EFBFBD><CEB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB>
sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_TOTAL;
R8_OSC_CAL_CTRL |= cali_Lv;
sys_safe_access_disable();
while( (R8_OSC_CAL_CTRL & RB_OSC_CNT_TOTAL) != cali_Lv )
{
sys_safe_access_enable();
R8_OSC_CAL_CTRL |= cali_Lv;
sys_safe_access_disable();
}
sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_EN;
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR;
R16_OSC_CAL_CNT |= RB_OSC_CAL_IF;
sys_safe_access_disable();
while( (R8_OSC_CAL_CTRL & RB_OSC_CNT_EN) == 0 )
{
sys_safe_access_enable();
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
sys_safe_access_disable();
}
while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT)); // <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>
SYS_DisableAllIrq(&irqv);
sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_EN;
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR;
R16_OSC_CAL_CNT |= RB_OSC_CAL_IF;
sys_safe_access_disable();
while( (R8_OSC_CAL_CTRL & RB_OSC_CNT_EN) == 0 )
{
sys_safe_access_enable();
R8_OSC_CAL_CTRL |= RB_OSC_CNT_EN;
sys_safe_access_disable();
}
while(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT);
cnt_32k = RTC_GetCycle32k();
while(RTC_GetCycle32k() == cnt_32k);
R16_OSC_CAL_CNT |= RB_OSC_CAL_OV_CLR;
SYS_RecoverIrq(irqv);
while(!(R8_OSC_CAL_CTRL & RB_OSC_CNT_HALT));
sys_safe_access_enable();
R8_OSC_CAL_CTRL &= ~RB_OSC_CNT_EN;
sys_safe_access_disable();
i = R16_OSC_CAL_CNT; // ʵʱУ׼<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2025-02-21 14:38:41 +08:00
cnt_offset = (i & 0x3FFF) + R8_OSC_CAL_OV_CNT * 0x3FFF - 4000 * (1 << ((cali_Lv<=Level_128)?cali_Lv:(cali_Lv+2))) * (freq_sys / 100000) / 256 * 100/(CAB_LSIFQ/256);
cnt_offset = (cnt_offset > 0) ? ((((cnt_offset * 2*(100 )) / (1141 * ((1 << ((cali_Lv<=Level_128)?cali_Lv:(cali_Lv+2)))/8) * (freq_sys/1000) / 60000)) + 1) / 2) : ((((cnt_offset * 2*(100)) / (1141 * ((1 << ((cali_Lv<=Level_128)?cali_Lv:(cali_Lv+2)))/8) * (freq_sys/1000) / 60000)) - 1) / 2);
2024-12-02 16:26:55 +08:00
if((cnt_offset > 0)&&(((R16_INT32K_TUNE>>5)+cnt_offset)>0xFF))
{
if(retry_all>2)
{
sys_safe_access_enable();
R16_INT32K_TUNE |= (0xFF<<5);
sys_safe_access_disable();
return;
}
else
{
sys_safe_access_enable();
R16_INT32K_TUNE = (R16_INT32K_TUNE&0x1F)|(0x7F<<5);
sys_safe_access_disable();
}
}
else if((cnt_offset < 0)&&((R16_INT32K_TUNE>>5)<(-cnt_offset)))
{
if(retry_all>2)
{
sys_safe_access_enable();
R16_INT32K_TUNE &= 0x1F;
sys_safe_access_disable();
return;
}
else
{
sys_safe_access_enable();
R16_INT32K_TUNE = (R16_INT32K_TUNE&0x1F)|(0x7F<<5);
sys_safe_access_disable();
}
}
else
{
sys_safe_access_enable();
R16_INT32K_TUNE += (cnt_offset<<5);
sys_safe_access_disable();
return;
}
retry_all++;
}
}
/*********************************************************************
* @fn RTCInitTime
*
* @brief RTCʱ<EFBFBD>ӳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD>
*
* @param y - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_Y = BEGYEAR + 44
* @param mon - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>MAX_MON = 12
* @param d - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>MAX_D = 31
* @param h - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сʱ<EFBFBD><EFBFBD>MAX_H = 23
* @param m - <EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD>ӣ<EFBFBD>MAX_M = 59
* @param s - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_S = 59
*
* @return none
*/
void RTC_InitTime(uint16_t y, uint16_t mon, uint16_t d, uint16_t h, uint16_t m, uint16_t s)
{
uint32_t t;
uint16_t year, month, day, sec2, t32k;
volatile uint8_t clk_pin;
year = y;
month = mon;
day = 0;
while(year > BEGYEAR)
{
day += YearLength(year - 1);
year--;
}
while(month > 1)
{
day += monthLength(IsLeapYear(y), month - 2);
month--;
}
day += d - 1;
sec2 = (h % 24) * 1800 + m * 30 + s / 2;
t32k = (s & 1) ? (0x8000) : (0);
t = sec2;
t = t << 16 | t32k;
do
{
clk_pin = (R8_CK32K_CONFIG & RB_32K_CLK_PIN);
} while(clk_pin != (R8_CK32K_CONFIG & RB_32K_CLK_PIN));
if(!clk_pin)
{
while(!clk_pin)
{
do
{
clk_pin = (R8_CK32K_CONFIG & RB_32K_CLK_PIN);
} while(clk_pin != (R8_CK32K_CONFIG & RB_32K_CLK_PIN));
}
}
sys_safe_access_enable();
R32_RTC_TRIG = day;
R8_RTC_MODE_CTRL |= RB_RTC_LOAD_HI;
sys_safe_access_disable();
while((R32_RTC_TRIG & 0x3FFF) != (R32_RTC_CNT_DAY & 0x3FFF));
sys_safe_access_enable();
R32_RTC_TRIG = t;
R8_RTC_MODE_CTRL |= RB_RTC_LOAD_LO;
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_GetTime
*
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD>
*
* @param py - <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_Y = BEGYEAR + 44
* @param pmon - <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>MAX_MON = 12
* @param pd - <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>MAX_D = 31
* @param ph - <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сʱ<EFBFBD><EFBFBD>MAX_H = 23
* @param pm - <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD>ӣ<EFBFBD>MAX_M = 59
* @param ps - <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_S = 59
*
* @return none
*/
void RTC_GetTime(uint16_t *py, uint16_t *pmon, uint16_t *pd, uint16_t *ph, uint16_t *pm, uint16_t *ps)
{
uint32_t t;
uint16_t day, sec2, t32k;
day = R32_RTC_CNT_DAY & 0x3FFF;
sec2 = R16_RTC_CNT_2S;
t32k = R16_RTC_CNT_32K;
t = sec2 * 2 + ((t32k < 0x8000) ? 0 : 1);
*py = BEGYEAR;
while(day >= YearLength(*py))
{
day -= YearLength(*py);
(*py)++;
}
*pmon = 0;
while(day >= monthLength(IsLeapYear(*py), *pmon))
{
day -= monthLength(IsLeapYear(*py), *pmon);
(*pmon)++;
}
(*pmon)++;
*pd = day + 1;
*ph = t / 3600;
*pm = t % 3600 / 60;
*ps = t % 60;
}
/*********************************************************************
* @fn RTC_SetCycle32k
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LSE/LSIʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ǰRTC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cyc - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>MAX_CYC = 0xA8BFFFFF = 2831155199
*
* @return none
*/
void RTC_SetCycle32k(uint32_t cyc)
{
volatile uint8_t clk_pin;
do
{
clk_pin = (R8_CK32K_CONFIG & RB_32K_CLK_PIN);
} while((clk_pin != (R8_CK32K_CONFIG & RB_32K_CLK_PIN)) || (!clk_pin));
sys_safe_access_enable();
R32_RTC_TRIG = cyc;
R8_RTC_MODE_CTRL |= RB_RTC_LOAD_LO;
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_GetCycle32k
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LSE/LSIʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰRTC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param none
*
* @return <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_CYC = 0xA8BFFFFF = 2831155199
*/
__HIGH_CODE
uint32_t RTC_GetCycle32k(void)
{
volatile uint32_t i;
do
{
i = R32_RTC_CNT_32K;
} while(i != R32_RTC_CNT_32K);
return (i);
}
/*********************************************************************
* @fn RTC_TMRFunCfg
*
* @brief RTC<EFBFBD><EFBFBD>ʱģʽ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>ע<EFBFBD>ʱ<EFBFBD><EFBFBD>׼<EFBFBD>̶<EFBFBD>Ϊ32768Hz<EFBFBD><EFBFBD>
*
* @param t - refer to RTC_TMRCycTypeDef
*
* @return none
*/
void RTC_TMRFunCfg(RTC_TMRCycTypeDef t)
{
sys_safe_access_enable();
R8_RTC_MODE_CTRL &= ~(RB_RTC_TMR_EN | RB_RTC_TMR_MODE);
sys_safe_access_disable();
sys_safe_access_enable();
R8_RTC_MODE_CTRL |= RB_RTC_TMR_EN | (t);
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_TRIGFunCfg
*
* @brief RTCʱ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @param cyc - <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ǰʱ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LSE/LSIʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
void RTC_TRIGFunCfg(uint32_t cyc)
{
uint32_t t;
t = RTC_GetCycle32k() + cyc;
if(t > RTC_MAX_COUNT)
{
t -= RTC_MAX_COUNT;
}
sys_safe_access_enable();
R32_RTC_TRIG = t;
R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN;
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_ModeFunDisable
*
* @brief RTC ģʽ<EFBFBD><EFBFBD><EFBFBD>ܹر<EFBFBD>
*
* @param m - <EFBFBD><EFBFBD>Ҫ<EFBFBD>رյĵ<EFBFBD>ǰģʽ
*
* @return none
*/
void RTC_ModeFunDisable(RTC_MODETypeDef m)
{
uint8_t i = 0;
if(m == RTC_TRIG_MODE)
{
i |= RB_RTC_TRIG_EN;
}
else if(m == RTC_TMR_MODE)
{
i |= RB_RTC_TMR_EN;
}
sys_safe_access_enable();
R8_RTC_MODE_CTRL &= ~(i);
sys_safe_access_disable();
}
/*********************************************************************
* @fn RTC_GetITFlag
*
* @brief <EFBFBD><EFBFBD>ȡRTC<EFBFBD>жϱ<EFBFBD>־
*
* @param f - refer to RTC_EVENTTypeDef
*
* @return <EFBFBD>жϱ<EFBFBD>־״̬
*/
uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f)
{
if(f == RTC_TRIG_EVENT)
{
return (R8_RTC_FLAG_CTRL & RB_RTC_TRIG_FLAG);
}
else
{
return (R8_RTC_FLAG_CTRL & RB_RTC_TMR_FLAG);
}
}
/*********************************************************************
* @fn RTC_ClearITFlag
*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD>жϱ<EFBFBD>־
*
* @param f - refer to RTC_EVENTTypeDef
*
* @return none
*/
void RTC_ClearITFlag(RTC_EVENTTypeDef f)
{
switch(f)
{
case RTC_TRIG_EVENT:
R8_RTC_FLAG_CTRL = RB_RTC_TRIG_CLR;
break;
case RTC_TMR_EVENT:
R8_RTC_FLAG_CTRL = RB_RTC_TMR_CLR;
break;
default:
break;
}
}