#include "main.h"
#include "stm32f10x.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_bkp.h"
#include "rtc.h"
#include "stm32f10x_exti.h"
#include "drv_uart.h"
#include "wiegand.h"
void RTC_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //??????1
//
// NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //???????
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //???????
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //???????
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //??NVIC
// NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// W5500_NVIC_Configuration(); //W5500 ???????????
}
/****************RTC配置***********************/
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE); /* 使能PWR和BKP时钟 */
RCC_RTCCLKCmd(ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit(); /* 复位BKP寄存器 */
RCC_LSEConfig(RCC_LSE_ON); /* 使能LSE */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); /*等待启动完成 */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* 将 RTC时钟设置为LSE这个32.768KHZ的晶振*/
RCC_RTCCLKCmd(ENABLE); /* 使能RTC Clock */
RTC_WaitForSynchro(); /* 等待同步 */
RTC_WaitForLastTask(); /* 等待对RTC寄存器最后的写操作完成*/
RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)*/ /* 配置了预分频值: 设置RTC时钟周期为1s */
RTC_WaitForLastTask(); /* 等待对RTC寄存器最后的写操作完成 */
// RTC_ITConfig(RTC_IT_SEC, ENABLE); /* 使能RTC秒中断 */
// RTC_WaitForLastTask(); /* 等待对RTC寄存器最后的写操作完成 */
}
/****************RTC初始化***********************/
void RTC_Initializes(void)
{
RTC_DateTimeTypeDef RTC_DateTimeStructure;
RTC_DateTimeStructure.Year = 18;
RTC_DateTimeStructure.Month = 9;
RTC_DateTimeStructure.Date = 21;
RTC_DateTimeStructure.Hour = 14;
RTC_DateTimeStructure.Minute = 11;
RTC_DateTimeStructure.Second = 00;
PWR_BackupAccessCmd(ENABLE); //允许操作后备区域
/* 判断是否首次操作RTC */
if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
RTC_Configuration(); //配置RTC
RTC_SetDateTime(RTC_DateTimeStructure); //初始化日历(2018年8月15日 10:27:30)
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else
{
if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
{
}
else if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
{
}
RTC_WaitForSynchro(); //等待RTC与RTC_APB时钟同步
}
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能秒中断
RTC_WaitForLastTask(); //等待RTC最后一次操作完成
}
/*******************设置RTC日期时间**************************/
RTC_RESULT RTC_SetDateTime(RTC_DateTimeTypeDef RTC_DateTimeStructure)
{
uint32_t num_leapyear; //闰年天数
uint32_t conut_year; //记秒(年)
uint32_t conut_month_day; //月日的秒计数
/*------------------------- 判断是否越界 --------------------------*/
//年、月、星期、时、分、秒
if((130 < RTC_DateTimeStructure.Year) || (12 < RTC_DateTimeStructure.Month) ||
(24 <= RTC_DateTimeStructure.Hour) || (60 <= RTC_DateTimeStructure.Minute) || (60 <= RTC_DateTimeStructure.Second))
{
return RTC_OVERFLOW;
}
//日
if((RTC_DateTimeStructure.Month==1)|(RTC_DateTimeStructure.Month==3)|(RTC_DateTimeStructure.Month==5)|(RTC_DateTimeStructure.Month==7)|(RTC_DateTimeStructure.Month==8)|(RTC_DateTimeStructure.Month==10)|(RTC_DateTimeStructure.Month==12))
{
if(RTC_DateTimeStructure.Date > 31)
return RTC_OVERFLOW;
}
else if((RTC_DateTimeStructure.Month==4)|(RTC_DateTimeStructure.Month==6)|(RTC_DateTimeStructure.Month==9)|(RTC_DateTimeStructure.Month==11))
{
if(RTC_DateTimeStructure.Date > 30)
return RTC_OVERFLOW;
}
else if(RTC_DateTimeStructure.Month==2)
{ /* 如果是闰年 */
if(RTC_DateTimeStructure.Year%4 == 0)
{
if(RTC_DateTimeStructure.Date > 29)
return RTC_OVERFLOW;
}
else if(RTC_DateTimeStructure.Date > 28)
return RTC_OVERFLOW;
}
//--------------------------- 计算天数 ----------------------------
//闰年天数
num_leapyear = RTC_DateTimeStructure.Year/4 + 1;
//记秒(年)
conut_year = RTC_DateTimeStructure.Year*SEC_YEAR + num_leapyear*SEC_DAY;
switch(RTC_DateTimeStructure.Month)
{
case 1:/* 一月 */
conut_month_day = (RTC_DateTimeStructure.Date-1)*SEC_DAY;
if(RTC_DateTimeStructure.Year%4 == 0) //如是闰年,则减去一天的计数
conut_month_day -= SEC_DAY;
break;
case 2:/* 二月 */
conut_month_day = (31 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
if(RTC_DateTimeStructure.Year%4 == 0) //如是闰年,则减去一天的计数
conut_month_day -= SEC_DAY;
break;
case 3:/* 三月 */
conut_month_day = (59 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 4:/* 四月 */
conut_month_day = (90 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 5:/* 五月 */
conut_month_day = (120 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 6:/* 六月 */
conut_month_day = (151 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 7:/* 七月 */
conut_month_day = (181 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 8:/* 八月 */
conut_month_day = (212 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 9:/* 九月 */
conut_month_day = (243 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 10:/* 十月 */
conut_month_day = (273 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 11:/* 十一月 */
conut_month_day = (304 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
case 12:/* 十二月 */
conut_month_day = (334 + RTC_DateTimeStructure.Date - 1)*SEC_DAY;
break;
}
RTC_WaitForLastTask();
//设置计数值
RTC_SetCounter(conut_year + conut_month_day + RTC_DateTimeStructure.Hour*3600 + RTC_DateTimeStructure.Minute*60 + RTC_DateTimeStructure.Second);
//等待RTC操作完成
RTC_WaitForLastTask();
return RTC_OK;
}
/***********************读取RTC时间**************************/
void RTC_GetDateTime(RTC_DateTimeTypeDef *RTC_DateTimeStructure) //RTC_DateTimeStructure RTC时间结构体
{
uint32_t num_day; //计数的天数
uint32_t num_daytmp; //该年的天数
uint32_t num_leapyear; //闰年数
uint32_t count_value = RTC_GetCounter(); //读取RTC计数值
num_day = count_value/SEC_DAY; //从0开始计算天数
num_leapyear = num_day/(365*4+1) + 1; //闰年天数
if(num_day%(365*4+1) == 0) //闰年的1月1日
RTC_DateTimeStructure->Year = (uint8_t)((num_day - num_leapyear + 1)/365);
else
RTC_DateTimeStructure->Year = (num_day - num_leapyear)/365;
if(RTC_DateTimeStructure->Year%4 == 0)
{
/* 闰年一年内的天数 */