RTC.c 4.75 KB
Newer Older
时昊's avatar
时昊 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174


#include "dr7f701401.dvf.h"
#include "RTC.h"
#include <string.h>


volatile RTC_Information_st_t g_stRTCInformation;
#define RTC_TIME_OUT_COUNT 500U
/* BCD Convert   decimalism*/
/*The valid range of parameters is not judged*/
static uint8_t RTC_BCD_To_Dec(uint8_t u8RTCBCD)
{
	uint8_t u8RTCData = ((u8RTCBCD >> 4U) * 10U) + (u8RTCBCD & 0X0FU);
	return u8RTCData;
}
/* decimalism Convert  BCD */
static uint8_t RTC_Dec_To_BCD(uint8_t u8RTCDec)
{
	uint8_t u8RTCData = (((u8RTCDec / 10U) % 10U) << 4U) + (u8RTCDec % 10U);
	return u8RTCData;
}
static void RTC_Stop(void)
{
	uint16_t u16RTCCount = 0U;
	/*Stop sub-counter */
	RTCA0CE = 0U;
	/*Wait  sub-counter  stop*/
	while ((RTCA0CEST != 0) && (u16RTCCount < RTC_TIME_OUT_COUNT))
	{
		u16RTCCount++;
	}
}

void RTC_Pre_Init(void)
{
	uint16_t u16RTCCount = 0U;
	RTC_Stop(); /* Stop RTCA*/

#if (RTC_MODE_SELECT == RTC_MODE_MAIN)
	RTCA0SLSB = 1U;			   /*Frequency selection mode*/
	RTCA0SCMP = 4000277U - 1U; /*4M*/
	/*4000000:1小时快0.5s*/
	/*4000543:1小时慢0.333秒*/
	//543*0.5/0.8333= 325   4000325:17小时慢2s  1小时慢0.1176秒
	//4000276 是按1小时慢0.0001算的 但是给4000277
#else
	RTCA0SLSB = 0U; /*32.768 kHz mode*/
	RTCA0SUBU = 0U; /*Reserved Later modified,Error Correction*/
#endif

	RTCA0AMPM = 1U; /*fix 24Hour Format*/

	/*Write start values*/
	RTCA0YEAR = RTC_Dec_To_BCD(RTC_DEFAULT_YEAR);
	RTCA0MONTH = RTC_Dec_To_BCD(RTC_DEFAULT_MONTH);
	RTCA0DAY = RTC_Dec_To_BCD(RTC_DEFAULT_DATE);
	RTCA0HOUR = RTC_Dec_To_BCD(RTC_DEFAULT_HOUR);
	RTCA0MIN = RTC_Dec_To_BCD(RTC_DEFAULT_MINUTE);
	RTCA0SEC = RTC_Dec_To_BCD(RTC_DEFAULT_SECOND);

	/*Starts sub-counter*/
	RTCA0CE = 1U;
	u16RTCCount = 0U;
	/*Wait  sub-counter  enable*/
	while ((RTCA0CEST != 1U) && (u16RTCCount < RTC_TIME_OUT_COUNT))
	{
		u16RTCCount++;
	}
}

void RTC_Set_Time(RTC_Information_st_t *pstRTCTime)
{
	uint16_t u16RTCCount = 0U;
	while ((RTCA0WST != 0U) && (u16RTCCount < RTC_TIME_OUT_COUNT)) /*Check that all clock counters are running.*/
	{
		u16RTCCount++;
	}
	RTCA0WAIT = 1U; /*Stop all clock counters*/
	u16RTCCount = 0U;
	while ((RTCA0WST != 1U) && (u16RTCCount < RTC_TIME_OUT_COUNT)) /*Wait  all clock counters  stop*/
	{
		u16RTCCount++;
	}
	/*Write start values*/
	RTCA0YEAR = RTC_Dec_To_BCD(pstRTCTime->u8RTCYear);
	RTCA0MONTH = RTC_Dec_To_BCD(pstRTCTime->u8RTCMonth);
	RTCA0DAY = RTC_Dec_To_BCD(pstRTCTime->u8RTCDayOfMonth);
	RTCA0HOUR = RTC_Dec_To_BCD(pstRTCTime->u8RTCHour);
	RTCA0MIN = RTC_Dec_To_BCD(pstRTCTime->u8RTCMinute);
	RTCA0SEC = RTC_Dec_To_BCD(pstRTCTime->u8RTCSecond);

	/*Start all clock counters*/
	RTCA0WAIT = 0U;
	u16RTCCount = 0U;
	while ((RTCA0WST != 0U) && (u16RTCCount < RTC_TIME_OUT_COUNT)) /*Check that all clock counters are running.*/
	{
		u16RTCCount++;
	}
}

