📄 rtcdrv.c
字号:
//=========================================================// The module is used to drive RTC. //=========================================================#include "winav.h"#include "ctkav.h"#include "comdef.h"#include "hal.h"#include "comutl.h"#include "RTCdrv.h"/*************************************************************************** CONFIGURATION**************************************************************************///#define EMU_RTC //Enable RTC Emulator, DO NOT continue going after turning off system power#define TIMER2#define ONEDIODE //Set One Diode for RTC Charging#define DEFAULT_SEC 0#define DEFAULT_MIN 0#define DEFAULT_HR 0#define DEFAULT_DATE 1 #define DEFAULT_MON 1 //Jan#define DEFAULT_DAY 1 //Monday#define DEFAULT_YEAR 6 //2006/* * RELOAD_VALUE_PON = 990671 * 1/(132750000/2) *67 * RELOAD_VALUE_PON = 1 sec * */#if defined(CT909P_IC_SYSTEM)||defined(CT909G_IC_SYSTEM)#if (CPU_SPEED == CPU_133M) //132.75MHz#define RELOAD_VALUE_PON 990671#define RELOAD_VALUE_POFF 964285#define CNT_RATIO_OFF_ON 1027#define CNT_RATIO_ON_OFF 973#endif#if (CPU_SPEED == CPU_146M) //146NHz#define RELOAD_VALUE_PON 999999#define RELOAD_VALUE_POFF 964285#define CNT_RATIO_OFF_ON 1037#define CNT_RATIO_ON_OFF 964#endif#endif#if defined(CT909R_IC_SYSTEM)#if (CPU_SPEED == CPU_133M) //133NHz#define RELOAD_VALUE_PON 992536#define RELOAD_VALUE_POFF 964285#define CNT_RATIO_OFF_ON 1029#define CNT_RATIO_ON_OFF 971#endif#if (CPU_SPEED == CPU_146M) //146NHz#define RELOAD_VALUE_PON 999999#define RELOAD_VALUE_POFF 964285#define CNT_RATIO_OFF_ON 1037#define CNT_RATIO_ON_OFF 964#endif#endif/**************************************************************************/#ifdef EMU_RTCULONGLONG __u64LastTick; //Recorded the elapsed time in ticks;RTC_TM __RTCEmu_TM;BYTE _bChkSleepLeakTimeStart;ULONGLONG __u64SystemTick2 = 0;#endif#ifndef EMU_RTC/**************************************************************************Function : RTC_InputByteAbstract : Input one byte to RTCArguments : Input valueReturn : none.Side Effect : none.Notes :***************************************************************************/void RTC_InputByte ( BYTE bValue ){ BYTE bIndex; for ( bIndex = 0; bIndex < 8; bIndex++ ) { HAL_WriteGPIO(GRP_RTCSDA, PIN_RTCSDA, 0); if ( bValue & 0x01 ) { HAL_WriteGPIO(GRP_RTCSDA, PIN_RTCSDA, 1); } HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); bValue = bValue >> 1; }}/**************************************************************************Function : RTC_OutputByteAbstract : Get one byte from RTCArguments : none.Return : one byte from RTC.Side Effect : none.Notes :***************************************************************************/BYTE RTC_OutputByte ( void ){ BYTE bIndex; BYTE bResult; bResult = 0; for ( bIndex = 0; bIndex < 8; bIndex++ ) { bResult >>= 1; if ( HAL_ReadGPIO(GRP_RTCSDA, PIN_RTCSDA) ) { bResult |= 0x80; } HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); } return bResult;}/**************************************************************************Function : RTC_W1302Abstract : write one byte to the addr of 1302 RTCArguments : bAddr : write register, bData : write valueReturn : none.Side Effect : none.Notes :***************************************************************************/void RTC_W1302 ( BYTE bAddr, BYTE bData ){ HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 1); RTC_InputByte ( bAddr ); RTC_InputByte ( bData ); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); }/**************************************************************************Function : RTC_W1302Abstract : Read one byte from the addr of 1302 RTCArguments : bAddr : write registerReturn : The read result.Side Effect : none.Notes :***************************************************************************/BYTE RTC_R1302 ( BYTE bAddr ){ BYTE bResult; HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 1); RTC_InputByte ( bAddr ); bResult = RTC_OutputByte ( ); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); return bResult;}/**************************************************************************Function : RTC_BurstW1302TAbstract : Consecutively write first eight clock/calendar registersArguments : BYTE *bWClock : 7Byte clock data + 1Byte controlReturn : none.Side Effect : none.Notes :***************************************************************************/void RTC_BurstW1302T(BYTE *bWClock){ BYTE bIndex; //Disable write protection RTC_W1302 ( RTC1302_CTRL_REG, 0x00 ); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 1); //Write clock burst address RTC_InputByte ( RTC1302_CLOCKBURST_REG ); //8Byte = 7Byte clock data + 1Byte control for ( bIndex = 8; bIndex > 0; bIndex--) { RTC_InputByte( *bWClock ); bWClock++; } HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); } /**************************************************************************Function : RTC_BurstR1302TAbstract : Consecutively read first eight clock/calendar registersArguments : Return : BYTE *bWClock : 7Byte clock data + 1Byte controlSide Effect : none.Notes :***************************************************************************/void RTC_BurstR1302T(BYTE *bWClock){ BYTE bIndex; HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 1); //Write clock burst address RTC_InputByte ( (RTC1302_CLOCKBURST_REG | RTC_READ_MODE) ); //8Byte = 7Byte clock data + 1Byte control for ( bIndex = 8; bIndex > 0; bIndex--) { *bWClock = RTC_OutputByte( ); bWClock++; } HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); } void RTC_BurstW1302R(BYTE *bWReg){ BYTE bIndex; //Disable write protection RTC_W1302 ( RTC1302_CTRL_REG, 0x00 ); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 1); RTC_InputByte ( RTC1302_RAMBURST_REG ); for ( bIndex = 31; bIndex > 0; bIndex--) { RTC_InputByte(*bWReg); bWReg++; } HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); } void RTC_BurstR1302R ( BYTE *bRReg ){ BYTE bIndex; HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 0); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 1); RTC_InputByte( RTC1302_RAMBURST_REG | RTC_READ_MODE ); for ( bIndex = 31; bIndex > 0; bIndex--) { *bRReg = RTC_OutputByte ( ); bRReg++; } HAL_WriteGPIO(GRP_RTCCLK, PIN_RTCCLK, 1); HAL_WriteGPIO(GRP_RTCRST, PIN_RTCRST, 0); }void RTC_SetCharge ( void ){ RTC_W1302 ( RTC1302_CTRL_REG, 0x00 ); #ifdef ONEDIODE RTC_W1302 ( RTC1302_TC_REG, 0xA5 ); // one diode#else RTC_W1302 ( RTC1302_TC_REG, 0xA9 ); //Two diode only charge to 1.9V#endif RTC_W1302 ( RTC1302_CTRL_REG, 0x80 ); }#endif/**************************************************************************Function : RTC_SetTimeAbstract : Set system time as 20YY/MM/DD/HH/MM/SSArguments : pointer of Time structReturn : Side Effect : none.Notes :***************************************************************************/void RTC_SetTime ( PRTC_TM pRTC_TM) {#ifdef EMU_RTC DWORD dwSaveInt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -