×
单片机 > 单片机程序设计 > 详情

stm32在rt-thread上的RTC(实时时钟)

发布时间:2020-06-01 发布时间:
|

rt-thread中已经部分实现了rtc的内容 ---> rtc.c ,调用rt_hw_rtc_init()函数即可使用msh设置date和time等


rtc时钟来源有三个:


HSE, LSE, LSI, 实现如下: 在原RTC_Configuration(void)进行替换即可




    /* Enable LSE */

    #ifdef USE_LSE

        RCC_LSEConfig(RCC_LSE_ON);

        /* Wait till LSE is ready */

        while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) );

    #else

        #ifdef USE_HSE



        #else

            RCC_LSICmd(ENABLE);

            /* Wait till LSE is ready */

            while ( (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) && (--count) );

        #endif

    #endif

    if ( count == 0 )

    {

        return -1;

    }



    /* Select LSE as RTC Clock Source */

    #ifdef USE_LSE

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    #else

        #ifdef USE_HSE

            RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

        #else

            RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

        #endif

    #endif

    /* Enable RTC Clock */

    RCC_RTCCLKCmd(ENABLE);



    /* Wait for RTC registers synchronization */

    RTC_WaitForSynchro();



    /* Wait until last write operation on RTC registers has finished */

    RTC_WaitForLastTask();



    /* Set RTC prescaler: set RTC period to 1sec */

    #ifdef USE_LSE

        RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

    #else

        #ifdef USE_HSE

            RTC_SetPrescaler(93749); /* 72 MHz / 128 */

        #else

            RTC_SetPrescaler(40000); /* 40 KHz */

        #endif

    #endif




注意:/* Note:If the HSE divided by 128 is used as the RTC clock, this bit must remain set to 1. */




秒中断和ALARM中断实现:


        rt_hw_rtc_navi_init();

        RTC_WaitForLastTask();

        RTC_SetAlarm(RTC_GetCounter()+25);       //当前RTC值的基础上加时间

        RTC_WaitForLastTask();

        RTC_ITConfig(RTC_IT_SEC, ENABLE);      //使能秒中断

        RTC_WaitForLastTask();

        RTC_ITConfig(RTC_IT_ALR,ENABLE);       //使能arlarm中断


        RTC_WaitForLastTask();




void rt_hw_rtc_navi_init(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; 

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);

}




void RTC_IRQHandler(void)

{

    /* enter interrupt */

    rt_interrupt_enter();



    if(RTC_GetITStatus(RTC_IT_ALR) == SET)

    {

        rt_kprintf("RTCAlarm_IRQHandler1~~~rn");

        RTC_ClearITPendingBit(RTC_IT_ALR);

    }

    if(RTC_GetITStatus(RTC_IT_SEC) == SET)

    {

        RTC_ClearITPendingBit(RTC_IT_SEC);

        rt_kprintf("RTCAlarm_IRQHandler2~~~rn");

    }

    /* leave interrupt */

    rt_interrupt_leave();

}



ps:RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */  这个不是alarm的中断函数哟


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码