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

📄 rtc.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 3 页
字号:
			if ( i != 10  )
			{
				pcArgBuf[i] = '0';
			}
		}
	}
    return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           __rtcTimeSet
** Descriptions:            RTC设置时间函数,星期自动计算,
** Input parameters:        uiArgID        器件编号,默认为0
**                          pArgTime       传入设置时间参数的结构体指针
** Output parameters:       NONE
** Returned value:          获取成功:OPERATE_SUCCESS,
**                          获取失败:OPERATE_FAIL
**                          失败的原因为ID传入错误
*********************************************************************************************************/
static int32 __rtcTimeSet (uint32 uiArgID, __PRTC_PARM pArgTime)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
    
    if (uiArgID >= __RTC_MAX_NUM) {
        return OPERATE_FAIL; 
    } 
            
    puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase;                    /*  获取RTC寄存器基地址         */
    uiOffBase   = GrtiDataTab[uiArgID]->uiOffBase;
    
	puiBaseAddr[__B_RTC_CCR << uiOffBase] &= (~0x01);                   /*  停止RTC                     */
	
	/*
	 *  进行参数过滤
	 */
	if (pArgTime->uiYear > 4095 || pArgTime->uiYear == 0) {
	    pArgTime->uiYear = puiBaseAddr[__B_RTC_YEAR << uiOffBase];
	}
	if (pArgTime->uiMonth > 12 || pArgTime->uiMonth == 0) {
	    pArgTime->uiMonth = puiBaseAddr[__B_RTC_MON << uiOffBase];
	}
	if (pArgTime->uiDOM > 31 || pArgTime->uiDOM == 0) {
	    pArgTime->uiDOM = puiBaseAddr[__B_RTC_DOM << uiOffBase];
	}
	if (pArgTime->uiHour > 23) {
	    pArgTime->uiHour = puiBaseAddr[__B_RTC_HOUR << uiOffBase];
	}
	if (pArgTime->uiMinute > 59){
	    pArgTime->uiMinute = puiBaseAddr[__B_RTC_MIN << uiOffBase];
	}
	if (pArgTime->uiSecond > 59) {
	    pArgTime->uiSecond = puiBaseAddr[__B_RTC_SEC << uiOffBase];
	}
	
	/*
	 *  如果系统结果也错误了就调用备用参数
	 */
	if (pArgTime->uiYear > 4095 || pArgTime->uiYear == 0) {
	    pArgTime->uiYear = 2000;
	}
	if (pArgTime->uiMonth > 12 || pArgTime->uiMonth == 0) {
	    pArgTime->uiMonth = 5;
	}
	if (pArgTime->uiDOM > 31 || pArgTime->uiDOM == 0) {
	    pArgTime->uiDOM = 5;
	}
	if (pArgTime->uiHour > 23) {
	    pArgTime->uiHour = 5;
	}
	if (pArgTime->uiMinute > 59) {
	    pArgTime->uiMinute = 5;
	}
	if (pArgTime->uiSecond > 59) {
	    pArgTime->uiSecond = 5;
	}
	
	/*
	 *  参数设置
	 */
	puiBaseAddr[__B_RTC_YEAR << uiOffBase]  = pArgTime->uiYear;
	puiBaseAddr[__B_RTC_MON  << uiOffBase]  = pArgTime->uiMonth&0x0f;
	puiBaseAddr[__B_RTC_DOW  << uiOffBase]  = __weekDayGet(pArgTime->uiYear,
	                                                       (uint8)pArgTime->uiMonth, 
	                                                       (uint8)pArgTime->uiDOM );
	                                                                    /*  获取星期值                  */
	                                                 
	puiBaseAddr[__B_RTC_DOM  << uiOffBase]  = pArgTime->uiDOM;
	puiBaseAddr[__B_RTC_HOUR << uiOffBase]  = pArgTime->uiHour;
	puiBaseAddr[__B_RTC_MIN  << uiOffBase]  = pArgTime->uiMinute;
	puiBaseAddr[__B_RTC_SEC  << uiOffBase]  = pArgTime->uiSecond;
	
	puiBaseAddr[__B_RTC_CCR << uiOffBase] |= 0x01;                      /*  打开RTC                     */
	
	return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           rtcTimeSet
