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

📄 rtccontrol.c

📁 zilog的实时操作系统RZK,可以移植到多种处理器上
💻 C
字号:
/*
* File			:	RtcControl.c
*
* Description	:	RTC control settings. Does time and alarm settings.
*					
* 
* Copyright 2004 ZiLOG Inc.  ALL RIGHTS RESERVED.
*
* This file contains unpublished confidential and proprietary information
* of ZiLOG, Inc.
* NO PART OF THIS WORK MAY BE DUPLICATED, STORED, PUBLISHED OR DISCLOSED 
* IN ANY FORM WITHOUT THE PRIOR WRITTEN CONSENT OF ZiLOG, INC.
* This is not a license and no use of any kind of this work is authorized
* in the absence of a written license granted by ZiLOG, Inc. in ZiLOG's 
* sole discretion 
*/

#ifdef _IAR_CODE

#ifdef _EZ80F91
#include <ioez80f91.h>
#endif

#ifdef _EZ80F92
#include <ioez80f92.h>
#endif

#ifdef _EZ80F93
#include <ioez80f92.h>
#endif

#ifdef _EZ80L92
#include <ioez80l92.h>
#endif

#ifdef _EZ80190
#include <ioez80190.h>
#endif

#else

#include <ez80.h>

#endif


#include <stdio.h>
#include <stdlib.h>

#include "ZTypes.h"
#include "ZSysgen.h"
#include "ZDevice.h"
#include "ZThread.h"
#include "ZInterrupt.h"
#include "Rtc.h"


extern void rtcisr(void) ;
extern UINT8 RTC_TASK_PRIO ;
extern UINT RTC_THD_STACK_SIZE ;
extern UINT8 RTC_Task_Stack[] ;
void RtcTask(void) ;

RZK_THREADHANDLE_t rtcInterruptThdHdl ;



DDF_STATUS_t RTCControl(RZK_DEVICE_CB_t *pdev, RZK_DEV_BYTES_t uOperation, void *addr1, void *addr2)
{
	
	switch((UINT)uOperation)
	{
	case RTC_SET_SEC:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_SEC = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 
		break ;
		
	case RTC_SET_MIN:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_MIN = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 
		break ;
		
	case RTC_SET_HRS:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_HRS = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 		
		break ;
		
	case RTC_SET_MON:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_MON = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 
		break ;
		
	case RTC_SET_DOW:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_DOW = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 		
		break ;
		
	case RTC_SET_DOM:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_DOM = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 
		break ;
		
	case RTC_SET_YEAR:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_YR = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 
		break ;
		
	case RTC_SET_CENT:
		RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
		RTC_CEN = *((INT8*)addr1) ;
		RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 
		break ;
		
	case RTC_SET_ALL:
		{
			TIME *pTime = (TIME *)addr1 ;
			
			RTC_CTRL |= COUNT_REGISTERS_UNLOCK; // unlocks the RTC_UNLOCK
			
			RTC_SEC = pTime->sec ;
			RTC_MIN = pTime->minutes ;
			RTC_HRS = pTime->hrs ;
			RTC_MON = pTime->mon ;
			RTC_DOW = pTime->dayOfWeek ;
			RTC_DOM = pTime->dayOfMonth ;
			RTC_YR	= pTime->year ;
			RTC_CEN = pTime->cent ;
			
			RTC_CTRL &= ~COUNT_REGISTERS_UNLOCK;     // locks the RTC_LOCK 
			break ;
		}
		
	case RTC_ENABLE_BCD:
		RTC_CTRL |= BINARY_FORMAT_ENABLED ;
		break ;
		
	case RTC_DISABLE_BCD:
		RTC_CTRL &= ~BINARY_FORMAT_ENABLED ;
		break ;

	case RTC_CLK_SEL_CRYSTAL_OSCILL:
		RTC_CTRL &=~POWER_LINE_FREQUENCY_INPUT ;
		break ;

	case RTC_CLK_SEL_POWER_LINE_FREQ:
		RTC_CTRL |= POWER_LINE_FREQUENCY_INPUT ;
		break ;		

	case RTC_POWER_LINE_FREQUENCY50HZ:
		RTC_CTRL |= POWER_LINE_FREQUENCY_SELECT ;
		break ;		

	case RTC_POWER_LINE_FREQUENCY60HZ:
		RTC_CTRL &= ~POWER_LINE_FREQUENCY_SELECT ;
		break ;		
		

	case RTC_RESET_CONTROL:
		RTC_CTRL = 0 ;
		break ;
		
	case RTC_ENABLE_ALARM:
		{
			TIME *pTime = (TIME *)addr1 ;
			
			RZKInstallInterruptHandler( (RZK_FNP_ISR)rtcisr, RTC_ALARM_VECTOR_OFFSET ) ;
			
			rtcInterruptThdHdl = RZKCreateThreadEnhanced((RZK_NAME_t*)"RTC_TASK",
				(RZK_PTR_t)RtcTask, 
				(FNP_THREAD_ENTRY *) NULL, 
				RTC_THD_STACK_SIZE, 
				RTC_TASK_PRIO, 
				2,
				RZK_THREAD_INTERRUPT|RZK_THREAD_PREEMPTION,
				0 ) ;
			if( rtcInterruptThdHdl == NULL )
			{
				return RTC_ERR_RESOURCE_NOT_CREATED ;
			}
			RTC_ASEC = pTime->sec;
			RTC_AMIN = pTime->minutes;
			RTC_AHRS = pTime->hrs;
			RTC_ADOW = pTime->dayOfWeek ;
#ifdef _IAR_CODE
#ifdef _EZ80F91			
			RTC_ACTR = RTC_ALARM_ENABLE;
#else
                        RTC_ACTRL = RTC_ALARM_ENABLE;
#endif		
#else
			RTC_ACTRL = RTC_ALARM_ENABLE;
#endif			
			RTC_CTRL |= ALARM_INTERRUPT_ENABLED ;
			break ;
		}
	case RTC_DISABLE_ALARM:
		{
			RZK_STATUS_t status ;

#ifdef _IAR_CODE
#ifdef _EZ80F91
			RTC_ACTR = 0 ;
#else
			RTC_ACTRL = 0 ;
#endif						
#else
			RTC_ACTRL = 0 ;
#endif			
			RTC_CTRL &= ~ALARM_INTERRUPT_ENABLED ;

			status = RZKDeleteThreadEnhanced( rtcInterruptThdHdl) ;
			if(status != RZKERR_SUCCESS )
			{
				return RTC_ERR_RESOURCE_NOT_DELETED ;
			}
		}
		
	default:
		break ;
	}
	
	return RTC_ERR_SUCCESS ;
	
}




⌨️ 快捷键说明

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