Files
SM-1000M/RTX5_20220316/Driver/RTC/rtc.c
2026-04-23 10:50:18 +08:00

781 lines
25 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************
头文件
*********************************************************************************
*/
#include "rtc.h"
/*
************************************************************************************
变量定义
************************************************************************************
*/
//平年的月份日期表 闰年2月份29天
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
MYITStatus_Struct MYITStatus1;
u8 key_time,IS_FIRST_SAVE = 0;
/*
*********************************************************************************************************
* 函 数 名: RTC_NVIC_CONFIG()
* 功能说明: RTC中断配置
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void RTC_NVIC_CONFIG(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource13,GPIO_AF_WKUP);
EXTI_ClearITPendingBit(EXTI_Line20);
EXTI_InitStructure.EXTI_Line=EXTI_Line20;//RTC wakeup
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=RTC_WKUP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;
NVIC_Init(&NVIC_InitStructure);
/* EXTI configuration */
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable the RTC Alarm Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
*********************************************************************************************************
* 函 数 名: RTC_Time_Init()
* 功能说明: RTC初始化
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void RTC_Time_Init(void)
{
RTC_InitTypeDef RTC_InitStructure;
//RTC_TimeTypeDef RTC_TimeStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/*!< Allow access to RTC */
PWR_RTCAccessCmd(ENABLE);
/*!< 使能外部低速时钟 */
RCC_LSEConfig(RCC_LSE_ON);
// RCC_LSICmd(ENABLE);
/*!< 等待外部低速时钟就绪 */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择外部LES作为RTC时钟源
RCC_RTCCLKCmd(ENABLE);
/*!< Wait for RTC APB registers synchronisation */
RTC_WaitForSynchro();
RTC_InitStructure.RTC_AsynchPrediv=127;
RTC_InitStructure.RTC_HourFormat=RTC_HourFormat_24;
RTC_InitStructure.RTC_SynchPrediv=255;
RTC_Init(&RTC_InitStructure);//RTC的时钟1HZ
RTC_NVIC_CONFIG();
}
/*
*********************************************************************************************************
* 函 数 名: rtc_std_init()
* 功能说明: RTC初始化1
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void rtc_std_init(void)
{
/* Enable the PWR clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* Allow access to RTC */
PWR_RTCAccessCmd(ENABLE);
/* Wait for RTC APB registers synchronisation */
RTC_WaitForSynchro();
RTC_NVIC_CONFIG();
}
/*
*********************************************************************************************************
* 函 数 名: SetRTC()
* 功能说明: 设置本地硬件RTC时间
* 输 入 :年 set_year,月 set_mon,日 set_day,时 set_hour,分 set_min ,秒 set_sec
* 输 出 :无
*********************************************************************************************************
*/
void SetRTC(int set_year,int set_mon,int set_day,int set_hour,int set_min ,int set_sec)
{
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
RTC_TimeStruct.RTC_Hours = set_hour;
RTC_TimeStruct.RTC_Minutes = set_min;
RTC_TimeStruct.RTC_Seconds = set_sec;
RTC_TimeStruct.RTC_H12 = 0; //程序中不使用上午/下午
RTC_SetTime(RTC_Format_BIN,&RTC_TimeStruct);
RTC_DateStruct.RTC_Year = set_year;
RTC_DateStruct.RTC_Month = set_mon;
RTC_DateStruct.RTC_Date = set_day;
RTC_DateStruct.RTC_WeekDay = 1;//程序中不使用星期
RTC_SetDate(RTC_Format_BIN,&RTC_DateStruct);
RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);
}
/*
*********************************************************************************************************
* 函 数 名: Set_GNSSTIME_Rtc()
* 功能说明: GPS校时
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void Set_GNSSTIME_Rtc(void)
{
int set_years, set_mons, set_days, set_hours, set_mins , set_secs;
if(Save_Data.isUsefull)//定位数据有效
{
set_years=(Save_Data.UTCData[0]-'0')*10+(Save_Data.UTCData[1]-'0');//年
set_mons=(Save_Data.UTCData[2]-'0')*10+(Save_Data.UTCData[3]-'0');//月
set_days=(Save_Data.UTCData[4]-'0')*10+(Save_Data.UTCData[5]-'0');//日
set_hours=(Save_Data.UTCTime[0]-'0')*10+(Save_Data.UTCTime[1]-'0')+8;//时
set_mins=(Save_Data.UTCTime[2]-'0')*10+(Save_Data.UTCTime[3]-'0');//分
set_secs=(Save_Data.UTCTime[4]-'0')*10+(Save_Data.UTCTime[5]-'0');//秒
SetRTC(set_years,set_mons,set_days,set_hours,set_mins,set_secs);
}
}
/*
*********************************************************************************************************
* 函 数 名: GetRTC()
* 功能说明: 获取本地硬件RTC时间
* 输 入 时分秒yymmdd 年月日hhmmss
* 输 出 :无
*********************************************************************************************************
*/
void GetRTC(char *hhmmss,char *yymmdd)
{
RTC_TimeTypeDef time;
RTC_DateTypeDef date;
RTC_GetTime(RTC_Format_BIN,&time);
RTC_GetDate(RTC_Format_BIN,&date);
yymmdd[0]=date.RTC_Year/10+0x30; //年十位
yymmdd[1]=date.RTC_Year%10+0x30; //年个位
yymmdd[2]=date.RTC_Month/10+0x30; //月十位
yymmdd[3]=date.RTC_Month%10+0x30; //月十位
yymmdd[4]=date.RTC_Date/10+0x30; //日十位
yymmdd[5]=date.RTC_Date%10+0x30; //日十位
hhmmss[0]=time.RTC_Hours/10+0x30; //小时十位
hhmmss[1]=time.RTC_Hours%10+0x30; //小时个位
hhmmss[2]=time.RTC_Minutes/10+0x30; //分钟十位
hhmmss[3]=time.RTC_Minutes%10+0x30; //分钟十位
hhmmss[4]=time.RTC_Seconds/10+0x30; //秒十位
hhmmss[5]=time.RTC_Seconds%10+0x30; //秒十位
}
void GetTime(char *hhmmss,char *yymmdd)
{
get_show_time();
yymmdd[0]=calendar.w_year/10+0x30; //年十位
yymmdd[1]=calendar.w_year%10+0x30; //年个位
yymmdd[2]=calendar.w_month/10+0x30; //月十位
yymmdd[3]=calendar.w_month%10+0x30; //月十位
yymmdd[4]=calendar.w_date/10+0x30; //日十位
yymmdd[5]=calendar.w_date%10+0x30; //日十位
hhmmss[0]=calendar.hour/10+0x30; //小时十位
hhmmss[1]=calendar.hour%10+0x30; //小时个位
hhmmss[2]=calendar.min/10+0x30; //分钟十位
hhmmss[3]=calendar.min%10+0x30; //分钟十位
hhmmss[4]=calendar.sec/10+0x30; //秒十位
hhmmss[5]=calendar.sec%10+0x30; //秒十位
}
/*
*********************************************************************************************************
* 函 数 名: RTC_GetSeconds()
* 功能说明: 获取本地硬件RTC时间S
* 输 入 :无
* 输 出 秒secondss
*********************************************************************************************************
*/
u32 RTC_GetSeconds(void)
{
u32 secondss;
RTC_TimeTypeDef time;
RTC_GetTime(RTC_Format_BIN,&time);
secondss= time.RTC_Hours*3600 + time.RTC_Minutes*60 + time.RTC_Seconds;
return secondss;
}
/*
*********************************************************************************************************
* 函 数 名: RtcWakeUpConfig()
* 功能说明: 自动唤醒配置
* 输 入 唤醒时间temp
* 输 出 :无
*********************************************************************************************************
*/
void RtcWakeUpConfig(u32 temp)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_ClearITPendingBit(EXTI_Line20);
EXTI_InitStructure.EXTI_Line=EXTI_Line20;//RTC wakeup
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=RTC_WKUP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;
NVIC_Init(&NVIC_InitStructure);
RTC_WakeUpCmd(DISABLE);
RTC_ClearFlag(RTC_FLAG_WUTF);
if(temp>65535)
{
RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_17bits);
temp-=65535;
}
else RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
RTC_SetWakeUpCounter(temp); //设置唤醒时间--S,最大65536s=18小时 2^17=131072 131072/3600s=36.4h
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_ITConfig(RTC_IT_WUT,ENABLE); //需要使能中断,不需要中断函数
RTC_WakeUpCmd(ENABLE);
}
/*
*********************************************************************************************************
* 函 数 名: RtcWakeUppin()
* 功能说明: 唤醒引脚配置
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void RtcWakeUppin(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource13,GPIO_AF_WKUP);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Connect EXTI0 Line to PA0 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI_InitStructure.EXTI_Line=EXTI_Line13;//RTC wakeup
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;
NVIC_Init(&NVIC_InitStructure);
PWR_WakeUpPinCmd(PWR_WakeUpPin_2,ENABLE);//使能唤醒引脚
}
/*
*********************************************************************************************************
* 函 数 名: Is_Leap_Year()
* 功能说明: 判断是否是闰年函数
* 输 入 年份year
* 输 出 :该年份是不是闰年.1,是.0,不是
* 月份 1 2 3 4 5 6 7 8 9 10 11 12
* 闰年 31 29 31 30 31 30 31 31 30 31 30 31
* 非闰年 31 28 31 30 31 30 31 31 30 31 30 31
*********************************************************************************************************
*/
u8 Is_Leap_Year(u16 year)
{
year=year+2000;
// year=0x14ff&year;
if(year%4==0) //必须能被4整除
{
if(year%100==0)
{
if(year%400==0)return 1;//如果以00结尾,还要能被400整除
else return 0;
}else return 1;
}else return 0;
}
/*
*********************************************************************************************************
* 函 数 名: MYRTC_Init()
* 功能说明: RTC初始化
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void MYRTC_Init(void)
{
RTC_NVIC_CONFIG();
RTC_Time_Init();
PWR_ClearFlag(PWR_FLAG_WU);//唤醒之后加上这个清除中断
}
/*
*********************************************************************************************************
* 函 数 名: RTC_AlarmAConfig()
* 功能说明: 设置远传间隔启动时间
* 输 入 u32 seconds 单位:秒
* 输 出 :无
*********************************************************************************************************
*/
void RTC_AlarmAConfig(u32 seconds)
{
int month_day;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* EXTI configuration */
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable the RTC Alarm Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RTC_TimeTypeDef nowtimes;
RTC_DateTypeDef nowdatas;
RTC_AlarmTypeDef RTC_AlarmStructure;
RTC_ClearFlag(RTC_FLAG_ALRAF);
RTC_ClearITPendingBit(RTC_IT_ALRA);
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
RTC_GetTime(RTC_Format_BIN,&nowtimes);//获取时间
RTC_GetDate(RTC_Format_BIN,&nowdatas);//获取日期
month_day=mon_table[nowdatas.RTC_Month-1];//获取月的天数
if(nowdatas.RTC_Month==2)
{
if(!Is_Leap_Year(nowdatas.RTC_Year))//闰年
month_day+=1; //二月份天数-1
}
seconds+=nowtimes.RTC_Hours*3600+nowtimes.RTC_Minutes*60+nowtimes.RTC_Seconds+nowdatas.RTC_Date*86400;
if((seconds/86400)>month_day)//判断是否超过本月份的天数
{
month_day=(seconds/86400)-month_day;
RTC_AlarmStructure.RTC_AlarmDateWeekDay = month_day;
}else
RTC_AlarmStructure.RTC_AlarmDateWeekDay = seconds/86400; //日
/* Set the alarmA Masks */
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None; //无屏蔽
/* Set the alarmA time */
RTC_AlarmStructure.RTC_AlarmTime.RTC_H12=RTC_H12_AM; //24H
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours=(seconds%86400)/3600;//时
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes=(seconds%86400)%3600/60;//分
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=(seconds%86400)%3600%60;//秒
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
/* Enable AlarmA interrupt */
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
/* Enable the alarmA */
RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
}
/*
*********************************************************************************************************
* 函 数 名: RTC_AlarmBConfig()
* 功能说明: 闹钟B配置
* 输 入 :年 set_year,月 set_mon,日 set_day,时 set_hour,分 set_min ,秒 set_sec
* 输 出 :无
*********************************************************************************************************
*/
void RTC_AlarmBConfig(int set_year,int set_mon,int set_day,int set_hour,int set_min ,int set_sec)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* EXTI configuration */
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable the RTC Alarm Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RTC_AlarmTypeDef RTC_AlarmStructure;
RTC_ClearFlag(RTC_FLAG_ALRBF);
RTC_ClearITPendingBit(RTC_IT_ALRB);
RTC_AlarmCmd(RTC_Alarm_B, DISABLE);
/* Set the alarmB Masks */
RTC_AlarmStructure.RTC_AlarmDateWeekDay = set_day;//日1-31
RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; //选择日期
RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None; //无屏蔽
/* Set the alarmB time */
RTC_AlarmStructure.RTC_AlarmTime.RTC_H12=RTC_H12_AM; //24H
RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours=set_hour;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes=set_min;
RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=set_sec;
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_B, &RTC_AlarmStructure);
/* Set AlarmA subseconds and enable SubSec Alarm : generate 8 interripts per Second */
// RTC_AlarmSubSecondConfig(RTC_Alarm_A, 0xFF, RTC_AlarmSubSecondMask_SS14_5);
/* Enable AlarmA interrupt */
RTC_ITConfig(RTC_IT_ALRB, ENABLE);
/* Enable the alarmA */
RTC_AlarmCmd(RTC_Alarm_B, ENABLE);
}
/*
*********************************************************************************************************
* 函 数 名: Get_Wkup_MYITstatus()
* 功能说明: 检查设备唤醒源
* 输 入 :无
* 输 出 :唤醒标志 MYITStatus1
*********************************************************************************************************
*/
STB_ITStatus Get_Wkup_MYITstatus(void)
{
if(RTC_GetITStatus(RTC_IT_ALRA))
{
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_ClearITPendingBit(RTC_IT_ALRA);
MYITStatus1.AlarmA_ITStatus=1;
}
if(RTC_GetITStatus(RTC_IT_ALRB))
{
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_ClearITPendingBit(RTC_IT_ALRB);
MYITStatus1.AlarmB_ITStatus=1;
}
if(RTC_GetITStatus(RTC_IT_WUT))
{
EXTI_ClearITPendingBit(EXTI_Line20);
RTC_ClearITPendingBit(RTC_IT_WUT);
MYITStatus1.WUT_ITStatus=1;
}
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13))
{
Check_WKUP_key=Check_WKUP();
if(Check_WKUP_key)
{
MYITStatus1.WKUP1_ITStatus=1;
}
EXTI_ClearITPendingBit(EXTI_Line13);
}
if(MYITStatus1.AlarmA_ITStatus | MYITStatus1.AlarmB_ITStatus | MYITStatus1.WUT_ITStatus | MYITStatus1.WKUP1_ITStatus)
{
if(MYITStatus1.AlarmA_ITStatus)return AlarmA_ITHP;
if(MYITStatus1.AlarmB_ITStatus)return AlarmB_ITHP;
if(MYITStatus1.WUT_ITStatus)return WUT_ITHP;
if(MYITStatus1.WKUP1_ITStatus)return WKUP1_ITHP;
}
else
{
MYITStatus1.WKUP_POWBUTTON=1;//电源上电
return Power_ON;
}
return Power_ON;
}
/*
*********************************************************************************************************
* 函 数 名: RTC_Alarm_IRQHandler()
* 功能说明: 闹钟中断
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void RTC_Alarm_IRQHandler(void)
{
/* Check on the AlarmA falg and on the number of interrupts per Second (60*8) */
if(RTC_GetITStatus(RTC_IT_ALRA) != RESET)
{
/* Clear RTC AlarmA Flags */
RTC_ClearITPendingBit(RTC_IT_ALRA);
MYITStatus1.AlarmA_ITStatus=1;
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
//u5_printf("alarmA hp\r\n");
RTC_AlarmAConfig(get_pubidv());
}
/* Check on the AlarmA falg and on the number of interrupts per Second (60*8) */
if(RTC_GetITStatus(RTC_IT_ALRB) != RESET)
{
/* Clear RTC AlarmB Flags */
RTC_ClearITPendingBit(RTC_IT_ALRB);
RTC_AlarmCmd(RTC_IT_ALRB, DISABLE);
MYITStatus1.AlarmB_ITStatus=1;
IS_FIRST_SAVE = 1;
}
/* Clear the EXTIL line 17 */
EXTI_ClearITPendingBit(EXTI_Line17);
}
/*
*********************************************************************************************************
* 函 数 名: RTC_WKUP_IRQHandler()
* 功能说明: 唤醒中断
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void RTC_WKUP_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
{
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_WakeUpCmd(DISABLE);
EXTI_ClearITPendingBit(EXTI_Line20);
MYITStatus1.WUT_ITStatus=1;
//u5_printf("WUT hp\r\n");
//u5_printf("wut_PROS1_RUN:%d\r\n",TASKRUNSS.PROS1_RUN);
RtcWakeUpConfig(get_meaidv() - 1);
}
}
/*
*********************************************************************************************************
* 函 数 名: Measure_Ap_S()
* 功能说明: 预约模式进行闹钟AB的处理
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void Measure_Ap_S(void)
{
int year,mon,day,hour,min ,sec;
char temp[4];
RTC_AlarmCmd(RTC_Alarm_A, DISABLE);//关闭闹钟A
RTC_WakeUpCmd(DISABLE); //关闭自动唤醒
//配置闹钟B的唤醒时间
memcpy(temp,Init_Data_Equipment.appointment_time,4);
year = atoi(temp);
memset(temp,0,4);
memcpy(temp,&Init_Data_Equipment.appointment_time[4],2);
mon = atoi(temp);
memcpy(temp,&Init_Data_Equipment.appointment_time[6],2);
day = atoi(temp);
memcpy(temp,&Init_Data_Equipment.appointment_time[8],2);
hour = atoi(temp);
memcpy(temp,&Init_Data_Equipment.appointment_time[10],2);
min = atoi(temp);
memcpy(temp,&Init_Data_Equipment.appointment_time[12],2);
sec = atoi(temp);
if(sec == 0)
{
sec = 59;
if(min == 0)
{
min = 59;
hour = hour - 1;
}else min = min - 1;
}else sec = sec - 1;
RTC_AlarmBConfig(year,mon,day,hour,min,sec);
}
/*
*********************************************************************************************************
* 函 数 名: Measure_Ap_E()
* 功能说明: 预约模式设备启动后的处理
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void Measure_Ap_E(void)
{
MYITStatus1.AlarmA_ITStatus = 1;
MYITStatus1.WUT_ITStatus = 1;
RTC_AlarmCmd(RTC_Alarm_B, DISABLE);//关闭闹钟B
}
/*
*********************************************************************************************************
* 函 数 名: EXTI15_10_IRQHandler()
* 功能说明: IO中断
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void EXTI15_10_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line13);
//u5_printf("WAKEUP2 is HP");
}
/*
*********************************************************************************************************
* 函 数 名: Check_WKUP()
* 功能说明: 按键检查
* 输 入 :无
* 输 出 1 按下1S 0不足1S
*********************************************************************************************************
*/
u8 Check_WKUP(void)
{
u8 t=0; //记录按下的时间
while(1)
{
if(WKUP_KD)
{
t++; //已经按下了
delay_ms(30);
if(t>=100) //按下超过1秒钟
{
return 1; //按下1s以上了
}
}else
{
return 0; //按下不足3秒
}
}
}
/*
*********************************************************************************************************
* 函 数 名: Key_Scan()
* 功能说明: 单个按键检测短按和长按事件
* 输 入 :无
* 输 出 KEY_SHORT KEY_LONG 0
*********************************************************************************************************
*/
u8 Key_Scan(void)
{
static KEY_STATE KeyState =KEY_CHECK;
static u8 TimeCnt = 0;
u8 key_return = 0;
switch (KeyState)
{
//按键未按下状态此时判断WKUP_KD的值
case KEY_CHECK:
if(WKUP_KD)
{
KeyState = KEY_COMFIRM; //如果按键WKUP_KD值为1说明按键开始按下进入下一个状态
}
else
{
KeyState = KEY_CHECK;
}
TimeCnt = 0; //计数复位
key_time=TimeCnt;
key_return=0;
break;
case KEY_COMFIRM:
if(WKUP_KD) //查看当前WKUP_KD是否还是1再次确认是否按下
{
TimeCnt++;
key_time=TimeCnt;
if(TimeCnt>=200)
{
TimeCnt=200;
KeyState = KEY_RELEASE;
}
}
else
{
KeyState = KEY_RELEASE; // 返回上一个状态
}
break;
case KEY_RELEASE:
if(!WKUP_KD) //当前WKUP_KD值为0说明按键已经释放返回开始状态
{
KeyState = KEY_CHECK;
if(TimeCnt>10 )
{
key_return = KEY_SHORT;
}
if(TimeCnt>100)
{
key_return = KEY_LONG;
}
//u5_printf("TimeCnt:%d\r\n",TimeCnt);
TimeCnt=0;
}
break;
default: break;
}
return key_return;
}
/***************************** END OF FILE *********************************/