⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 3 页
字号:
/***********************************************Copyright (c)*********************************************
**                                Guangzou ZLG-MCU Development Co.,LTD.
**                                     
**                                       http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			    Rtc.c
** Last modified Date:      2007-11-06
** Last Version:		    1.0
** Descriptions:		    RTC驱动程序源程序,原始版本
**
**--------------------------------------------------------------------------------------------------------
** Created by:			    LiXiaoCheng
** Created date:		    2007-11-06
** Version:				    1.0
** Descriptions:		    原始版本,对功率控制和掉电唤醒使用寄存器设置方式设置。
**
**--------------------------------------------------------------------------------------------------------
** Modified by:			    
** Modified Date:		    
** Version:				    
** Descriptions:		    
**
*********************************************************************************************************/
#include "Config.h"
#include "RtcPrivate.h"
#include "Rtc.h"

/*********************************************************************************************************
   定义一个RTC信息结构体
*********************************************************************************************************/
      __RTC_INFO        GrtiData;

/*********************************************************************************************************
   定义一个RTC信息结构体指针表
*********************************************************************************************************/
const __PRTC_INFO       GrtiDataTab[__RTC_MAX_NUM] = {&GrtiData};

/*********************************************************************************************************
   定义一个RTC寄存器基地址表
*********************************************************************************************************/
const uint32            GuiRtcBaseAddrTab[__RTC_MAX_NUM] = {RTC_BASE_ADDR};

/*********************************************************************************************************
   闰年月表,私有全局变量
*********************************************************************************************************/
const uint8 __ucWeekTab[] = {
    					     (3 << 5) + 31,                             /*  1月                         */
    					     (6 << 5) + 29,                             /*  2月                         */
    					     (0 << 5) + 31,                             /*  3月                         */
    					     (3 << 5) + 30,                             /*  4月                         */
    					     (5 << 5) + 31,                             /*  5月                         */
    					     (1 << 5) + 30,                             /*  6月                         */
    					     (3 << 5) + 31,                             /*  7月                         */
    					     (6 << 5) + 31,                             /*  8月                         */
    					     (1 << 5) + 30,                             /*  9月                         */
    					     (4 << 5) + 31,                             /*  10月                        */
    					     (0 << 5) + 30,                             /*  11月                        */
    					     (2 << 5) + 31                              /*  12月                        */
						    };
						    
/*********************************************************************************************************
** Function name:           __rtcDlyS
** Descriptions:            rtc内部使用的小的延时函数,为了测试RTC是否在延时前后是否运行。
** Input parameters:        uiArgDly   输入值越大,延时越久
** Output parameters:       NONE
** Returned value:          NONE
*********************************************************************************************************/
static void __rtcDlyS (uint32 uiArgDly)
{
	uint32 i;
	
	for ( ; uiArgDly>0; uiArgDly--) {
	    for (i=0; i<100; i++);
	}
}

/*********************************************************************************************************
** Function name:           __weekDayGet
** Descriptions:            根据年月日获得星期值的算法。
** Input parameters:        uiArgYear   输入的年值0-9999
**                          ucArgMon    输入的月值1-12
**                          ucArgDay    输入的日期值1-31
** Output parameters:       NONE
** Returned value:          星期值 0-6(0表示星期天)
*********************************************************************************************************/
static uint8 __weekDayGet( uint32 uiArgYear, 
                           uint8  ucArgMon, 
                           uint8  ucArgDay ) 
{
	uint8 ucHYear;
	uint8 ucLYear;
	uint8 ucweek;
	uint8 ucday;
	
	ucHYear = (uint8)(uiArgYear/100);
	ucLYear = (uint8)(uiArgYear%100);
	

	ucHYear &= 0x03;							                        /*  百年%4                     */
	ucHYear  = (uint8)(ucHYear | (ucHYear << 2));						/*  百年%4*5                   */
	ucday    = __ucWeekTab[ucArgMon - 1];				                /*  月表                       */
	ucweek   = (uint8)(ucday >> 5);						                /*  月星期数                   */
	ucday   &= 0x1f;							                        /*  月天数                     */
	
	                                                                    /*  平年                       */
	if ((ucArgMon < 3) && !((ucHYear == 0) | (ucLYear & ((ucLYear & 0x03) == 0)))) 		
	{
		if (ucArgMon == 2) {
		    ucday--;				                                    /*  平年月天数                 */
		}
		ucweek++;							                            /*  平年月表+1                 */
	}
	
	ucLYear = (uint8)(ucLYear + (ucLYear >> 2));						/*  年+年/4                    */
	ucweek  = (uint8)((ucweek + ucHYear + ucLYear + ucArgDay + 2) % 7);	/*  (星期=百年%4*5+年+年/4+月表*/
	                                                                    /*  +日+2)%7                   */
	
	return ucweek;							                            /*  返回星期                   */
}

