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

📄 rtc4513.c

📁 在PXA270上替换开发板的实时时钟RTC4513为DS1302的修改说明,自己写的,拿上来和大家共享,也希望大家提意见
💻 C
字号:
#include    <windows.h>#include	<types.h>#include    <memory.h>#include    <nkintr.h>
#include	<oal.h>
#include    <bulverde.h>
#include    "xllp_gpio.h"
#include	"xsbase270_g.h"#define RTC_SDA		(XLLP_BIT_9)  //gpio9#define RTC_GET_TIME		0x1#define RTC_SETTING_TIME	0x2
#define RTC_CE              (1<<0)  // 
#define RTC_CLK             (1<<1)  // #define TWH			10#define TWL			10#define TCS			15#define TCH			20#define TCR			30#define TCKS			20#define TCKH			20#define TDS			50#define TDH			50#define TRD			25#define TRZ			10#define TRF			20#define RTC_WR_MODE             0x3#define RTC_RD_MODE             0xc#define RTC4513_S1              0x0#define RTC4513_S10             0x1#define RTC4513_MI1             0x2#define RTC4513_MI10            0x3#define RTC4513_H1              0x4#define RTC4513_H10             0x5#define RTC4513_D1              0x6#define RTC4513_D10             0x7#define RTC4513_MO1             0x8#define RTC4513_MO10            0x9#define RTC4513_Y1              0xa#define RTC4513_Y10             0xb#define RTC4513_W               0xc#define RTC4513_CD              0xd#define RTC4513_CE              0xe#define RTC4513_CF              0xfstatic volatile UINT8 *g_pRTCBCRegs = NULL;
static volatile BULVERDE_GPIO_REG    *g_pGPIORegs = NULL;
static volatile UINT8 *g_pRTCRegs = NULL;

//static int bcr=0;

