资源简介
此文件中包含了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
评论
共有 条评论