void RTC_Get_Time(void)
{
	uint16_t u16RTCCount = 0U;

	while ((RTCA0WST != 0U) && (u16RTCCount < RTC_TIME_OUT_COUNT)) /*Check that all clock counters are running.*/
	{
		u16RTCCount++;
	}
	RTCA0WAIT = 1U; /*Stop all clock counters*/
	u16RTCCount = 0U;
	while ((RTCA0WST != 1U) && (u16RTCCount < RTC_TIME_OUT_COUNT)) /*Wait  all clock counters  stop*/
	{
		u16RTCCount++;
	}
	/*Read  data*/
	g_stRTCInformation.u8RTCYear = RTC_BCD_To_Dec(RTCA0YEAR);
	g_stRTCInformation.u8RTCMonth = RTC_BCD_To_Dec(RTCA0MONTH);
	g_stRTCInformation.u8RTCDayOfMonth = RTC_BCD_To_Dec(RTCA0DAY);
	g_stRTCInformation.u8RTCHour = RTC_BCD_To_Dec(RTCA0HOUR);
	g_stRTCInformation.u8RTCMinute = RTC_BCD_To_Dec(RTCA0MIN);
	g_stRTCInformation.u8RTCSecond = RTC_BCD_To_Dec(RTCA0SEC);
	/*Start all clock counters*/
	RTCA0WAIT = 0U;
	u16RTCCount = 0U;
	while ((RTCA0WST != 0U) && (u16RTCCount < RTC_TIME_OUT_COUNT)) /*Check that all clock counters are running.*/
	{
		u16RTCCount++;
	}
}

#pragma ghs section bss=".NonInitArea"
RTC_Information_st_t RtcBackup;
uint32_t BackupNum;
#pragma ghs section bss=default
void RTC_Backup_Time(void)
{
    BackupNum++;
    RTC_Get_Time();
    memcpy((uint8_t*)&RtcBackup, (uint8_t*)&g_stRTCInformation, sizeof (RtcBackup));
}

void Rtc_Restore_Time(void)
{
    uint16_t u16RTCCount = 0U;
	RTC_Stop(); /* Stop RTCA*/

#if (RTC_MODE_SELECT == RTC_MODE_MAIN)
	RTCA0SLSB = 1U;			   /*Frequency selection mode*/
	RTCA0SCMP = 4000000U - 1U; /*4M*/
#else
	RTCA0SLSB = 0U; /*32.768 kHz mode*/
	RTCA0SUBU = 0U; /*Reserved Later modified,Error Correction*/
#endif

	RTCA0AMPM = 1U; /*fix 24Hour Format*/

	/*Write start values*/
	RTCA0YEAR = RTC_Dec_To_BCD(RtcBackup.u8RTCYear);
	RTCA0MONTH = RTC_Dec_To_BCD(RtcBackup.u8RTCMonth);
	RTCA0DAY = RTC_Dec_To_BCD(RtcBackup.u8RTCDayOfMonth);
	RTCA0HOUR = RTC_Dec_To_BCD(RtcBackup.u8RTCHour);
	RTCA0MIN = RTC_Dec_To_BCD(RtcBackup.u8RTCMinute);
	RTCA0SEC = RTC_Dec_To_BCD(RtcBackup.u8RTCSecond);

	/*Starts sub-counter*/
	RTCA0CE = 1U;
	u16RTCCount = 0U;
	/*Wait  sub-counter  enable*/
	while ((RTCA0CEST != 1U) && (u16RTCCount < RTC_TIME_OUT_COUNT))
	{
		u16RTCCount++;
	}
}