/*********************************************************************************************************
** Function name:           __rtcInit
** Descriptions:            RTC初始化函数,2200系列没有RTC外部振荡器,该函数是为了兼容其他有外部振荡器的
**                          芯片
** Input parameters:        uiArgID        器件编号,默认为0
**                          uiArgWakeup    0表示不启动RTC中断唤醒,1表示启动RTC中断唤醒
**                          uiArgOutclk    1表示使用外部电源和晶振,0表示使用内部
** Output parameters:       NONE
** Returned value:          返回1表示RTC已经为设置为外部晶振,返回0说明RTC使用内部晶振
*********************************************************************************************************/
static int32 __rtcInit (uint32 uiArgID,                                
                        uint32 uiArgWakeup, 
                        uint32 uiArgOutclk)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
	         uint32        uitemp;
			 uint32        uictc;
			 int32         iResult;
	
	
	/*
	 *  参数过滤 
	 */
	if (uiArgWakeup > 1) {
	    uiArgWakeup = 0;
	}
	if (uiArgOutclk > 1) {
	    uiArgOutclk = 0;
	}
	if (uiArgID >= __RTC_MAX_NUM) {
	    return OPERATE_FAIL;
	}	
	
	GrtiDataTab[uiArgID]->puiAddrBase = (uint32*)GuiRtcBaseAddrTab[uiArgID];
	                                                                    /*  初始化设备结构体基地址      */
	                                                                    
	GrtiDataTab[uiArgID]->uiOffBase   = 0;                              /*  初始化设备结构体偏移量      */
	GrtiDataTab[uiArgID]->ucClkStat   = (uint8)uiArgOutclk;             /*  初始化设备结构体CLK连接状态 */
	
	puiBaseAddr                       =	GrtiDataTab[uiArgID]->puiAddrBase;
	uiOffBase                         = GrtiDataTab[uiArgID]->uiOffBase;
				
	if (uiArgWakeup == __RTC_INT_WAKE) {
		INTWAKE |= 1<<15;					                            /*  支持RTC中断唤醒CPU功能      */
	}
	
	puiBaseAddr[__B_RTC_ILR << uiOffBase] = 0x03;                       /*  清除残留中断标志            */
	iResult                               = __RTC_RUN;                  /*  预设RTC初始化运行了         */
	uictc = puiBaseAddr[__B_RTC_CTC << uiOffBase];                      /*  获取时钟节拍寄存器值        */
	__rtcDlyS(5);
	
	if (uictc == puiBaseAddr[__B_RTC_CTC << uiOffBase] ||               /*  如果时钟不在运行就初始化    */
	    (uiArgOutclk == __RTC_IN_CLK)) {
	    
		PCONP |= (1<<9);                                                /*  在功率管理中打开RTC         */
		puiBaseAddr[__B_RTC_AMR << uiOffBase]  = 0xFF;                  /*  屏蔽所有报警寄存器          */
		puiBaseAddr[__B_RTC_CIIR << uiOffBase] = 0x00;                  /*  关闭所有增量中断            */
		puiBaseAddr[__B_RTC_CCR << uiOffBase]  = 0;
		
		if ( uiArgOutclk != __RTC_IN_CLK ) {
			puiBaseAddr[__B_RTC_CCR << uiOffBase] = (1 << 4);           /*  选择外部时钟                */
		} else {                                                        /*  内部时钟就需要设置分频器    */
			uitemp = (uint32)((int)(Fpclk / 32768) - 1);
			puiBaseAddr[__B_RTC_PREINT << uiOffBase] = uitemp;          /*  RTC整数分频                 */
			puiBaseAddr[__B_RTC_FRAC << uiOffBase]   = (Fpclk - ( uitemp + 1)*32768);
		}                                                               /*  RTC小数分频                 */
		
	   	puiBaseAddr[__B_RTC_CCR << uiOffBase] |= 0x01;					/*  启动时钟                    */	
	   	iResult                                = __RTC_UNRUN;				
    }
    
	if(uiArgOutclk != __RTC_IN_CLK) {						            /*  选择外部时钟,必须先启动时钟*/
	                                                                    /*  才能关闭时钟                */
		PCONP &= ~(1<<9);					                            /*  关闭RTC,以实现节电         */
	}
	return iResult;
}

/*********************************************************************************************************
** Function name:           rtcInit
** Descriptions:            RTC初始化函数,该函数为了兼容其他芯片的函数,暂时开放该接口,保留参数为以后添加
** Input parameters:        uiArgID        器件编号,默认为0
**                          pucArgData     传入字符串参数指针,
**                                         传入的参数格式为关键字0=值0[空格]关键字1=值1[空格].....
**                                         关键字为:Wakeup 1表示支持CPU中断唤醒,0表示不支持
**                                                  Outclk 1表示使用外部振荡器和电源,0表示使用内部振荡器
** Output parameters:       NONE
** Returned value:          返回1表示RTC已经为设置为外部晶振,返回0说明RTC使用内部晶振,OPERATE_FAIL表示
**                          初始化失败,失败的原因为ID传入错误。
*********************************************************************************************************/
int32 rtcInit (uint32 uiArgID, 
               char  *pucArgData, 
               uint32 uiRsv)
{
    uint32 uiTemp[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};                    /*  初始化参数                  */
	        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -