testrtc.c

来自「pxa270实时时钟的驱动代码」· C语言 代码 · 共 142 行

C
142
字号
#include <stdio.h>
#include "regsdef.h"
#include "utils.h"
#include "XsCp15.h"
#include "xsIntCtrlApi.h"

static volatile int ints;

static void RtcIrqHandler(void *dummy)
{
	UINT rtsr = RTSR;
	
	if(rtsr & (1<<0))	//AL
		ints |= 1;
	if(rtsr & (1<<4))	//RDAL1
		ints |= 2;
	if(rtsr & (1<<8))	//SWAL1
		ints |= 4;
	if(rtsr & (1<<13))	//PIAL
		ints |= 8;
	
	RTSR = rtsr;
}

static int TestTimerAlarm(void)
{
	UINT val, tm;
	
	val = RCNR + 2;
	RTAR  = val;
	RTSR |= (1<<2) | (1<<0);
	
	tm = 400;
	do {
		DM_WaitMs(10);
		tm--;
	} while(!(ints&1) && tm);
	RTSR &= ~(1<<2);
	
	return (tm!=0);
}

static int TestWristwatch(void)
{
	UINT tm;
	int i;
	
	RYCR = (2005<<9) | (11<<5) | (16);
	RDCR = (3<<20) | (4<<17) | (13<<12) | (30<<6) | (30);
	DM_WaitMs(100);
	printf("Current date: %d-%d-%d, time: %d:%d:%d\r\n",
			(RYCR>>9)&0xfff, (RYCR>>5)&0xf, RYCR&0x1f,
			(RDCR>>12)&0x1f, (RDCR>>6)&0x3f, RDCR&0x3f);
	
	RYAR1 = (2005<<9) | (11<<5) | (16);
	RDAR1 = (3<<20) | (4<<17) | (13<<12) | (30<<6) | (35);
	RTSR |= (1<<5) | (1<<4);
	
	for (i=0; i<5; i++)
	{
		tm = 100;
		do {
			DM_WaitMs(10);
			tm--;
		} while(!(ints&2) && tm);
		printf("Current date: %d-%d-%d, time: %d:%d:%d\r\n",
			(RYCR>>9)&0xfff, (RYCR>>5)&0xf, RYCR&0x1f,
			(RDCR>>12)&0x1f, (RDCR>>6)&0x3f, RDCR&0x3f);
	}
	RTSR &= ~(1<<5);
	return (tm!=0);
}

static int TestStopWatch(void)
{
	UINT tm;
	
	//RTSR &= ~(1<<12);
	SWAR1 = (0<<19) | (0<<13) | (2<<7) | 0;	//set 2 seconds and reset SWCR
	RTSR |= (1<<12) | (1<<9) | (1<<8);
	DM_WaitMs(10);
	printf("SWCR = 0x%08x\r\n", SWCR);
	
	tm = 400;
	do {
		DM_WaitMs(10);
		tm--;
	} while(!(ints&4) && tm);
	RTSR &= ~((1<<12) | (1<<9));
	
	printf("SWCR = 0x%08x\r\n", SWCR);
	
	return (tm!=0);
}

static int TestPeriodic(void)
{
	UINT tm;
	
	//RTSR &= ~(1<<15);
	PIAR = 2000;	//set 2 seconds and reset RTCPICR
	RTSR |= (1<<15) | (1<<14) | (1<<13);
	DM_WaitMs(1);
	printf("PICR = 0x%08x\r\n", RTCPICR);
	
	tm = 4000;
	do {
		DM_WaitMs(1);
		tm--;
	} while(!(ints&8) && tm);
	RTSR &= ~((1<<15) | (1<<14));
	
	printf("PICR = 0x%08x\r\n", RTCPICR);
	
	return (tm!=0);
}

void TestRtc(void)
{
	ints = 0;
	
	if(XsIcRegisterHandler (XSIC_RTC_ALRM_SGNL, RtcIrqHandler, 0)) {
		printf("Register RTC interrupt handler error!\r\n");
		return ;
	}

	XsIcEnableIrqDeviceInt(XSIC_RTC_ALRM_SGNL);
		
	printf("Test RTC timer...\r\n");
	printf("%s\r\n", TestTimerAlarm() ? "success" : "fail");
	printf("Test wristwatch...\r\n");
	printf("%s\r\n", TestWristwatch() ? "success" : "fail");
	printf("Test stop watch...\r\n");
	printf("%s\r\n", TestStopWatch() ? "success" : "fail");
	printf("Test periodic...\r\n");
	printf("%s\r\n", TestPeriodic() ? "success" : "fail");	

	XsIcDisableIrqDeviceInt(XSIC_RTC_ALRM_SGNL);
	XsIcUnRegisterHandler (XSIC_RTC_ALRM_SGNL);
//	return 0;
}

⌨️ 快捷键说明

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