#define XSBASE270_RTC_SETBIT(x) \
{ \
	*g_pRTCBCRegs |= (x); \
	*g_pRTCRegs = *g_pRTCBCRegs; \
}
#define XSBASE270_RTC_CLEARBIT(x) \
{ \
	*g_pRTCBCRegs &= ~(x); \
	*g_pRTCRegs = *g_pRTCBCRegs; \
}
static void Wait(UINT32 microSeconds)
{
    volatile UINT32 *TimerOSCRAddress= (volatile UINT32 *) OALPAtoVA((BULVERDE_BASE_REG_PA_OST + 0x10), FALSE);
    UINT32 Value, Time;

    Time   = *TimerOSCRAddress;
    Value = Time + (microSeconds * 4);
    if (Value < Time)
    {  // test for wrap.
        while (Time < *TimerOSCRAddress);
    }
    while (*TimerOSCRAddress <= Value);

}void RTC_Enable(void){    g_pGPIORegs->GPDR0 |= RTC_SDA;    g_pGPIORegs->GPCR0 |= RTC_SDA;    Wait(TCKS);    XSBASE270_RTC_SETBIT(RTC_CE);        Wait(TCS);}void RTC_Disable(void){    g_pGPIORegs->GPDR0 |= RTC_SDA;    g_pGPIORegs->GPCR0 |= RTC_SDA;    Wait(TCH);    XSBASE270_RTC_CLEARBIT(RTC_CE);    Wait(TCR);}unsigned long read_nbits(int nbit) {	    unsigned long data = 0;    int  i;	    g_pGPIORegs->GPDR0 &= ~RTC_SDA;    for(i = 0; i < nbit; i++){		XSBASE270_RTC_SETBIT(RTC_CLK);    			Wait(TWH);		data |= (((g_pGPIORegs->GPLR0  & RTC_SDA)!=0) ? 0x01<<i:0);		XSBASE270_RTC_CLEARBIT(RTC_CLK);				Wait(TWL);	}    Wait(TRZ);    return(data);}int read_4bits(void){    return read_nbits(4);}void write_nbits(unsigned long put_data, int nbit) /* n bit instruction set download */{    int i;	    g_pGPIORegs->GPDR0 |= RTC_SDA;    for(i=0; i < nbit; i++){        if(put_data & (0x01<<i))            g_pGPIORegs->GPSR0 |= RTC_SDA;        else            g_pGPIORegs->GPCR0 |= RTC_SDA;		        Wait(TDS);		XSBASE270_RTC_SETBIT(RTC_CLK);             Wait(TWH);		XSBASE270_RTC_CLEARBIT(RTC_CLK);        Wait(TWL);    }}void write_4bits(char data){    write_nbits(data, 4);}char read_register(char address){    char ret;	    g_pGPIORegs->GPCR0 |= RTC_SDA;    XSBASE270_RTC_CLEARBIT(RTC_CLK);	    RTC_Enable();	    write_4bits(RTC_RD_MODE);    write_4bits(address);	    ret = read_4bits();	    RTC_Disable();	    return ret;}void read_register_close(void){    RTC_Disable();}void write_register(char address, char data){    g_pGPIORegs->GPCR0 |= RTC_SDA;    XSBASE270_RTC_CLEARBIT(RTC_CLK);	    RTC_Enable();	    write_4bits(RTC_WR_MODE);    write_4bits(address);    write_4bits(data);	    RTC_Disable();}void RTC4513GetRealTime(LPSYSTEMTIME lpst){		lpst->wYear      = read_register(RTC4513_Y1) + read_register(RTC4513_Y10) * 10 +2000; 	lpst->wMonth     = read_register(RTC4513_MO1)+ read_register(RTC4513_MO10) * 10 + 1; 	lpst->wDayOfWeek = read_register(RTC4513_W)-1;	lpst->wDay       = read_register(RTC4513_D1)+ read_register(RTC4513_D10) * 10 + 1 ;	lpst->wHour      = read_register(RTC4513_H1)+ read_register(RTC4513_H10) * 10;	lpst->wMinute    = read_register(RTC4513_MI1)+ read_register(RTC4513_MI10) * 10;	lpst->wSecond    = read_register(RTC4513_S1)+ read_register(RTC4513_S10) * 10;	lpst->wMilliseconds = 0;	#if 0	RETAILMSG(1,(TEXT("RTC4513GetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u \r\n"),		lpst->wYear, lpst->wMonth,lpst->wDay, lpst->wHour, lpst->wMinute,lpst->wSecond));#endif					return;}void RTC4513SetRealTime(LPSYSTEMTIME lpst){		lpst->wYear  = lpst->wYear % 100;	lpst->wDay  = lpst->wDay - 1;		lpst->wMonth  = lpst->wMonth - 1;				write_register(RTC4513_CF, 0x7);        // 24h, stop, reset	write_register(RTC4513_S1, lpst->wSecond%10);	write_register(RTC4513_S10, lpst->wSecond/10);	write_register(RTC4513_MI1, lpst->wMinute%10);	write_register(RTC4513_MI10, lpst->wMinute/10);	write_register(RTC4513_H1, lpst->wHour%10);	write_register(RTC4513_H10, lpst->wHour/10);	write_register(RTC4513_D1, lpst->wDay%10);	write_register(RTC4513_D10, lpst->wDay/10);	write_register(RTC4513_MO1, lpst->wMonth%10);	write_register(RTC4513_MO10, lpst->wMonth/10);	write_register(RTC4513_W,   lpst->wDayOfWeek+1);	write_register(RTC4513_Y1, (lpst->wYear ) %10);	write_register(RTC4513_Y10, (lpst->wYear )/10);	write_register(RTC4513_CF, 0x4);	// 24h	write_register(RTC4513_CD, 0x2);	// ADJ, IRQ-F, CAL/HW, HOLD		#if 0	RETAILMSG(1,(TEXT("RTC4513SetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u \r\n"),		lpst->wYear, lpst->wMonth,lpst->wDay, lpst->wHour, lpst->wMinute,lpst->wSecond));#endif			return;}	void RTC4513_Init(void){		
	g_pGPIORegs = (volatile BULVERDE_GPIO_REG *) OALPAtoVA(BULVERDE_BASE_REG_PA_GPIO, FALSE);
	g_pRTCBCRegs = (volatile UINT8 *) OALPAtoVA(0xa3ff0000, FALSE);
	g_pRTCRegs = (volatile UINT8 *) OALPAtoVA(0x10200000, FALSE);
	
	if(!g_pGPIORegs || !g_pRTCBCRegs ||!g_pRTCRegs)
	{
		RETAILMSG(1, (L"Error in Init RTC4513!\r\n"));
		return;
	}
//	RETAILMSG(1,(L"+++++++rtc init\r\n"));
	*g_pRTCBCRegs = 0;
//	RETAILMSG(1,(L"---------rtc init\r\n"));
	g_pGPIORegs->GAFR0_L &=~(0x000C0000);}

⌨️ 快捷键说明

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