打印
[STM8]

STM8单片机rtc时钟代码分享

[复制链接]
332|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
                                    

        STM8 rtc时钟可以使用内部低频时钟源,或者外部低速32768Hz时钟源,关于rtc部分代码如下:

        #include

        #include

        voidinit_rtc(void)

        {

        RTC_InitTypeDefRTC_InitStr;

        RTC_TimeTypeDefRTC_TImeStr;

        RTC_DateTypeDefRTC_DateStr;

       

        #if0

        /*LSI*/

        CLK_RTCClockConfig(CLK_RTCCLKSource_LSI,CLK_RTCCLKDiv_1);

        CLK_PeripheralClockConfig(CLK_Peripheral_RTC,ENABLE);

        RTC_InitStr.RTC_HourFormat=RTC_HourFormat_24;

        RTC_InitStr.RTC_AsynchPrediv=0x7C;

        RTC_InitStr.RTC_SynchPrediv=0x012F;

        RTC_Init(&RTC_InitStr);

        #else

        /*LSE*/

        CLK_LSEConfig(CLK_LSE_ON);

        while(CLK_GetFlagStatus(CLK_FLAG_LSERDY)==RESET);

        CLK_RTCClockConfig(CLK_RTCCLKSource_LSE,CLK_RTCCLKDiv_1);

        CLK_PeripheralClockConfig(CLK_Peripheral_RTC,ENABLE);

        RTC_InitStr.RTC_HourFormat=RTC_HourFormat_24;

        RTC_InitStr.RTC_AsynchPrediv=127;

        RTC_InitStr.RTC_SynchPrediv=255;

        RTC_Init(&RTC_InitStr);

        #endif

        RTC_TImeStrucTInit(&RTC_TImeStr);

        RTC_TimeStr.RTC_Hours=00;

        RTC_TimeStr.RTC_Minutes=00;

        RTC_TimeStr.RTC_Seconds=00;

        RTC_SetTime(RTC_Format_BIN,&RTC_TimeStr);

        RTC_DateStructInit(&RTC_DateStr);

        RTC_DateStr.RTC_WeekDay=RTC_Weekday_Tuesday;

        RTC_DateStr.RTC_Date=2;

        RTC_DateStr.RTC_Month=RTC_Month_February;

        RTC_DateStr.RTC_Year=16;

        RTC_SetDate(RTC_Format_BIN,&RTC_DateStr);

        }

        voidrtc_get_time(char*buf)

        {

        RTC_TimeTypeDefRTC_TimeStr;

        while(RTC_WaitForSynchro()!=SUCCESS);

        RTC_GetTime(RTC_Format_BIN,&RTC_TimeStr);

        sprintf(buf,“%02d:%02d:%02d”,

        RTC_TimeStr.RTC_Hours&0xff,RTC_TimeStr.RTC_Minutes&0xff,RTC_TimeStr.RTC_Seconds&0xff);

        }

        voidrtc_get_date(char*buf)

        {

        RTC_DateTypeDefRTC_DateStr;

        while(RTC_WaitForSynchro()!=SUCCESS);

        RTC_GetDate(RTC_Format_BIN,&RTC_DateStr);

        sprintf(buf,“%04d-%02d-%02d”,

        (RTC_DateStr.RTC_Year&0xff)+2000,RTC_DateStr.RTC_Month&0xff,RTC_DateStr.RTC_Date&0xff);

        }

        关于rtc定时唤醒,进入halt模式使用编译器提供的halt()函数就可以了,如果需要定时唤醒,需要对rtc做相应的配置,代码如下:

        /*maximumwakeuptimeis(0xFFFF+1)*31.25ms=2048s*/

        voidinit_rtc(void)

        {

        CLK_LSEConfig(CLK_LSE_ON);

        while(CLK_GetFlagStatus(CLK_FLAG_LSERDY)==RESET);

        CLK_RTCClockConfig(CLK_RTCCLKSource_LSE,CLK_RTCCLKDiv_64);

        CLK_PeripheralClockConfig(CLK_Peripheral_RTC,ENABLE);

        RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);

        RTC_ITConfig(RTC_IT_WUT,ENABLE);

        enableInterrupts();

        RTC_SetWakeUpCounter(800);

        RTC_WakeUpCmd(ENABLE);

        }

        这里配置的是800×31.25=25s唤醒一次,唤醒之后,触发rtc唤醒中断,可以在中断函数中做相关处理,如果需要再次进入halt模式,重新调用halt()函数就可以了。

               
                                

使用特权

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

本版积分规则

116

主题

199

帖子

1

粉丝