8997|15

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

华大M0+低功耗MCU RTC模块示例 [复制链接]

 

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

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

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

/*******  日期       版本    负责人  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] 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;

}

/**

******************************************************************************

**\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原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自单片机论坛

最新回复

大佬,您微信多少,向您请教几个问题  详情 回复 发表于 2020-1-19 22:55
点赞 关注
个人签名华大半导体 QQ:3386208645
 

回复
举报

1903

帖子

0

TA的资源

版主

沙发
 
国产的,支持一下
此帖出自单片机论坛
 
 

回复

525

帖子

235

TA的资源

版主

板凳
 
支持支持!
此帖出自单片机论坛
 
个人签名爱电子,爱生活
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

4
 
star_66666 发表于 2018-2-9 16:19
国产的,支持一下

央企品牌,中电旗下的
此帖出自单片机论坛

点评

搞一波免费试用,可以开拓市场  详情 回复 发表于 2018-2-14 13:37
 
个人签名华大半导体 QQ:3386208645
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 

感谢了!
此帖出自单片机论坛
 
个人签名华大半导体 QQ:3386208645
 
 

回复

1903

帖子

0

TA的资源

版主

6
 
是吧,只有央企才有钱自己做
此帖出自单片机论坛
 
 
 

回复

1903

帖子

0

TA的资源

版主

7
 
deepskin1213 发表于 2018-2-13 15:36
央企品牌,中电旗下的

搞一波免费试用,可以开拓市场
此帖出自单片机论坛
 
 
 

回复

1903

帖子

0

TA的资源

版主

8
 
我们工程师都不会用,选型时是不会考虑的
此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

9
 
star_66666 发表于 2018-2-14 13:37
搞一波免费试用,可以开拓市场

您指的这种免费适用是在本论坛中搞活动么?另外想跟您沟通一下,方便留个QQ或者电话的联系方式么?
此帖出自单片机论坛

点评

给你发私信  详情 回复 发表于 2018-2-24 09:42
 
个人签名华大半导体 QQ:3386208645
 
 

回复

1903

帖子

0

TA的资源

版主

10
 
deepskin1213 发表于 2018-2-24 09:37
您指的这种免费适用是在本论坛中搞活动么?另外想跟您沟通一下,方便留个QQ或者电话的联系方式么?

给你发私信
此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

11
 
热度不断攀升!欢迎QQ或者微信咨询!
此帖出自单片机论坛
 
个人签名华大半导体 QQ:3386208645
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

12
 
华大单片机特殊端口应用注意事项一芯虎论坛-中国芯中国梦
http://tigerchip.com.cn/forum.php?mod=viewthread&tid=68&fromuid=2
(出处: 芯虎论坛)
此帖出自单片机论坛
 
个人签名华大半导体 QQ:3386208645
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

13
 

好帖不能沉啊!

此帖出自单片机论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

14
 
大佬,您微信多少,向您请教几个问题
此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

15
 
白虎姐 发表于 2020-1-19 22:55 大佬,您微信多少,向您请教几个问题

QQ:3386208645.也欢迎站内联系。

此帖出自单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

16
 

保持热度。

此帖出自单片机论坛
 
个人签名华大半导体 QQ:3386208645
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表