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

📄 rtc.c

📁 MPC8241:本程序是freescale的824*系列的BSP源程序
💻 C
字号:


/*
#include "netcomm.h"
#include <string.h>
#include "mpc.h"
*/
#include "vxWorks.h"
#include "rtc.h"  
  
void     rtctest(void);
void	 rtc_init(void);
char     *get_rtc_time(void);
STATUS   set_rtc_time(char *);


    
void     ReadRTC(UBYTE,UBYTE*);
void     ReadRTCBurst(UBYTE,UBYTE*);
void     WriteRTC(UBYTE,UBYTE);
void     HexToAscii(UBYTE,UBYTE*);

char UARTData[100];
UBYTE *BCSR0;
UBYTE *BCSR1;
UBYTE *BCSR4;
/* t_Uart_regs *UART; */
/* UBYTE *UART_RHR_THR_DLL0;
UBYTE *UART_IER_DLM1;
UBYTE *UART_FCR_ISR2;
UBYTE *UART_LCR3;
UBYTE *UART_MCR4;
UBYTE *UART_LSR5;
UBYTE *UART_MSR6;
UBYTE *UART_SPR7;
UBYTE *addr1;
UBYTE *addr2;
*/
/****************************************************/
/* function : LED  FLASH                            */
/****************************************************/
void	 rtc_init(void)
{
	UBYTE RTCData[1];
	WriteRTC(0x8e,0);
    WriteRTC(0x90,0xab);
    ReadRTC(0x81,RTCData);
	*RTCData &= ~BBIT0;
	WriteRTC(0x80,*RTCData);
}

char *get_rtc_time()
{
   
   int i,readreg;
    UBYTE RTCData[1];
    char *cp;
    UBYTE sec;
    UBYTE min;
    UBYTE hour;
    UBYTE date;
    UBYTE month;
    UBYTE day;
    UBYTE year;
    for(i=0;i<100;i++)
    UARTData[i]=NULL;
    cp = UARTData;
    ReadRTC(0x81,&sec); /* read clock sec*/
   	ReadRTC(0x83,&min); /* read clock min*/
   	ReadRTC(0x85,&hour); /* read clock hour*/
   	ReadRTC(0x87,&date); /* read clock date*/
   	ReadRTC(0x89,&month); /* read clock month*/
   	ReadRTC(0x8b,&day); /* read clock day*/
   	ReadRTC(0x8d,&year); /* read clock year*/
    
    sprintf (cp, "0x%02x:",year);
    cp = UARTData;
    cp+= strlen (UARTData); 
       
    sprintf (cp, "0x%02x:",month);
    cp = UARTData;
    cp+= strlen (UARTData);
    
    sprintf (cp, "0x%02x:",date);
    cp = UARTData;
    cp+= strlen (UARTData); 
       
    sprintf (cp, "0x%02x:",day);
    cp = UARTData;
    cp+= strlen (UARTData);   
    
    sprintf (cp, "0x%02x:",hour);
    cp = UARTData;
    cp+= strlen (UARTData);
    
    sprintf (cp, "0x%02x:",min);
    cp = UARTData;
    cp+= strlen (UARTData); 
    
    sprintf (cp, "0x%02x",sec);
    cp = UARTData;
    cp+= strlen (UARTData); 
    
        
    /* if((*RTCData)>=02&&(*RTCData)<30) */
    return UARTData;	   		
    /* else
    return NULL;	*/
}

STATUS   set_rtc_time(char *initString)
{
	char *  tok;		/* an initString token */
    char *  holder = NULL;	/* points to initString fragment beyond tok */
	UBYTE RTCData[1];
	
    UBYTE sec;
    UBYTE min;
    UBYTE hour;
    UBYTE date;
    UBYTE month;
    UBYTE day;
    UBYTE year;
    tok = strtok_r (initString, ":", &holder);
    if (tok == NULL)
		return ERROR;
    year = strtoul (tok, NULL, 16);
    
    tok = strtok_r (NULL, ":", &holder);
    if (tok == NULL)
		return ERROR;
	month= strtoul (tok, NULL, 16);
	
	tok = strtok_r (NULL, ":", &holder);
    if (tok == NULL)
		return ERROR;
	date = strtoul (tok, NULL, 16);
	
	tok = strtok_r (NULL, ":", &holder);
    if (tok == NULL)
		return ERROR;
	day= strtoul (tok, NULL, 16);
	
	tok = strtok_r (NULL, ":", &holder);
    if (tok == NULL)
		return ERROR;
	hour= strtoul (tok, NULL, 16);
	
	tok = strtok_r (NULL, ":", &holder);
    if (tok == NULL)
		return ERROR;
	min= strtoul (tok, NULL, 16);
	
	tok = strtok_r (NULL, ":", &holder);
    if (tok == NULL)
		return ERROR;
	sec= strtoul (tok, NULL, 16);
	
	
	
	WriteRTC(0x80,sec);	/* write clock sec */
    WriteRTC(0x82,min);	/* write clock min */
    WriteRTC(0x84,hour);	/* write clock hour */
    WriteRTC(0x86,date);	/* write clock date */
    WriteRTC(0x88,month);	/* write clock month */
    WriteRTC(0x8a,day);		/* write clock day */
    WriteRTC(0x8c,year);	/* write clock year */
	ReadRTC(0x8b,RTCData);
	if((*RTCData)==day)
		return (OK);
	else
		return (ERROR);
}


