stm32_ota/RTC/rtc.c

412 lines
15 KiB
C
Raw Permalink Normal View History

2023-12-15 06:28:06 +00:00
#include "rtc.h"
#include <stdlib.h>
#include <string.h>
#include "stm32f10x_pwr.h"
#include "stm32f10x_bkp.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_exti.h"
/*********Ӧ<>ò<EFBFBD><C3B2>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>**************/
#include "systick.h"
#include "userport.h"
/*****************************************/
Calendar_u uCalendar ;
uint8_t const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD>
const uint8_t mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ڱ<EFBFBD>
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> static void RTC_NVIC_Config(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RTCʱ<EFBFBD><EFBFBD><EFBFBD>жϺ<EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
static void RTC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure ;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn ; //RTC<54>ж<EFBFBD>
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = RTC_IRQn_PreemptionPriority ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD>
NVIC_InitStructure.NVIC_IRQChannelSubPriority = RTC_IRQn_SubPriority ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ; //ʹ<>ܸ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ж<EFBFBD>
NVIC_Init(&NVIC_InitStructure); //<2F><><EFBFBD><EFBFBD>NVIC_InitStruct<63><74>ָ<EFBFBD><D6B8><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NVIC<49>Ĵ<EFBFBD><C4B4><EFBFBD>
// NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn ; //RTCAlarm<72>ж<EFBFBD>
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = RTCAlarm_IRQn_PreemptionPriority ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD>
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = RTCAlarm_IRQn_SubPriority ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ʹ<><CAB9><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>ͨ<EFBFBD><CDA8>
// NVIC_Init(&NVIC_InitStructure); //<2F><><EFBFBD><EFBFBD>NVIC_InitStruct<63><74>ָ<EFBFBD><D6B8><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NVIC<49>Ĵ<EFBFBD><C4B4><EFBFBD>
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult RTC_Init(void)
* <EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD> ErrorLogPrintf
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RunResult: <EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>LSEʧЧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LSI<EFBFBD><EFBFBD>ΪRTCʱ<EFBFBD>ӣ<EFBFBD>LSIƵ<EFBFBD><EFBFBD>Ư<EFBFBD>ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
RunResult RTC_Init(void)
{
u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //ʹ<><CAB9>PWR<57><52>BKP<4B><50><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
PWR_BackupAccessCmd(ENABLE); //ʹ<>ܺ󱸼Ĵ<F3B1B8BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //<2F><>ָ<EFBFBD><D6B8><EFBFBD>ĺ󱸼Ĵ<F3B1B8BC><C4B4><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>
{
BKP_DeInit(); //<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RCC_LSEConfig(RCC_LSE_ON); //<2F><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD>پ<EFBFBD><D9BE><EFBFBD>(LSE),ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>پ<EFBFBD><D9BE><EFBFBD>
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250) //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>RCC<43><43>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>پ<EFBFBD><D9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp++;
Delay_Ms(10);
}
if(temp>=250)return RunErr;//<2F><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>ʧ<EFBFBD><CAA7>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //<2F><><EFBFBD><EFBFBD>RTCʱ<43><CAB1>(RTCCLK),ѡ<><D1A1>LSE<53><45>ΪRTCʱ<43><CAB1>
RCC_RTCCLKCmd(ENABLE); //ʹ<><CAB9>RTCʱ<43><CAB1>
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_WaitForSynchro(); //<2F>ȴ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>ͬ<EFBFBD><CDAC>
RTC_ITConfig(RTC_IT_SEC, ENABLE); //ʹ<><CAB9>RTC<54><43><EFBFBD>ж<EFBFBD>
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_EnterConfigMode();/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_SetPrescaler(32767); //<2F><><EFBFBD><EFBFBD>RTCԤ<43><D4A4>Ƶ<EFBFBD><C6B5>ֵ
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Calendar_u uCalendar2 ;
memcpy(uCalendar2.bytes, (const u8*)"2017-09-21 14:40:00", 19) ;
RTC_Set(&uCalendar2) ;
RTC_ExitConfigMode(); //<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ģʽ
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //<2F><>ָ<EFBFBD><D6B8><EFBFBD>ĺ󱸼Ĵ<F3B1B8BC><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else//ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
{
RTC_WaitForSynchro(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_ITConfig(RTC_IT_SEC, ENABLE); //ʹ<><CAB9>RTC<54><43><EFBFBD>ж<EFBFBD>
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
RTC_NVIC_Config();//RCT<43>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTC_Get();//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
return RunOK; //ok
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void RTC_IRQHandler(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RTCʱ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ÿ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
*************************************************************************************************/
void RTC_IRQHandler(void)
{
if ( RTC_GetITStatus(RTC_IT_SEC) != RESET )//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
{
RTC_ClearITPendingBit(RTC_IT_SEC); //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
RTC_Get(&uCalendar); //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
}
if( RTC_GetITStatus(RTC_IT_ALR)!= RESET ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
{
RTC_ClearITPendingBit(RTC_IT_ALR); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
EXTI_ClearITPendingBit(EXTI_Line17);
}
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW|RTC_IT_SEC); //<2F><><EFBFBD>ж<EFBFBD>
RTC_WaitForLastTask() ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void RTCAlarm_IRQHandler(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC->ALRֵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϡ<EFBFBD> ע<EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EXTI_Line17<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵģ<EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ
*************************************************************************************************/
//void RTCAlarm_IRQHandler(void)
//{
// if( RTC_GetITStatus(RTC_IT_ALR)!= RESET ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// {
// EXTI_ClearITPendingBit(EXTI_Line17);
// RTC_ClearITPendingBit(RTC_IT_ALR); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// printf("\r\n*<2A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>" ) ;
// }
///* Clear the EXTIL line 17 */
//}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> uint8_t CheckLeepYear(uint16_t year)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>year<EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param uint16_t year<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param uint8_t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@arg 1: yearΪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @arg 0: yearΪƽ<EFBFBD><EFBFBD>
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>·<EFBFBD> 1 2 3 4 5 6 7 8 9 10 11 12
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 31 29 31 30 31 30 31 31 30 31 30 31
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 31 28 31 30 31 30 31 31 30 31 30 31
*************************************************************************************************/
uint8_t CheckLeepYear(uint16_t year)
{
if( year%4 == 0 ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD>
{
if( year%100 == 0 )
{
if( year%400 == 0 )
return 1 ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>00<30><30>β,<2C><>Ҫ<EFBFBD>ܱ<EFBFBD>400<30><30><EFBFBD><EFBFBD>
else
return 0 ;
}
else
return 1 ;
}
else
return 0 ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> uint8_t RTC_Set(Calendar_u *setCalendar)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param *setCalendar<EFBFBD><EFBFBD>Calendar_u<EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param uint8_t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD>ɹ<EFBFBD>;<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
RunResult RTC_Set(Calendar_u *setCalendar) //
{
uint16_t t ;
u32 seccount = 0 ; //<2F>洢setCalendar<61><72><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC>RTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t syear = (setCalendar->bytes[0]-'0')*1000+(setCalendar->bytes[1]-'0')*100+(setCalendar->bytes[2]-'0')*10+(setCalendar->bytes[3]-'0') ;
uint8_t smon = (setCalendar->bytes[5]-'0')*10 +(setCalendar->bytes[6]-'0') ;
uint8_t sday = (setCalendar->bytes[8]-'0')*10 +(setCalendar->bytes[9]-'0') ;
uint8_t hour = (setCalendar->bytes[11]-'0')*10 +(setCalendar->bytes[12]-'0') ;
uint8_t min = (setCalendar->bytes[14]-'0')*10 +(setCalendar->bytes[15]-'0') ;
uint8_t sec = (setCalendar->bytes[17]-'0')*10 +(setCalendar->bytes[18]-'0');
if( syear<1970 || syear>2099 )
return (RunErr);
for( t = 1970; t < syear; t++ ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(CheckLeepYear(t))
seccount += 31622400; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
seccount += 31536000; //ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
smon -= 1;
for( t=0; t<smon; t++ ) //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>·ݵ<C2B7><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
seccount += (u32)mon_table[t]*86400; //<2F>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(CheckLeepYear(syear)&&t==1)
seccount += 86400; //<2F><><EFBFBD><EFBFBD>2<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
seccount += (u32)(sday-1)*86400 ; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
seccount += (u32)hour*3600 ; //Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
seccount += (u32)min*60 ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
seccount += sec ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD>ȥ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //ʹ<><CAB9>PWR<57><52>BKP<4B><50><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
PWR_BackupAccessCmd(ENABLE); //ʹ<><CAB9>RTC<54>ͺ󱸼Ĵ<F3B1B8BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_SetCounter(seccount); //<2F><><EFBFBD><EFBFBD>RTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return (RunOK) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> uint8_t RTC_Alarm_Set(uint16_t syear,uint8_t smon,uint8_t sday,uint8_t hour,uint8_t min,uint8_t sec)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 syear: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param2 smon: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>
* @param3 sday: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param4 hour: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сʱ
* @param5 min: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>
* @param6 sec: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param RunResult<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>.
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1970~2099<EFBFBD><EFBFBD>Ϊ<EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
RunResult RTC_Alarm_Set(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min,uint8_t sec)
{
uint16_t t ;
u32 seccount = 0 ;
if( syear<1970 || syear>2099 )
return (RunErr) ;
for( t=1970; t<syear; t++ ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(CheckLeepYear(t))
seccount += 31622400 ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
seccount += 31536000 ; //ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
smon -= 1;
for( t=0; t<smon; t++ ) //<2F><>ǰ<EFBFBD><C7B0><EFBFBD>·ݵ<C2B7><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
seccount += (u32)mon_table[t]*86400 ; //<2F>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(CheckLeepYear(syear)&& (t==1) )
seccount += 86400 ; //<2F><><EFBFBD><EFBFBD>2<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
seccount += (u32)(sday-1)*86400 ; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
seccount += (u32)hour*3600 ; //Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
seccount += (u32)min*60; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
seccount += sec; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD>ȥ
// RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE ) ; //ʹ<><CAB9>PWR<57><52>BKP<4B><50><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
PWR_BackupAccessCmd( ENABLE ) ; //ʹ<>ܺ󱸼Ĵ<F3B1B8BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_EnterConfigMode() ; //RTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CNT\ALR\PRL
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_SetAlarm(seccount);
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RTC_ExitConfigMode(); //RTC<54>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD> CNT\ALR\PRL
RTC_WaitForLastTask(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PWR_BackupAccessCmd(DISABLE); //<2F><>ֹ<EFBFBD>󱸼Ĵ<F3B1B8BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return (RunOK);
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult RTC_Get(Calendar_u *getCalendar)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *getCalendar: ָ<EFBFBD><EFBFBD>Calendar_u<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param RunResult<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>.
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> RTC_Get(&uCalendar) ;
*************************************************************************************************/
RunResult RTC_Get(Calendar_u *getCalendar)
{
static uint16_t daycnt = 0 ; //static<69><63><EFBFBD><EFBFBD> <20><>ֻ֤<D6A4>иı<D0B8><C4B1><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 timecount = 0 ;
u32 temp = 0 ;
uint16_t temp1 = 0 ;
vu8 hour;
vu8 min;
vu8 sec;
vu16 w_year;
vu8 w_month;
vu8 w_date;
vu8 week;
RTC_WaitForSynchro() ; //RTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ȴ<EFBFBD>
timecount = RTC_GetCounter() ;
temp = timecount/86400 ; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>)
if( daycnt != temp ) //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>˲Ż<CBB2>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
daycnt = temp;
temp1 = 1970; //<2F><>1970<37>ʼ
while( temp >= 365 )
{
if( CheckLeepYear(temp1) ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if( temp >= 366 )
temp -= 366 ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
{
temp1++ ;
break ;
}
}
else
temp -= 365 ; //ƽ<><C6BD>
temp1++ ;
}
w_year = temp1 ; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
getCalendar->calendar.w_year[0] = w_year/1000+'0' ;
getCalendar->calendar.w_year[1] = (w_year%1000)/100+'0' ;
getCalendar->calendar.w_year[2] = ((w_year%1000)%100)/10 + '0' ;
getCalendar->calendar.w_year[3] = w_year%10 + '0' ;
temp1 = 0 ;
while( temp >= 28 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
{
if( CheckLeepYear(w_year)&&temp1==1 )//<2F><><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/2<>·<EFBFBD>
{
if( temp >= 29 )
temp -= 29 ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
break ;
}
else
{
if( temp >= mon_table[temp1] )
temp -= mon_table[temp1] ;//ƽ<><C6BD>
else
break ;
}
temp1++ ;
}
w_month = temp1+1 ; //<2F>õ<EFBFBD><C3B5>·<EFBFBD>
w_date = temp+1 ; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
getCalendar->calendar.w_month[0] = w_month/10+'0' ;
getCalendar->calendar.w_month[1] = w_month%10+'0' ;
getCalendar->calendar.w_date[0] = w_date/10+'0' ;
getCalendar->calendar.w_date[1] = w_date%10+'0' ;
}
temp = timecount%86400 ; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hour = temp/3600 ; //Сʱ
min = (temp%3600)/60 ; //<2F><><EFBFBD><EFBFBD>
sec = (temp%3600)%60 ; //<2F><><EFBFBD><EFBFBD>
getCalendar->calendar.hour[0] = hour/10+'0' ;
getCalendar->calendar.hour[1] = hour%10+'0' ;
getCalendar->calendar.min[0] = min/10+'0' ;
getCalendar->calendar.min[1] = min%10+'0' ;
getCalendar->calendar.sec[0] = sec/10+'0' ;
getCalendar->calendar.sec[1] = sec%10+'0' ;
// if(( hour == 0x15 )&& ( min == 0x00 )&&( sec == 0x00) ) //<2F>賿21:00:00<30><EFBFBD><E8B6A8><EFBFBD><EFBFBD>
// {
// appConfigUnion.appFlashStruct.VolumeRank = 0x34 ;
// RTC_WaitForLastTask();
// randCount = rand()%1000+rand()%100+rand()%10 ;
// timecount = timecount+4*3600+randCount ;
// RTC_SetAlarm(timecount) ; //<2F><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD>ֵ
// RTC_ITConfig( RTC_IT_ALR, ENABLE ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// }
// if(( hour == 0x07 )&& ( min == 0x00 )&&( sec == 0x00) ) //<2F><><EFBFBD><EFBFBD>07:00:00<30>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>
// {
// Read_From_Flash(APP_FLASH_CONFIG_ADDR, appConfigUnion.appFlashBuffer, APPFLASHCONFIGLEN ) ; //<2F>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
// if( !IS_VolumeRank_ALL_PERIPH(appConfigUnion.appFlashStruct.VolumeRank)) //<2F><><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>Ļ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ7<CEAA><37>
// {
// appConfigUnion.appFlashStruct.VolumeRank = 0x37 ;
// Save_to_Flash(APP_FLASH_CONFIG_ADDR, appConfigUnion.appFlashBuffer, APPFLASHCONFIGLEN ) ;
// }
// }
week = RTC_Get_Week( w_year,w_month,w_date ) ;//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
return (RunOK) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> Ruint8_t RTC_Get_Week(uint16_t year, uint8_t month, uint8_t day)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 year: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param2 mon: <EFBFBD>·<EFBFBD>
* @param3 day: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 uint8_t: <EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>
* @param RunResult<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>.
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵõ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1901-2099<EFBFBD><EFBFBD>)
*************************************************************************************************/
uint8_t RTC_Get_Week(uint16_t year, uint8_t month, uint8_t day)
{
uint16_t temp2 ;
uint8_t yearH, yearL ;
yearH = year/100 ;
yearL = year%100 ;
if ( yearH>19 ) // <20><><EFBFBD><EFBFBD>Ϊ21<32><31><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100
yearL+=100;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>1900<30><30>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>
temp2 = yearL+yearL/4 ;
temp2 = temp2%7 ;
temp2 = temp2+day+table_week[month-1] ;
if ( yearL%4==0&&month<3 )
temp2--;
return(temp2%7) ;
}