• 大小: 4KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签:

资源简介

此文件中包含了stm32_rtc.c,stm32_rtc.h用内置的rtc计算器实现万年历的相关函数,函数主要实现年月日时分秒周的计算,其计数值存放在bkp存储区中。

代码片段和文件信息

#include “stm32f10x.h“

const u8 month_day_num[12] ={312831303130313130313031};//平年每个月的天数

u16 ms_count;
TIMER_VALUE global_time_value;//16进制的年月日时分秒(实时刷新)
TIMER_VALUE global_time_BCD;//BCD格式的年月日时分秒(使用时先调用Timer_HEXToBCD())
/*************************************************
*函数名: u8 *GetGlobaltimevalue(void)
*功能描述: 得到实时时钟值(16进制)
*入口参数: 无
*出口参数: 无
*作者: WWM
*************************************************/
u8* GetGlobaltimevalue16(void)
{
return (&global_time_value.second);
}


/*************************************************
*函数名: TIMER_VALUE *GetGlobaltimevalue(void)
*功能描述: 得到实时时钟值(16进制)
*入口参数: 无
*出口参数: 无
*作者: WWM
*************************************************/
u8* GetGlobaltimevalueBCD(void)
{
Timer_HEXToBCD();
return (&global_time_BCD.second);
}
/*************************************************
*函数名: void INIT_RTC(void)
*功能描述: 对rtc的初始化
*入口参数: 无
*出口参数: 无
*作者: WWM
*************************************************/
void INIT_RTC(void)
{
//00年,1月,1日,0时,0分,0秒,周六
global_time_value.year = 0x00;
global_time_value.month  =  0x01;
global_time_value.day  =  0x01;
global_time_value.hour  =  0x00;
global_time_value.minute  =  0x00;
global_time_value.second  =  0x00;
global_time_value.week  =  0x06; 
ms_count = 200;//ms_count--;放入1ms中断中

//由于实时时钟的一个寄存器挂在电源管理的一个位上
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP ENABLE);
//开启备份区域
    PWR_BackupAccessCmd(ENABLE);
    //我们在BKP的后备寄存器1中,存了一个特殊字符0xA5A5
    //第一次上电或后备电源掉电后,该寄存器数据丢失,
    //表明RTC数据丢失,需要重新配置
    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
    {
        //重新配置RTC
        //启用PWR和BKP的时钟(from APB1)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP ENABLE);

    //后备域解锁
    PWR_BackupAccessCmd(ENABLE);

    //备份寄存器模块复位
    BKP_DeInit();

    //外部32.768K(外部的低速时钟)
    RCC_LSEConfig(RCC_LSE_ON);
    //等待稳定
    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

    //RTC时钟源配置成LSE(外部32.768K)
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    //RTC开启
    RCC_RTCCLKCmd(ENABLE);

    //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
    RTC_WaitForSynchro();

    //读写寄存器前,要确定上一个操作已经结束
    RTC_WaitForLastTask();

    //设置RTC分频器,使RTC时钟为1Hz
    RTC_SetPrescaler(32767);//7fffh
RTC_WaitForLastTask();
RTC_SetCounter(0x0);//从0开始计数

    //等待寄存器写入完成
    RTC_WaitForLastTask();

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

    //等待写入完成
    RTC_WaitForLastTask();
        //配置完成后,向后备寄存器中写特殊字符0xA5A5
        BKP_WriteBackupRegister(BKP_DR1 0xA5A5);
    }
    else
    {
        //若后备寄存器没有掉电,则无需重新配置RTC
        //这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型
        if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
        {
            //这是上电复位
        }
        else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
        {
            //这是外部RST管脚复位
        }
        //清除RCC中复位标志
        RCC_ClearFlag();
       

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      13046  2010-12-14 19:07  stm32_实时时钟_可以实现年月日时分秒周的计算\rtc.c

     文件        986  2010-12-09 19:29  stm32_实时时钟_可以实现年月日时分秒周的计算\rtc.h

     目录          0  2011-04-01 16:47  stm32_实时时钟_可以实现年月日时分秒周的计算

----------- ---------  ---------- -----  ----

                14032                    3


评论

共有 条评论

相关资源