void  rtctest(void)
{
    
    UBYTE ii;
    UBYTE sec;
    UBYTE min;
    UBYTE hour;
    UBYTE date;
    UBYTE month;
    UBYTE day;
    UBYTE year;
    UWORD jj;
    UBYTE RTCData[40];
    UBYTE UARTData[14];
    /*char kk[]="\n\r************************************\n\rHow are you!张加民\n\r************************************\n\r";*/
    char y[] ="年";
    char x[]="周";
    char m[]="月";
    char d[]="日";
    char h[]="时";
    char mi[]="分";
    char s[]="秒";
    
	/* *BCSR0 = 0xff;
    for (jj=0; jj < 100000; jj++);
    *BCSR0 = 0x00;  */ 
	
	
    
    /*UART_RHR_THR_DLL0=(UBYTE *)(0xff900000);
    UART_IER_DLM1=(UBYTE *)(0xff900001);
    UART_FCR_ISR2=(UBYTE *)(0xff900002);
    UART_LCR3=(UBYTE *)(0xff900003);
    UART_MCR4=(UBYTE *)(0xff900004);
    UART_LSR5=(UBYTE *)(0xff900005);
    UART_MSR6=(UBYTE *)(0xff900006);
    UART_SPR7=(UBYTE *)(0xff900007);
	
	  *UART_LCR3 = 0x80;         
	  *UART_IER_DLM1=0x0;
    *UART_RHR_THR_DLL0=0x78;*/	/* 9600 1.8432M 0x0c 18.431M 0x78*/
    /**UART_LCR3 = 0x03;*/ /* word length 8*/
    /**UART_FCR_ISR2 = 0x01; */ /*Enable the transmit and receive FIFO.This bit must be a "1" when other FCR bits are written to or they will not be programmed.*/
    /**UART_FCR_ISR2 = 0x07; */ /*clears the contents of receive FIFO and clears thecontents of transmit FIFO,resets the FIFO ciybter kiguc,*/
    /**UART_SPR7 =0x55;*/ /* temporary data register*/
	/*if((*UART_FCR_ISR2 & 0xC0)==0xC0)*/ /*当FIFO有效时*/
	/**UART_IER_DLM1=0x00;  */	/* Set as polling mode 不使用中断*/ 
  	 
    /* *UART_MCR4 = 0x10; */
    
    /*addr1= (UBYTE *)(0x6000);
    addr2= (UBYTE *)(0xff900000);
    for (jj=0; jj < 100; jj++)
	{	  
	*addr1=*addr2;
	addr2++;
	addr1++;
	}
   	addr1= (UBYTE *)(0x6000);
    *UART_RHR_THR_DLL0= 0x0a;
    *UART_RHR_THR_DLL0= 0x0d;
    ii=1;
    while(kk[ii])
    {
	*UART_RHR_THR_DLL0= kk[ii];
	ii++;
	for (jj=0; jj < 10000; jj++);
    }
    *UART_RHR_THR_DLL0= 0x0a;
    *UART_RHR_THR_DLL0= 0x0d;*/
    printf("\n************************************\nHow are you!张加民\n************************************\n");
    WriteRTC(0x8e,0);
    WriteRTC(0x90,0xab);
    ii=1;
    if(ii==1)
    {
		sec=0x00;
		min=0x10;
		hour=0x13;
		date=0x16;
		month=0x08;
		day=0x05;
		year=0x02;
		WriteRTC(0x80,sec);	/* read clock sec*/
		WriteRTC(0x82,min);	/* read clock min*/
		WriteRTC(0x84,hour);	/* read clock hour*/
		WriteRTC(0x86,date);	/* read clock date*/
		WriteRTC(0x88,month);	/* read clock month*/
		WriteRTC(0x8a,day);	/* read clock day*/
		WriteRTC(0x8c,year);	/* read clock year*/
    }
	/*    WriteRTC(0xc0,0x55);	*/	/* write ram*/
    while(1)    	    	
    {	
		/*ReadRTC(0xc1,RTCData);*/ /* read ram*/
       	ReadRTC(0x81,RTCData); /* read clock sec*/
       	HexToAscii(*RTCData,&UARTData[12]);
       	ReadRTC(0x83,RTCData); /* read clock min*/
       	HexToAscii(*RTCData,&UARTData[10]);
       	ReadRTC(0x85,RTCData); /* read clock hour*/
       	HexToAscii(*RTCData,&UARTData[8]);
       	ReadRTC(0x87,RTCData); /* read clock date*/
       	HexToAscii(*RTCData,&UARTData[6]);
       	ReadRTC(0x89,RTCData); /* read clock month*/
       	HexToAscii(*RTCData,&UARTData[4]);
       	ReadRTC(0x8b,RTCData); /* read clock day*/
       	HexToAscii(*RTCData,&UARTData[2]);
       	ReadRTC(0x8d,RTCData); /* read clock year*/
       	HexToAscii(*RTCData,&UARTData[0]);
		for (jj=0; jj < 1000000; jj++);
		
		/*if ((*UART_LSR5 & 0x20) == 0x20 ) 
		*UART_RHR_THR_DLL0= 0x0a;
		*UART_RHR_THR_DLL0= 0x0d;
		*UART_RHR_THR_DLL0= 0x32;
		*UART_RHR_THR_DLL0= 0x30;*/
		/*for (jj=0; jj < 1000000; jj++);
		*UART_RHR_THR_DLL0= UARTData[0];
    	*UART_RHR_THR_DLL0= UARTData[1];
		*UART_RHR_THR_DLL0= y[0];
		*UART_RHR_THR_DLL0= y[1];*/
		printf("\n");
		printf("%c",UARTData[0]);
		printf("%c",UARTData[1]);
		printf("%c",y[0]);
		printf("%c",y[1]);
		for(ii=3;ii<5;ii++)
		{	
			
			/**UART_RHR_THR_DLL0= UARTData[ii*2-2];*/
			printf("%c",UARTData[ii*2-2]);
			/**UART_RHR_THR_DLL0= UARTData[ii*2-1];*/
			printf("%c",UARTData[ii*2-1]);
			
			/*if(ii==2)
			{*UART_RHR_THR_DLL0= 0x20;}*/
			if(ii==3)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
    			/**UART_RHR_THR_DLL0= m[0];*/
    			printf("%c",m[0]);
				/**UART_RHR_THR_DLL0= m[1];*/
				printf("%c",m[1]);
			}
			if(ii==4)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
    			/**UART_RHR_THR_DLL0= d[0];*/
    			printf("%c",d[0]);
				/**UART_RHR_THR_DLL0= d[1];*/
				printf("%c",d[1]);
			}
			if(ii==5)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
    			/**UART_RHR_THR_DLL0= h[0];*/
    			printf("%c",h[0]);
				/**UART_RHR_THR_DLL0= h[1];*/
				printf("%c",h[1]);
			}
			if(ii==6)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
    			/**UART_RHR_THR_DLL0= mi[0];*/
    			printf("%c",mi[0]);
				/**UART_RHR_THR_DLL0= mi[1];*/
				printf("%c",mi[1]);
			}
			if(ii==7)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
    			/**UART_RHR_THR_DLL0= s[0];*/
    			printf("%c",s[0]);
				/**UART_RHR_THR_DLL0= s[1];*/
				printf("%c",s[1]);
			}
			/*UART_RHR_THR_DLL0= 0x20;*/
			for (jj=0; jj < 100000; jj++);
			
		}
		/**UART_RHR_THR_DLL0= x[0];*/
		printf("%c",x[0]);
		/**UART_RHR_THR_DLL0= x[1];*/
		printf("%c",x[1]);
		/**UART_RHR_THR_DLL0= UARTData[2];*/
		printf("%c",UARTData[2]);
		/**UART_RHR_THR_DLL0= UARTData[3];*/
		printf("%c",UARTData[3]);
		/**UART_RHR_THR_DLL0= 0x20;*/
		printf("%c",0x20);
		for(ii=5;ii<8;ii++)
		{	
			
			/**UART_RHR_THR_DLL0= UARTData[ii*2-2];*/
			printf("%c",UARTData[ii*2-2]);
			/**UART_RHR_THR_DLL0= UARTData[ii*2-1];*/
			printf("%c",UARTData[ii*2-1]);
			
			/*if(ii==2)
			{*UART_RHR_THR_DLL0= 0x20;}*/
			if(ii==3)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
				/**UART_RHR_THR_DLL0= m[0];*/
				printf("%c",m[0]);
				/**UART_RHR_THR_DLL0= m[1];*/
				printf("%c",m[1]);
			}
			if(ii==4)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
				/**UART_RHR_THR_DLL0= d[0];*/
				printf("%c",d[0]);
				/**UART_RHR_THR_DLL0= d[1];*/
				printf("%c",d[1]);
			}
			if(ii==5)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
				/**UART_RHR_THR_DLL0= h[0];*/
				printf("%c",h[0]);
				/**UART_RHR_THR_DLL0= h[1];*/
				printf("%c",h[1]);
			}
			if(ii==6)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
				/**UART_RHR_THR_DLL0= mi[0];*/
				printf("%c",mi[0]);
				/**UART_RHR_THR_DLL0= mi[1];*/
				printf("%c",mi[1]);
			}
			if(ii==7)
			{
				/*UART_RHR_THR_DLL0= 0x9;*/
				/**UART_RHR_THR_DLL0= s[0];*/
				printf("%c",s[0]);
				/**UART_RHR_THR_DLL0= s[1];*/
				printf("%c",s[1]);
			}
			/*UART_RHR_THR_DLL0= 0x20;*/
			for (jj=0; jj < 100000; jj++);
			
		}
		
		/**UART_RHR_THR_DLL0= 0x0a;
		*UART_RHR_THR_DLL0= 0x0d;*/	
		
    }	
	
}