** Descriptions:            RTC设置时间函数,星期自动计算,字符串传入参数
** Input parameters:        uiArgID        器件编号,默认为0
**                          pcArgData      该参数是输入字符串格式参数的指针
**                                         例如设置时间为2007年6月23日,13时45分21秒,输入参数如下
**                                         "Year=2007 Month=6 Day=23 Hour=13 Min=45 Sec=21"
**                          Rsv            保留参数
** Output parameters:       NONE
** Returned value:          获取成功:OPERATE_SUCCESS,
**                          获取失败:OPERATE_FAIL
**                          失败的原因为ID传入错误,或参数传入空指针
*********************************************************************************************************/
int32 rtcTimeSet (uint32 uiArgID, 
                  char  *pcArgData, 
                  void  *Rsv)
{
	uint32 uiTemp[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};                    /*  初始化参数                  */
	
	Rsv = Rsv;                                                          /*  防止编译报警                */
	if (!pcArgData) {                                                   /*  传入空指针                  */
	    return OPERATE_FAIL;
	}
	ImpCmd( Tab_RTC, pcArgData, uiTemp);                                /*  把字符串转化为参数          */
	return __rtcTimeSet(uiArgID, (__PRTC_PARM)uiTemp);                  /*  设置参数                    */
}

/*********************************************************************************************************
** Function name:           __rtcTimeGet
** Descriptions:            RTC获取时间函数,获取到的值放到结构体中
** Input parameters:        uiArgID        器件编号,默认为0
**                          Time           获取时间参数结构体指针
** Output parameters:       NONE
** Returned value:          获取成功:OPERATE_SUCCESS,
**                          获取失败:OPERATE_FAIL
**                          失败的原因为ID传入错误,或参数传入空指针
*********************************************************************************************************/
static int32 __rtcTimeGet(uint32 uiArgID, __PRTC_PARM Time)
{
    volatile uint32       *puiBaseAddr;
             uint32        uiOffBase;
    
    if (uiArgID >= __RTC_MAX_NUM) {
        return OPERATE_FAIL; 
    } 
            
    puiBaseAddr = GrtiDataTab[uiArgID]->puiAddrBase;                    /*  获取RTC寄存器基地址         */
    uiOffBase   = GrtiDataTab[uiArgID]->uiOffBase;
    
    
	Time->uiYear   = puiBaseAddr[__B_RTC_YEAR << uiOffBase] & 0xFFF;
	Time->uiMonth  = puiBaseAddr[__B_RTC_MON  << uiOffBase] & 0x0F;
	Time->uiDOW    = puiBaseAddr[__B_RTC_DOW  << uiOffBase] & 0x07;
	Time->uiDOM    = puiBaseAddr[__B_RTC_DOM  << uiOffBase] & 0x1f;
	Time->uiHour   = puiBaseAddr[__B_RTC_HOUR << uiOffBase] & 0x1f;
	Time->uiMinute = puiBaseAddr[__B_RTC_MIN  << uiOffBase] & 0x3f;
	Time->uiSecond = puiBaseAddr[__B_RTC_SEC  << uiOffBase] & 0x3f;
	
	return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name:           rtcTimeGet
** Descriptions:            RTC获取时间函数
** Input parameters:        uiArgID        器件编号,默认为0
**                          Rsv            保留参数
** Output parameters:       pcArgData      该参数是输出字符串格式参数的指针
**                                         例如输出时间"2007-6-23 3 12:35:40\r\n"
** Returned value:          获取成功:OPERATE_SUCCESS,
**                          获取失败:OPERATE_FAIL
**                          失败的原因为ID传入错误,或参数传入空指针
*********************************************************************************************************/
int32 rtcTimeGet(uint32 uiArgID, 
                 char  *pcArgBuf, 
                 void  *Rsv )
{
	__RTC_PARM Time;
	uint8      i;
	
	if (!pcArgBuf) {
	    return OPERATE_FAIL;                                            /*  传出参数缓冲区空指针       */
	}
	if (__rtcTimeGet(uiArgID, &Time) == OPERATE_FAIL) {                 /*  获取时间值错误             */
	    return OPERATE_FAIL;
	}
	
	sprintf( pcArgBuf, "%4d-%2d-%2d %1d %2d:%2d:%2d\r\n", Time.uiYear, Time.uiMonth, \
			 Time.uiDOM, Time.uiDOW, Time.uiHour, Time.uiMinute, Time.uiSecond );
			 
	for ( i = 0; i < 21; i++)                                           /*  对填充的空格进行补0操作    */
	{
		if( pcArgBuf[i] == ' ' )
		{
			if ( i != 10 && i != 12 )
			{
				pcArgBuf[i] = '0';
			}
		}
	}
	
	return OPERATE_SUCCESS;
}

/*********************************************************************************************************
** Function name:           rtcISR
** Descriptions:            RTC中断服务程序,用户代码可以在IRQHook.c里添加。
** Input parameters:        NONE
** Output parameters:       NONE
** Returned value:          NONE
*********************************************************************************************************/
void rtcIsr(void)
{	
    rtcHook();
    ILR = 0x03;                                                         /*  该位置暂时使用寄存器操作    */
	VICVectAddr = 0;
}


/*********************************************************************************************************
   END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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