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

📄 rtc.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 3 页
字号:
    uiRsv = uiRsv;                                                      /*  防止编译报警                */
	
    ImpCmd(Tab_RTC, pucArgData, uiTemp);						        /*  把字符串转化为参数          */
	
    #if __RTC_EN_OUT_CLK == 0                                           /*  根据是否具有外部CLK进行编译 */
    uiTemp[Wakeup] = __RTC_UNINT_WAKE;                                  /*  不具有外部CLK,参数采用默认值*/
    uiTemp[Outclk] = __RTC_IN_CLK;
	#endif
	
    return __rtcInit(uiArgID, uiTemp[Wakeup], uiTemp[Outclk]);                    
}


/*********************************************************************************************************
** Function name:           rtcSetMode
** Descriptions:            RTC设置模式参数,能够设置增量中断,报警中断,和清除中断
** Input parameters:        uiArgID        器件编号,默认为0
**                          uiArgMode      要设置参数的类型,类型种类如下
**                                          RTC_MODE_SEC_INT     秒增量中断
**                                          RTC_MODE_MIN_INT    分钟增量中断
**                                          RTC_MODE_HOU_INT    小时增量中断
**                                          RTC_MODE_DOM_INT    月里面天数增量中断
**                                          RTC_MODE_DOW_INT    星期值增量中断
**                                          RTC_MODE_DOY_INT    在年里面日期增量中断
**                                          RTC_MODE_MON_INT    月值增量中断
**                                          RTC_MODE_YEA_INT    年值增量中断
**                                          RTC_MODE_NULL       清除中断触发
**                                          RTC_MODE_ALARM      报警中断
**                          pucArgData     当上面的uiArgMode为RTC_MODE_ALARM时,传入字符串参数指针,
**                                         用来设置报警值,否则可传入空指针。
**                                         传入的参数格式为关键字0=值0[空格]关键字1=值1[空格].....
**                                         关键字:Year  范围0-4095
**                                                 Month 月,范围1-12
**                                                 Day   日期(月),1-31
**                                                 Hour  小时,0-23
**                                                 Min   分钟,0-59
**                                                 Sec   秒  ,0-59
** Output parameters:       NONE
** Returned value:          设置成功:OPERATE_SUCCESS,
**                          设置失败:OPERATE_FAIL
**                          失败的原因为ID传入错误。模式传入错误
*********************************************************************************************************/
int32 rtcModeSet (uint32 uiArgID,
                  uint32 uiArgMode,
                  char  *pcArgData)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
             
             uint32        uiTemp[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
             
             int32         iResult;
             
             __PRTC_PARM   prtpaTime;
    
    
    if (uiArgID >= __RTC_MAX_NUM) {
        return OPERATE_FAIL;
    }
    
    puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase;                    /*  获取RTC寄存器基地址         */
    uiOffBase   = GrtiDataTab[uiArgID]->uiOffBase;
    
	iResult = OPERATE_SUCCESS;                                          /*  预设操作结果成功            */
	PCONP |= (1<<9);						                            /*  打开RTC功率控制寄存器       */
	puiBaseAddr[__B_RTC_ILR << uiOffBase] = 0x03;                       /*  清除中断                    */
    
    switch (uiArgMode) {
    
		case RTC_MODE_SEC_INT:
		case RTC_MODE_MIN_INT:
		case RTC_MODE_HOU_INT:
		case RTC_MODE_DOM_INT:
		case RTC_MODE_DOW_INT:
		case RTC_MODE_DOY_INT:
		case RTC_MODE_MON_INT:
		case RTC_MODE_YEA_INT:                                          /*  增量中断,同一种处理方式     */  
			puiBaseAddr[__B_RTC_CIIR << uiOffBase] = uiArgMode;         /*  设置增量中断                */
		    break;
		
		case RTC_MODE_NULL:					                            /*  清除所有中断触发            */
			puiBaseAddr[__B_RTC_CIIR << uiOffBase] = 0;
			puiBaseAddr[__B_RTC_AMR << uiOffBase]  = 0xFF;
		    break;
		    
		case RTC_MODE_ALARM:
            if (pcArgData) {                                            /*  指针有效                    */
                ImpCmd( Tab_RTC, pcArgData, uiTemp);                    /*  把字符串转化为参数          */
            }
            
            prtpaTime = (__PRTC_PARM)uiTemp;                            /*  对参数进行指针强转          */
            
            /*
             *  参数过滤,这些参数过滤允许用户修改单个时间报警值
             */
            if (prtpaTime->uiYear > 4095 || prtpaTime->uiYear == 0) {
                prtpaTime->uiYear = puiBaseAddr[__B_RTC_ALYEA << uiOffBase];
            }
            if (prtpaTime->uiMonth > 12 || prtpaTime->uiMonth == 0) {
                prtpaTime->uiMonth = puiBaseAddr[__B_RTC_ALMON << uiOffBase];
            }
            if (prtpaTime->uiDOM > 31 || prtpaTime->uiDOM == 0) {
                prtpaTime->uiDOM = puiBaseAddr[__B_RTC_ALDOM << uiOffBase];
            }
            if (prtpaTime->uiHour > 23) {
                prtpaTime->uiHour = puiBaseAddr[__B_RTC_ALHOU << uiOffBase];
            }
            if (prtpaTime->uiMinute > 59) {
                prtpaTime->uiMinute = puiBaseAddr[__B_RTC_ALMIN << uiOffBase];
            }
            if (prtpaTime->uiSecond > 59) {
                prtpaTime->uiSecond = puiBaseAddr[__B_RTC_ALSEC << uiOffBase];
            }

            /*
             *  设置报警值
             */
			puiBaseAddr[__B_RTC_ALYEA << uiOffBase] = prtpaTime->uiYear;
			puiBaseAddr[__B_RTC_ALMON << uiOffBase] = prtpaTime->uiMonth;
			puiBaseAddr[__B_RTC_ALDOM << uiOffBase] = prtpaTime->uiDOM;
			puiBaseAddr[__B_RTC_ALHOU << uiOffBase] = prtpaTime->uiHour;
			puiBaseAddr[__B_RTC_ALMIN << uiOffBase] = prtpaTime->uiMinute;
			puiBaseAddr[__B_RTC_ALSEC << uiOffBase] = prtpaTime->uiSecond;
			
			puiBaseAddr[__B_RTC_AMR << uiOffBase]   = 0x30;             /*  打开报警中断,星期与         */
			                                                            /*  日期(年)没有匹配报警      */
			break;
			
		default:
		    iResult = OPERATE_FAIL;
		    break;
    }
    
	if ( GrtiDataTab[uiArgID]->ucClkStat == __RTC_OUT_CLK )				/*  如果外部时钟,进入节电模式  */
	{
		PCONP &= ~(1<<9);
	}
	
    return iResult;
}

