/************************************************************/
/******* 样例使用说明 *************/
/******* 版本历史 ************/
/******* 日期 版本 负责人 IAR MDK ***********/
/***** 017-07-14 0.1 CJ 7.70 5.14 **********/
/******* QQ:3386208645 ************/
/******* 功能描述 ***********/
/* 本样例主要涉及时钟模块计数寄存器的写入和读取**********/
/*说明: *************/
/*计数初值写入计数寄存器 *************/
/*启动计数 *************/
/*读取计数寄存器数值 *************/
/******* 测试环境 *************/
/* 测试用板: *************/
/* SK-L110-TSSOP20 V10 *************/
/*******辅助工具: ************/
/* JLINK调试工具 *************/
/************************************************************/
#define IS_VALID_CLK(x) (RtcClk32768 == (x)||\
RtcClk32768_1== (x)||\
RtcClk32== (x)||\
RtcClk32_1== (x)||\
RtcClkHxt128 ==(x)||\
RtcClkHxt256 == (x)||\
RtcClkHxt512 == (x)||\
RtcClkHxt1024 == (x))
#define IS_VALID_CYCSEL(x) (RtcPrads == (x)||\
RtcPradx==(x))
#define IS_VALID_PRDS(x) (Rtc_None == (x)||\
Rtc_05S == (x)||\
Rtc_1S == (x)||\
Rtc_1Min ==(x)||\
Rtc_1H == (x)||\
Rtc_1Day ==(x)||\
Rtc_1Mon ==(x)||\
Rtc_1Mon_1 ==(x))
#define IS_VALID_IRQ_SEL(x) (RtcPrdf== (x) ||\
RtcAlmf== (x))
#define IS_VALID_FUNC(x) ((RtcCount<=(x))&&\
(Rtc1HzOutEn>=(x)))
#define CkDateTime 0x7F
#define CkDate 0x78
#define CkTime 0x07
#define RTC_TIMEOUT 1000//test 1s
#define T1_PORT (3)
#define T1_PIN (3)
uint8_t cyccnt=0;
uint8_t u8Alarmcnt=0;
uint8_t flg=0;
stc_rtc_time_t stcReadTime;
/********************************************************************************** \brief RTC计数时钟选择
** ** \param [in] enClk时钟源
** ** \retval Ok
******************************************************************************/
en_result_t Rtc_SelClk(en_rtc_clk_t enClk)
{
en_result_t enRet = Error;
ASSERT(IS_VALID_CLK(enClk));
M0P_RTC->CR1_f.CKSEL = enClk;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
**\brief RTC周期中断方式选择
**
**\param [in] pstccCyc周期中断方式及周期间隔选择
**
**\retval Ok
**
******************************************************************************/
en_result_t Rtc_SetCyc(stc_rtc_cyc_sel_t*pstcCyc)
{
en_result_t enRet = Error;
ASSERT(IS_VALID_CYCSEL(pstcCyc->enCyc_sel));
ASSERT(IS_VALID_PRDS(pstcCyc->enPrds_sel));
M0P_RTC->CR0_f.PRDSEL= pstcCyc->enCyc_sel;
if(pstcCyc->enCyc_sel)
{
M0P_RTC->CR0_f.PRDX = pstcCyc->u8Prdx;
}
else
{
M0P_RTC->CR0_f.PRDS= pstcCyc->enPrds_sel;
}
enRet = Ok;
returnenRet;
}
/**
******************************************************************************
**\brief RTC时制选择
**
**\param [in] bmode是12时制or24时制
**
**\retval Ok 设置正常
**\retval ErrorInvalidParameter 设置异常
******************************************************************************/
en_result_t Rtc_SetAmPm(en_rtc_ampm_tenMode)
{
en_result_t enRet = Error;
switch(enMode)
{
case 0:
case 1:
M0P_RTC->CR0_f.AMPM = enMode;
break;
default:
return ErrorInvalidParameter;
}
enRet = Ok;
return enRet;
}
/**
******************************************************************************
**\brief RTC闹钟中断设置
**
**\param [in] pstcAlarmTime闹钟时间时、分、周
**
**\retval Ok 设置正常
**
******************************************************************************/
en_result_tRtc_SetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
{
en_result_t enRet = Ok;
ASSERT(NULL != pstcAlarmTime);
if(Rtc12h == M0P_RTC->CR0_f.AMPM)
{
enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x12);
}
else
{
enRet = Check_BCD_Format(pstcAlarmTime->u8Hour,0x00,0x24);
}
if(enRet != Ok)
return enRet;
enRet = Check_BCD_Format(pstcAlarmTime->u8Minute,0x00,0x59);
if(enRet != Ok)
return enRet;
//enRet = Check_BCD_Format(pstcAlarmTime->u8Week,0x00,0x06);
if(enRet != Ok)
return enRet;
M0P_RTC->ALMHOUR = pstcAlarmTime->u8Hour;
M0P_RTC->ALMMIN = pstcAlarmTime->u8Minute;
M0P_RTC->ALMWEEK = pstcAlarmTime->u8Week;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
**\brief RTC闹钟中断时间获取
**
**\param [in] pstcAlarmTime闹钟时间时、分、周
**
**\retval Ok 设置正常
**
******************************************************************************/
en_result_tRtc_GetAlarmTime(stc_rtc_alarmset_t* pstcAlarmTime)
{
en_result_t enRet = Error;
ASSERT(NULL != pstcAlarmTime);
pstcAlarmTime->u8Minute = M0P_RTC->ALMMIN;
pstcAlarmTime->u8Hour = M0P_RTC->ALMHOUR;
pstcAlarmTime->u8Week = M0P_RTC->ALMWEEK;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
**\brief RTC 1hz模式选择
**
**\param [in] bmode 高精度和普通精度
**
**\retval Ok 设置正常
**
******************************************************************************/
en_result_t Rtc_Set1HzMode(boolean_t bMode)
{
en_result_t enRet = Error;
M0P_RTC->CR0_f.HZ1SEL = bMode;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
**\brief RTC 1hz补偿值设置
**
**\param [in] u16Cr 补偿值
**
**\retval Ok 设置正常
**
******************************************************************************/
en_result_t Rtc_SetCompCr(uint16_t u16Cr)
{
en_result_t enRet = Error;
M0P_RTC->COMPEN_f.CR = u16Cr;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
**\brief RTC 功能使能设置
**
**\param [in] enFunc 功能选择
**
**\retval Ok 设置正常
**\retval ErrorInvalidParameter 设置异常
******************************************************************************/
en_result_t Rtc_EnableFunc(en_rtc_func_tenFunc)
{
ASSERT(IS_VALID_FUNC(enFunc));
switch(enFunc)
{
case RtcCount:
M0P_RTC->CR0_f.START = 1u;
break;
case RtcAlarmEn:
M0P_RTC->CR1_f.ALMEN = 1u;
break;
case Rtc_ComenEn:
M0P_RTC->COMPEN_f.EN = 1u;
break;
case Rtc1HzOutEn:
M0P_RTC->CR0_f.HZ1OE = 1u;
break;
default:
return ErrorInvalidParameter;
}
return Ok;
}
/**
******************************************************************************
**\brief RTC 功能禁止设置
**
**\param [in] enFunc 功能选择
**
**\retval Ok 设置正常
**\retval ErrorInvalidParameter 设置异常
******************************************************************************/
en_result_t Rtc_DisableFunc(en_rtc_func_tenFunc)
{
ASSERT(IS_VALID_FUNC(enFunc));
switch(enFunc)
{
case RtcCount:
M0P_RTC->CR0_f.START = 0u;
break;
case RtcAlarmEn:
M0P_RTC->CR1_f.ALMEN = 0u;
break;
case Rtc_ComenEn:
M0P_RTC->COMPEN_f.EN = 0u;
break;
case Rtc1HzOutEn:
M0P_RTC->CR0_f.HZ1OE = 0u;
break;
default:
return ErrorInvalidParameter;
}
return Ok;
}
uint8_t Change_DateTimeFormat(uint8_t u8sr)
{
uint8_tu8de=0;
while(u8sr>=0x10)
{
u8de+=10;
u8sr-=0x10;
}
u8de+= u8sr;
return(u8de);
}
/**
******************************************************************************
**\brief RTC 平、闰年检测
**
**\param [in] u8year 年十进制低两位
**
**\retval 1 闰年
**\retval 0 平年
******************************************************************************/
uint8_t Rtc_CheckLeapYear(uint8_t u8year)
{
uint8_t u8year_shl,u8year_shr;
u8year_shl = u8year>>2;
u8year_shr = u8year_shl<<2;
if(u8year== u8year_shr)
{
return 1;
}
else
{
return 0;
}
}
/**
******************************************************************************
**\brief RTC根据日期计算周数
**
**\param [in] pu8Date日期
**
**\retval week 周数
**
******************************************************************************/
uint8_t Rtc_CalWeek(uint8_t* pu8Date)
{
uint8_t u8week;
if((Rtc_CheckLeapYear(Change_DateTimeFormat(*(pu8Date+2)))==1))
{
u8week=(Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+Leap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
}
else
{
u8week= (Change_DateTimeFormat(*(pu8Date+2))+Change_DateTimeFormat(*(pu8Date+2))/4+NonLeap_Month_Base[Change_DateTimeFormat(*(pu8Date+1))-1]+Change_DateTimeFormat(*(pu8Date))+2)%7;
}
return u8week;
}
/**
******************************************************************************
**\brief RTC根据年月获取天数
**
**\param [in] u8month月份,u8year年份
**
**\retval u8day天数
**
******************************************************************************/
uint8_t Get_Month_Max_Day(uint8_t u8month,uint8_t u8year)
{
uint8_tu8day = 0;
u8day= Cnst_Month_Tbl[u8month - 1];
if((u8month== 2) && ((u8year % 4) == 0))
{
u8day++;
}
return(u8day);//day的格式是bcd码,例如;日为31天,day=0x31
}
/**
******************************************************************************
**\brief RTC根据日期计算周数
**
**\param [in] pu8buf日期时间数据,u8len检查数据长度,u8limit_min最小值,u8limit_max最大值
**
**\retval Error 错误,Ok校验正确
**
******************************************************************************/
en_result_t Check_BCD_Format(uint8_tu8data,uint8_t u8limit_min, uint8_t u8limit_max)
{
if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)
||(u8data > u8limit_max) || (u8data < u8limit_min))
{
return Error;
}
return Ok;
}
/**
******************************************************************************
**\brief RTC时间格式检测
**
**\param [in] pu8TimeDate日期时间数据,u8Mode检测模式
**
**\retval enRet校验结果
**
******************************************************************************/
en_result_tRtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)
{
uint8_t u8i=0;
uint8_t u8mon_max_day = 0x28;
uint8_t u8date[3];
en_result_t enRet;
while(u8i<7)
{
if(u8Mode&&(1<
{
switch(u8i)
{
case 0:
enRet = Check_BCD_Format(*pu8TimeDate,0x00,0x59);//秒
break;
case 1:
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x59);//分
break;
case 2:
if(Rtc12h == M0P_RTC->CR0_f.AMPM)
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);//时
else
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x24);
break;
case 3:
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x06);
break;
case 4:
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x31);
u8date[0] = *pu8TimeDate;
break;
case 5:
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x12);
u8date[1] = *pu8TimeDate;
break;
case 6:
enRet =Check_BCD_Format(*pu8TimeDate,0x00,0x99);
u8date[2] = *pu8TimeDate;
break;
}
pu8TimeDate++;
}
if(enRet!=Ok)
return enRet;
u8i++;
}
if((u8Mode&0x10)&&(u8Mode&0x20))
{
if(u8Mode&0x40)
u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]),Change_DateTimeFormat(u8date[2]));
else
u8mon_max_day= Get_Month_Max_Day(Change_DateTimeFormat(u8date[1]), 1);
if(u8date[0]>u8mon_max_day)
returnError;
}
if((u8Mode&0x10)&&(!(u8Mode&0x20)))
{
if(u8date[0]>0x28)
returnError;
}
enRet = Ok;
return(enRet);
}
/**
******************************************************************************
**\brief RTC设置时间函数
**
**\param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期
**
**\retval Ok 设置正常
**\retval ErrorTimeout 时间溢出错误
******************************************************************************/
en_result_tRtc_WriteDateTime(stc_rtc_time_t* pstcTimeDate,boolean_t bUpdateTime,
boolean_t bUpdateDate)
{
int32_t u32TimeOut;
u32TimeOut = RTC_TIMEOUT;
uint8_t* pu8TimeDate;
en_result_t enRet = Ok;
pu8TimeDate = &pstcTimeDate->u8Second;
ASSERT(NULL != pstcTimeDate);
if(1 == M0P_RTC->CR0_f.START)
{
M0P_RTC->CR1_f.WAIT = 1;
while(--u32TimeOut)
{
if(M0P_RTC->CR1_f.WAITF)
{
break;
}
}
if(u32TimeOut==0)
{
return ErrorTimeout;
}
}
if(TRUE == bUpdateTime)
{
enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkTime);
if(enRet != Ok)
return enRet;
M0P_RTC->SEC = pstcTimeDate->u8Second;
M0P_RTC->MIN = pstcTimeDate->u8Minute;
M0P_RTC->HOUR = pstcTimeDate->u8Hour;
}
if(TRUE == bUpdateDate)
{
enRet = Rtc_CheckDateTimeFormat(pu8TimeDate,CkDate);
if(enRet != Ok)
return enRet;
M0P_RTC->DAY = pstcTimeDate->u8Day;
M0P_RTC->MON = pstcTimeDate->u8Month;
M0P_RTC->YEAR = pstcTimeDate->u8Year;
M0P_RTC->WEEK = pstcTimeDate->u8DayOfWeek;
}
M0P_RTC->CR1_f.WAIT = 0;
if(1 == M0P_RTC->CR0_f.START)
while(M0P_RTC->CR1_f.WAITF);
return enRet;
}
/**
******************************************************************************
**\brief RTC获取时间函数
**
**\param [in] pstcTimeDate日期时间数据
**
**\retval Ok 获取正常
**\retval ErrorTimeout 时间溢出错误
******************************************************************************/
en_result_tRtc_ReadDateTime(stc_rtc_time_t* pstcTimeDate)
{
uint32_t u32TimeOut;
uint8_t u8DayOfWeek, u8BcdSec,u8BcdMin, u8BcdHour, u8Day, u8Month, u8Year;
ASSERT(NULL != pstcTimeDate);
u32TimeOut = RTC_TIMEOUT;
if(1 == M0P_RTC->CR0_f.START)
{
M0P_RTC->CR1_f.WAIT = 1;
while(u32TimeOut--)
{
if(M0P_RTC->CR1_f.WAITF)
{
break;
}
}
if(u32TimeOut==0)
{
return ErrorTimeout;
}
}
u8BcdSec = M0P_RTC->SEC;
u8BcdMin = M0P_RTC->MIN;
u8BcdHour = M0P_RTC->HOUR;
u8Day = M0P_RTC->DAY;
u8Month = M0P_RTC->MON;
u8Year = M0P_RTC->YEAR;
u8DayOfWeek = M0P_RTC->WEEK;
pstcTimeDate->u8Second = u8BcdSec;//BcdToDec(u8BcdSec);
pstcTimeDate->u8Minute = u8BcdMin;//BcdToDec(u8BcdMin);
pstcTimeDate->u8Hour =u8BcdHour;//BcdToDec(u8BcdHour);
pstcTimeDate->u8Day =u8Day;//BcdToDec(u8Day);
pstcTimeDate->u8Month =u8Month;//BcdToDec(u8Month);
pstcTimeDate->u8Year =u8Year;//BcdToDec(u8Year);
pstcTimeDate->u8DayOfWeek = u8DayOfWeek;//BcdToDec(u8DayOfWeek);
M0P_RTC->CR1_f.WAIT = 0;
if(1 == M0P_RTC->CR0_f.START)
while(M0P_RTC->CR1_f.WAITF);
return Ok;
}
/**
******************************************************************************
**\brief RTC计数or读写状态获取
**
**\param [in] 无
**
**\retval 计数or读写状态
**
******************************************************************************/
boolean_t Rtc_RDStatus(void)
{
boolean_t bRet;
bRet = M0P_RTC->CR1_f.WAITF;
return bRet;
}
/**
******************************************************************************
**\brief RTC闹钟中断使能
**
**\param [in] enordis中断使能or禁止
**
**\retval Ok设置成功
**
******************************************************************************/
en_result_tRtc_EnAlarmIrq(en_rtc_alarmirq_t enIrqEn)
{
en_result_t enRet = Error;
M0P_RTC->CR1_f.ALMIE = enIrqEn;
Rtc_ClrIrqStatus(RtcAlmf);//使能中断后清除中断请求标记
enRet = Ok;
return enRet;
}
/**
******************************************************************************
**\brief RTC中断请求状态获取
**
**\param [in] enIrqSel获取哪种中断请求
**
**\retval 中断请求状态
**
******************************************************************************/
boolean_t Rtc_GetIrqStatus(en_rtc_status_irq_tenIrqSel)
{
boolean_t bRet = FALSE;
ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
switch(enIrqSel)
{
case RtcPrdf:
(M0P_RTC->CR1_f.PRDF == 1)?(bRet = TRUE) : (bRet = FALSE);
break;
case RtcAlmf :
(M0P_RTC->CR1_f.ALMF == 1)?(bRet = TRUE) : (bRet = FALSE);
break;
default:
break;
}
return bRet;
}
/**
******************************************************************************
**\brief RTC中断请求清除
**
**\param [in] enIrqSel清除哪种中断请求
**
**\retval Ok 清除成功
**\retval ErrorInvalidParameter 清除失败
******************************************************************************/
en_result_tRtc_ClrIrqStatus(en_rtc_status_irq_t enIrqSel)
{
ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
switch(enIrqSel)
{
case RtcPrdf:
M0P_RTC->CR1_f.PRDF = 0;
break;
case RtcAlmf:
M0P_RTC->CR1_f.ALMF = 0;
break;
default:
return ErrorInvalidParameter;
}
return Ok;
}
/**
******************************************************************************
**\brief RTC中断处理函数接口获取
**
**\param [in] 无
**
**\retval 接口函数地址
**
******************************************************************************/
static stc_rtc_intern_cb_t*RtcGetInternDataCb(void)
{
return &stcRtcIrqCb;
}
/**
******************************************************************************
**\brief RTC总体初始化函数
**
**\param [in] pstcRtcConfig初始化结构
**
**\retval Ok初始化成功
**\retval ErrorInvalidParameter 初始化错误
******************************************************************************/
en_result_t Rtc_Init(stc_rtc_config_t*pstcRtcConfig)
{
en_result_t enRet = Error;
stc_rtc_intern_cb_t* pstcRtcInternCb;
if(NULL == pstcRtcConfig)
return Error;
pstcRtcInternCb = RtcGetInternDataCb();
enRet = Rtc_SelClk(pstcRtcConfig->enClkSel);
enRet = Rtc_SetAmPm(pstcRtcConfig->enAmpmSel);
if(enRet != Ok)
{
return enRet;
}
if(NULL != pstcRtcConfig->pstcCycSel)
{
if(Ok != Rtc_SetCyc(pstcRtcConfig->pstcCycSel))
return Error;
}
if(NULL != pstcRtcConfig->pstcTimeDate)
{
if(Ok != Rtc_WriteDateTime(pstcRtcConfig->pstcTimeDate,TRUE,TRUE))
return Error;
}
if(NULL != pstcRtcConfig->pstcIrqCb)
{
pstcRtcInternCb->pfnAlarmIrqCb =pstcRtcConfig->pstcIrqCb->pfnAlarmIrqCb;
pstcRtcInternCb->pfnTimerIrqCb =pstcRtcConfig->pstcIrqCb->pfnTimerIrqCb;
}
if(TRUE == pstcRtcConfig->bTouchNvic)
{
EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,TRUE);
}
else
{
EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
}
return enRet;
}
/**
******************************************************************************
**\brief RTC计数禁止函数
**
**\param [in] 无
**
**\retval Ok禁止设置成功
**
******************************************************************************/
en_result_t Rtc_DeInit(void)
{
EnableNvic(RTC_IRQn,DDL_IRQ_LEVEL_DEFAULT,FALSE);
Rtc_DisableFunc(RtcCount);
Rtc_DisableFunc(RtcAlarmEn);
Rtc_DisableFunc(Rtc_ComenEn);
Rtc_DisableFunc(Rtc1HzOutEn);
return Ok;
}
/**
******************************************************************************
**\brief RTC中断处理函数
**
**\param [in] 无
**
**\retval 无
**
******************************************************************************/
void Rtc_IRQHandler(void)
{
stc_rtc_intern_cb_t* pstcRtcInternCb;
pstcRtcInternCb = RtcGetInternDataCb() ;
if(TRUE == M0P_RTC->CR1_f.ALMF)
{
M0P_RTC->CR1_f.ALMF = 0u;
if(NULL != pstcRtcInternCb->pfnAlarmIrqCb)
{
pstcRtcInternCb->pfnAlarmIrqCb();
}
}
if(TRUE == M0P_RTC->CR1_f.PRDF)
{
M0P_RTC->CR1_f.PRDF = 0;
if(NULL != pstcRtcInternCb->pfnTimerIrqCb)
{
pstcRtcInternCb->pfnTimerIrqCb();
}
}
}
static void RtcCycCb(void)
{
cyccnt++;
flg = ~flg;
Gpio_SetIO(3,3,flg);
}
static void RtcAlarmCb(void)
{
u8Alarmcnt++;
}
int32_t main(void)
{
stc_rtc_config_t stcRtcConfig;
stc_rtc_irq_cb_t stcIrqCb;
stc_rtc_time_t stcTime;
stc_rtc_alarmset_t stcAlarm;
stc_rtc_cyc_sel_t stcCycSel;
DDL_ZERO_STRUCT(stcRtcConfig);
DDL_ZERO_STRUCT(stcIrqCb);
DDL_ZERO_STRUCT(stcAlarm);
DDL_ZERO_STRUCT(stcTime);
DDL_ZERO_STRUCT(stcCycSel);
Clk_SetPeripheralGate(ClkPeripheralGpio,TRUE);//使能GPIO时钟
Gpio_SetAnalog(1,4,1);//配置成模拟端口即为晶振口
Gpio_SetAnalog(1,5,1);
Clk_Enable(ClkXTL, TRUE);//开启外部晶振32.768
//Clk_Enable(ClkRCL, TRUE);
//Clk_Enable(ClkXTH, TRUE);
Clk_SetPeripheralGate(ClkPeripheralRtc,TRUE);//使能rtc时钟
stcRtcConfig.enClkSel = RtcClk32768;//RtcClkHxt1024;//RtcClk32;//
stcRtcConfig.enAmpmSel = Rtc24h;//Rtc12h;//
stcTime.u8Year = 0x17;
stcTime.u8Month = 0x06;
stcTime.u8Day = 0x07;
stcTime.u8Hour = 0x12;
stcTime.u8Minute = 0x59;
stcTime.u8Second = 0x59;
stcTime.u8DayOfWeek = Rtc_CalWeek(&stcTime.u8Day);
stcRtcConfig.pstcTimeDate = &stcTime;
stcIrqCb.pfnAlarmIrqCb = RtcAlarmCb;
stcIrqCb.pfnTimerIrqCb = RtcCycCb;
stcRtcConfig.pstcIrqCb = &stcIrqCb;
stcRtcConfig.bTouchNvic = FALSE;
Rtc_DisableFunc(RtcCount);
Rtc_Init(&stcRtcConfig);
Rtc_EnableFunc(RtcCount);
Rtc_ReadDateTime(&stcReadTime);
while (1);
}
/******************************************************************************
*EOF (not truncated)
******************************************************************************/
此内容由EEWORLD论坛网友deepskin1213原创,如需转载或用于商业用途需征得作者同意并注明出处