6cc948eef8
git-svn-id: file:///srv/dev-disk-by-uuid-17e88007-4d0c-45e0-8757-cacfcc458630/repositories/svn/Diplomarbeit@113 9fe90eed-be63-e94b-8204-d34ff4c2ff93
164 lines
5.5 KiB
C
164 lines
5.5 KiB
C
/* ---------------------------------------------------------------------------
|
|
* rtc.c - v0.1 (c) 2007 Micro-key bv
|
|
* ---------------------------------------------------------------------------
|
|
* Micro-key bv
|
|
* Industrieweg 28, 9804 TG Noordhorn
|
|
* Postbus 92, 9800 AB Zuidhorn
|
|
* The Netherlands
|
|
* Tel: +31 594 503020
|
|
* Fax: +31 594 505825
|
|
* Email: support@microkey.nl
|
|
* Web: www.microkey.nl
|
|
* ---------------------------------------------------------------------------
|
|
* Description: Real time clock functionality
|
|
* ---------------------------------------------------------------------------
|
|
* Version(s): 0.1, 28-11-2007, fvds.
|
|
* Creation.
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* System include files
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
#include "LPC23xx.h"
|
|
#include "types.h"
|
|
|
|
/* FreeRTOS includes */
|
|
#include "FreeRTOS.h"
|
|
/* ---------------------------------------------------------------------------
|
|
* Application include files
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
#include "rtc.h"
|
|
#include "dio.h"
|
|
|
|
#include "BusProtocol.h"
|
|
/* ---------------------------------------------------------------------------
|
|
* Local constant and macro definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
#define IMSEC 0x00000001
|
|
#define IMMIN 0x00000002
|
|
#define IMHOUR 0x00000004
|
|
#define IMDOM 0x00000008
|
|
#define IMDOW 0x00000010
|
|
#define IMDOY 0x00000020
|
|
#define IMMON 0x00000040
|
|
#define IMYEAR 0x00000080
|
|
|
|
#define AMRSEC 0x00000001 /* Alarm mask for Seconds */
|
|
#define AMRMIN 0x00000002 /* Alarm mask for Minutes */
|
|
#define AMRHOUR 0x00000004 /* Alarm mask for Hours */
|
|
#define AMRDOM 0x00000008 /* Alarm mask for Day of Month */
|
|
#define AMRDOW 0x00000010 /* Alarm mask for Day of Week */
|
|
#define AMRDOY 0x00000020 /* Alarm mask for Day of Year */
|
|
#define AMRMON 0x00000040 /* Alarm mask for Month */
|
|
#define AMRYEAR 0x00000080 /* Alarm mask for Year */
|
|
|
|
#define PREINT_RTC 0x000001C8 /* Prescaler value, integer portion, PCLK = 15Mhz */
|
|
#define PREFRAC_RTC 0x000061C0 /* Prescaler value, fraction portion,PCLK = 15Mhz */
|
|
#define ILR_RTCCIF 0x01
|
|
#define ILR_RTCALF 0x02
|
|
|
|
#define CCR_CLKEN 0x01
|
|
#define CCR_CTCRST 0x02
|
|
#define CCR_CLKSRC 0x10
|
|
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Global variable definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
extern UINT32 interruptcounter;
|
|
/* ---------------------------------------------------------------------------
|
|
* Local variable definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
void rtcISR (void) __attribute__ ((naked));
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Local function definitions
|
|
* ---------------------------------------------------------------------------
|
|
*/
|
|
/** \brief Initialize RTC interface.*/
|
|
void rtcInit(void)
|
|
{
|
|
/*--- Initialize registers ---*/
|
|
RTC_AMR = 0;
|
|
RTC_CIIR = 0;
|
|
//RTC_CCR = 0;
|
|
//RTC_PREINT = PREINT_RTC;
|
|
//RTC_PREFRAC = PREFRAC_RTC;
|
|
|
|
RTC_CCR = (CCR_CLKEN | CCR_CLKSRC);
|
|
|
|
|
|
/* Enable RTC interrupt and register it to the VIC */
|
|
//portENTER_CRITICAL();
|
|
// {
|
|
// VICIntSelect &= ~(VIC_CHAN_TO_MASK(VIC_CHAN_NUM_RTC));
|
|
// VICIntEnClr = VIC_CHAN_TO_MASK(VIC_CHAN_NUM_RTC);
|
|
// VICVectAddr13 = (void *)rtcISR;
|
|
// VICVectCntl3 = 0x06;
|
|
// VICIntEnable = VIC_CHAN_TO_MASK(VIC_CHAN_NUM_RTC);
|
|
// }
|
|
//portEXIT_CRITICAL();
|
|
|
|
//RTC_CIIR |= 0x01; /* Enable Interrupt every Second */
|
|
//RTC_CISS = 0x80; /* Enable SubSecond Interrupt (488u)*/
|
|
|
|
}
|
|
|
|
/** \brief Read real time clock.*/
|
|
void rtcRead(t_rtc * time)
|
|
{
|
|
time->sec = RTC_SEC;
|
|
time->min = RTC_MIN;
|
|
time->hour = RTC_HOUR;
|
|
time->day = RTC_DOM;
|
|
time->dom = RTC_DOM;
|
|
time->dow = RTC_DOW;
|
|
time->doy = RTC_DOY;
|
|
time->mon = RTC_MONTH;
|
|
time->year = RTC_YEAR;
|
|
}
|
|
|
|
/** \brief Write to real time clock.*/
|
|
void rtcWrite(t_rtc * time)
|
|
{
|
|
RTC_SEC = time->sec;
|
|
RTC_MIN = time->min;
|
|
RTC_HOUR = time->hour;
|
|
RTC_DOM = time->day;
|
|
RTC_DOW = time->dow;
|
|
RTC_DOY = time->doy;
|
|
RTC_MONTH = time->mon;
|
|
RTC_YEAR = time->year;
|
|
}
|
|
// Alarms
|
|
|
|
|
|
/* RTC INTERRUPT SERVICE ROUTINE */
|
|
void rtcISR ()
|
|
{
|
|
portSAVE_CONTEXT(); /* Save context of interrupted task */
|
|
{
|
|
|
|
if (RTC_ILR & 0x01) /* Check for Seconds Interrupt */
|
|
{
|
|
RTC_ILR = 0x1; /* Clear Seconds Interrupt */
|
|
}
|
|
if (RTC_ILR & 0x04) /* Check for SubSecond Interrupt */
|
|
{
|
|
RTC_ILR = 0x4; /* Clear SubSeconds Interrupt */
|
|
}
|
|
|
|
VICVectAddr = 0x00000000; /* clear Interrupts from the VIC */
|
|
}
|
|
/* Restore the context of whichever task is going to run once the interrupt
|
|
* completes.
|
|
*/
|
|
portRESTORE_CONTEXT();
|
|
}
|