查看: 4365|回复: 0

STM32F单片机的RTC校准功能是什么?

[复制链接]
  • TA的每日心情
    擦汗
    2014-2-12 10:49
  • 签到天数: 150 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-8-22 15:51:49 | 显示全部楼层 |阅读模式
    分享到:

    STM32里面有备份寄存器(BKP),它的功能之一就是用来存储RTC校验值的校验寄存器,即具有RTC校准功能。在PC13引脚上输出RTC 校准时钟,RTC闹钟或者秒脉冲。在程序中有#define RTCClockOutput_Enable /*RTC Clock/64 is output on tamper pin(PC.13)*/

    BKP可以用来存储84个字节的用户应用程序数据,他们处在备份域里,当Vdd电源被切断时,他们仍然由Vbat维持供电。

    判断RTC后备寄存器1的值是否为事先写入的某个值,如果不是,则说明RTC是第一次上电,需要配置RTC。针对BKP也有相应的库函数。

    u16 BKP_ReadBackupRegister(u16 BKP_DR) 从指定的后备寄存器中读出数据

    如果不是之前写入的某个值,需要配置RTC,函数RTC_Configuration(void)

    执行以下操作将使能对后备寄存器和RTC的访问:

    ● 设置寄存器RCC_APB1ENR的PWREN 和BKPEN位,使能电源和后备接口时钟

    ● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。




    • RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//对应操作1
    • PWR_BackupAccessCmd(ENABLE);//对应操作2

    RTC模块用外部LSE时钟--32.768的晶振作为时钟,由寄存器控制启动和关闭,然后等待状态稳定后,寄存器指示LSE晶振振荡器是否稳定。




    • RCC_LSEConfig(RCC_LSE_ON);//使能LSE
    • /* 等待外部晶振震荡稳定输出 */
    • while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
    • {}


    待LSE状态稳定后,使用外部32.768KHz晶振作为RTC时钟,由库函数RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE)实现



    • RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //使用LSE作为RTC时钟
    • RCC_RTCCLKCmd(ENABLE); //使能RTC,只有在通过RCC_RTCCLKConfig选择RTC时钟后,才能调用



    • RTC_WaitForSynchro();//等待RTC寄存器与APB时钟同步??
    • /* Wait until last write operation on RTC registers has finished */
    • RTC_WaitForLastTask();
    • /* 使能RTC的秒中断 */
    • RTC_ITConfig(RTC_IT_SEC, ENABLE);//在使能中断前,必须调用RTC_WaitForLastTask();

    • RTC_SetPrescaler(32767);//设置RTC的预分频值


    RTC_WaitForLastTask( )的作用:软件通过APB1接口访问RTC的预分频值、计数器值等,但是,相关的可读寄存器只在与RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此。这意味着如果APB1接口曾经被关闭,而读操作又是在刚刚重新开启APB1之 后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能已经被破坏了。因此,若在读取RTC寄存器时,RTC的APB1接口曾经处 于禁止状态,则软件必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置‘1’。

    在RTC读取的数据是之前写入到BKP中的数据,那么会调用函数RCC_GetFlagStatus()读取状态/控制寄存器RCC_CSR中的某些位来判断启动后的状态,

    判断掉电/上电复位标志或者复位标志,如果相应的标志位为1,则不需要从新配置RTC。

    最后清除RCC的复位标志位,void RCC_ClearFlag(void)

    在设置了秒中断后,在stm32f10x_it.c中设置了中断处理函数,中断函数中首先需要判断是否发生了秒中断,如果是,需要清除相应的中断标志位。还有一个重要的情况是在时间达到23:59:59时,则下一时刻时间为00:00:00。


    • if (RTC_GetCounter() == 0x00015180) //获取RTC计数器的值
    •       RTC_SetCounter(0x0);//设置RTC计数器的值


    通过读取RTC计数器的值,可以将其转化为时:分:秒的形式打印出来。 同时,如果RTC是第一次被配置,用户需要输入时间,然后调用Time_Adjust( )将用户输入的时间转化到RTC计数值写到相应的寄存器中。


    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-6-3 03:07 , Processed in 0.097938 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.