打印

华大MO+低功耗MCU RTC模块程序示例

[复制链接]
1802|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
华大单片机|  楼主 | 2018-2-9 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/************************************************************/

/*******                 样例使用说明           *************/

/*******                    版本历史            ************/

/*******  日期       版本    负责人  IAR   MDK ***********/  

/*****    017-07-14     0.1     CJ    7.70    5.14 **********/

/*******  QQ:3396208645                       ************/


/*******               功能描述                  ***********/

/*   本样例主要涉及时钟模块计数寄存器的写入和读取**********/

/*说明:                                       *************/

/*计数初值写入计数寄存器                       *************/

/*启动计数                                    *************/

/*读取计数寄存器数值                           *************/

/******* 测试环境                              *************/

/*     测试用板:                              *************/

/* 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 **=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] bmode12时制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;

相关帖子

沙发
华大单片机|  楼主 | 2018-2-9 14:09 | 只看该作者
}
/**
******************************************************************************
** \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_t enFunc)
{
    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_t enFunc)
{
    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_t u8de=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_t u8day = 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_t u8data,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_t Rtc_CheckDateTimeFormat(uint8_t* pu8TimeDate,uint8_t u8Mode)
{
    uint8_t u8i=0;
    uint8_t u8mon_max_day = 0x28;
    uint8_t u8date[3];

使用特权

评论回复
板凳
华大单片机|  楼主 | 2018-2-9 14:09 | 只看该作者
en_result_t enRet;
    while(u8i<7)
    {
        if(u8Mode&&(1<<u8i))
        {
            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)
                        return Error;
        }
        if((u8Mode&0x10)&&(!(u8Mode&0x20)))
        {
                if(u8date[0]>0x28)
                        return Error;
        }
    enRet = Ok;
        return(enRet);
}
/**
******************************************************************************
** \brief  RTC设置时间函数
**
** \param [in] pstcTimeDate日期时间数据、bUpdateTime是否更改时间、bUpdateDate是否更改日期
**
** \retval Ok  设置正常
** \retval ErrorTimeout 时间溢出错误
******************************************************************************/
en_result_t Rtc_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_t Rtc_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_t Rtc_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_t enIrqSel)
{
    boolean_t bRet = FALSE;
    ASSERT(IS_VALID_IRQ_SEL(enIrqSel));
    switch(enIrqSel)

使用特权

评论回复
地板
华大单片机|  楼主 | 2018-2-9 14:11 | 只看该作者
{
        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_t Rtc_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++;
    ** = ~**;
    Gpio_SetIO(3,3,**);
}
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)
******************************************************************************/

使用特权

评论回复
5
华大单片机|  楼主 | 2018-11-26 09:16 | 只看该作者
欢迎支持一下技术贴!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

112

帖子

5

粉丝