/*********************************************************************************************************
** Function name:           __rtcAlarmGet
** Descriptions:            RTC获取报警值
** Input parameters:        uiArgID        器件编号,默认为0
**                          RtcTime        获取时间值的结构体指针
** Output parameters:       NONE
** Returned value:          获取成功:OPERATE_SUCCESS,
**                          获取失败:OPERATE_FAIL
**                          失败的原因为ID传入错误;查询报警值,但没有设置报警值
*********************************************************************************************************/

static int32 __rtcAlarmGet( uint32 uiArgID, __PRTC_PARM RtcTime)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
    
    if (uiArgID >= __RTC_MAX_NUM) {
        return OPERATE_FAIL; 
    } 
            
    puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase;                    /*  获取RTC寄存器基地址         */
    uiOffBase   = GrtiDataTab[uiArgID]->uiOffBase;
    
    if ((puiBaseAddr[__B_RTC_AMR << uiOffBase] & 0xff) == 0xff) {
        return OPERATE_FAIL;                                            /*  没有设置报警中断,返回错误  */
    }
    
	RtcTime->uiYear   = puiBaseAddr[__B_RTC_ALYEA << uiOffBase] & 0xFFF;
	RtcTime->uiMonth  = puiBaseAddr[__B_RTC_ALMON << uiOffBase] & 0x0F;
	RtcTime->uiDOM    = puiBaseAddr[__B_RTC_ALDOM << uiOffBase] & 0x1f;
	RtcTime->uiHour   = puiBaseAddr[__B_RTC_ALHOU << uiOffBase] & 0x1f;
	RtcTime->uiMinute = puiBaseAddr[__B_RTC_ALMIN << uiOffBase] & 0x3f;
	RtcTime->uiSecond = puiBaseAddr[__B_RTC_ALSEC << uiOffBase] & 0x3f;
	
	RtcTime->uiDOW    = 0;                                              /*  没有设置的报警内容填充0      */
	
	return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           rtcGetMode
** Descriptions:            RTC获取模式参数,能够获取中断状态以及当前的报警中断报警值
** Input parameters:        uiArgID        器件编号,默认为0
**                          uiArgMode      要获取参数的类型,类型种类如下,暂时开放报警中断
**                                         RTC_MODE_ALARM      报警中断
** Output parameters:       pcArgBuf       当上面的uiArgMode为RTC_MODE_ALARM时,输出RTC报警时间值,
**                                         输出格式为:"2007-07-01 12:36:25"
** Returned value:          获取成功:OPERATE_SUCCESS,
**                          获取失败:OPERATE_FAIL
**                          失败的原因为ID传入错误;输出缓冲区为NULL;查询报警值,但没有设置报警值
*********************************************************************************************************/
int32 rtcModeGet (uint32 uiArgID,
                  uint32 uiArgMode,
                  char  *pcArgBuf)
{
    __RTC_PARM      AlarmTime;
    uint32          i;
            
    if (!pcArgBuf) {                                                    /*  传入空指针返回错误          */
        return OPERATE_FAIL;
    }
    
    if (uiArgMode != RTC_MODE_ALARM) {
        return OPERATE_FAIL;                                            /*  不是报警中断就返回错误      */
    }
    
    if (__rtcAlarmGet(uiArgID, &AlarmTime) == OPERATE_FAIL) {           /*  获取报警值失败              */
        return OPERATE_FAIL; 
    }
                                                                        /*  格式化输出时间              */
	sprintf( pcArgBuf, "%4d-%2d-%2d %2d:%2d:%2d", AlarmTime.uiYear, AlarmTime.uiMonth, \
			 AlarmTime.uiDOM, AlarmTime.uiHour, AlarmTime.uiMinute, AlarmTime.uiSecond );
			 
	for ( i = 0; i < 18; i++)
	{
		if( pcArgBuf[i] == ' ' )
		{

⌨️ 快捷键说明

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