void ReadRTC(UBYTE addr1,UBYTE* addr2)
{
	UBYTE  i;
	UBYTE  TEMP;
	UBYTE  TEMP1;
	UWORD  RTCi;
	UBYTE *BCSR0;
	UBYTE *BCSR1;
	UBYTE *BCSR4;
	
	TEMP=0;
	TEMP1=0;
	BCSR0=(UBYTE *)(0xff800000);
    
	BCSR1=(UBYTE *)(0xff800001);
	BCSR4=(UBYTE *)(0xff800004);
	*BCSR1 &= ~BBIT6;		/* SCLK '0'*/
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/
	*BCSR4 |= BBIT3;		/* EPLD DIO OUTPUT*/
	for (RTCi=0; RTCi < 2000; RTCi++);
	*BCSR0 |= BBIT4;		/* RESET '1'*/
	
	
	for(i = 0; i < 8; ++i)
	{		
		if(addr1 & 0x01)
		{
			*BCSR1 |= BBIT7;	/* set port pin high to read data */
		}
		else
			*BCSR1 &= ~BBIT7;
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		*BCSR1 |= BBIT6;		/* SCLK '1'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		addr1 >>= 1;
	}
    *BCSR4 &= ~BBIT3;	/* EPLD DIO INPUT*/  
	for(i=0;i<8;i++){
		
		*BCSR1 |= BBIT6;		/*SCLK '1'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		
		TEMP=(*BCSR1 & BBIT7);			
		TEMP<<=7;
		TEMP1>>= 1;;
		TEMP1 |= TEMP;
		
	}
	*addr2=TEMP1;
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/
	for (RTCi=0; RTCi < 2000; RTCi++);
	
}


void  HexToAscii(UBYTE data,UBYTE* addr )
{
	* addr=(data>>4)+0x30;
	addr++;
	* addr=(data&0x0f)+0x30;
}


void WriteRTC(UBYTE addr1,UBYTE data)
{
	UBYTE  i;
	UBYTE  TEMP;
	UBYTE  TEMP1;
	UWORD  RTCi;
	UBYTE *BCSR0;
	UBYTE *BCSR1;
	UBYTE *BCSR4;
	
	TEMP=0;
	TEMP1=0;
	BCSR0=(UBYTE *)(0xff800000);
    
	BCSR1=(UBYTE *)(0xff800001);
	BCSR4=(UBYTE *)(0xff800004);
	
	*BCSR1 &= ~BBIT6;		/* SCLK '0'*/
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/
	*BCSR4 |= BBIT3;		/* EPLD DIO OUTPUT*/
	for (RTCi=0; RTCi < 2000; RTCi++);
	*BCSR0 |= BBIT4;		/* RESET '1'*/
	
	
	for(i = 0; i < 8; ++i)
	{		
		if(addr1 & 0x01)
		{
			*BCSR1 |= BBIT7;	/* set port pin high to read data */
		}
		else
			*BCSR1 &= ~BBIT7;
		
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		*BCSR1 |= BBIT6;		/* SCLK '1'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		addr1 >>= 1;
	}
	
	for(i = 0; i < 8; ++i)
	{		
		if(data & 0x01)
		{
			*BCSR1 |= BBIT7;	/* set port pin high to read data */
		}
		else
			*BCSR1 &= ~BBIT7;
		
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		*BCSR1 |= BBIT6;		/* SCLK '1'*/
		for (RTCi=0; RTCi < 100; RTCi++);
		data >>= 1;
    }
	
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/
	for (RTCi=0; RTCi < 2000; RTCi++);
}

⌨️ 快捷键说明

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