LPC1768: RTC Programming
In this tutorial we will be discussing about the internal RTC of LPC1768. We will see what are the different registers associated with the RTC but we will mainly focus on basics registers required to use RTC. Later we will see how to use Explore Embedded library for RTC.
Contents
RTC Registers
The RTC includes a number of registers. We will concentrate some of the basic required registers.
Register | Description |
CCR | Clock Control Register |
Consolidated Time Registers | |
CTIME 0 | Consolidated Time Register 0 |
CTIME 1 | Consolidated Time Register 1 |
CTIME 2 | Consolidated Time Register 2 |
Time Counter Registers | |
SEC | Seconds Counter |
MIN | Minutes Register |
HOUR | Hours Register |
DOM | Day of Month Register |
DOW | Day of Week Register |
DOY | Day of Year Register |
MONTH | Months Register |
YEAR | Years Register |
CALIBRATION | Calibration value Register |
RTC Register Configuration
Lets see how to configure these registers.
CCR | ||||
31:5 | 4 | 3:2 | 1 | 0 |
- | CCALEN | - | CTCRST | CLKEN |
CCR ( Clock Control Register )
The Clock Control Register register controls the operation of the clock divide circuit.
Bit 0 – CLKEN : Clock Enable
This bit is written with one to enable time counters and written with zero to disable time counters.
Bit 1 - CTCRST : CTC Reset
When this bit is set to one, the internal oscillator divider are reset.
Bit 3:2 - Reserved
These bits must be set to zero for normal RTC operation.
Bit 4 - CCALEN : Calibration counter enable
To disable calibration counter and reset it to zero, write one to this bit.
When written zero, the counter is enabled and starts counting
Bit 31:5 - Reserved
Time Counter Register
The time value consists of the eight counters and there is separate register associated with each counter. To update the RTC, new values should be written to these registers.
Time Counter Registers | |||
Register | Description | Minimum Value | Maximum Value |
SEC | Seconds value | 0 | 59 |
MIN | Minutes value | 0 | 59 |
HOUR | Hours value | 0 | 23 |
DOM | Day of Month value | 1 | 28,29,30 or 31(depending on the month) |
DOW | Day of Week value | 0 | 6 |
DOY | Day of Year value | 1 | 365 (366 for Leap Year) |
MONTH | Month value | 1 | 12 |
YEAR | Year value | 0 | 4095 |
Consolidated Time Registers
The values of the Time Counters can optionally be read in a consolidated format which allows the programmer to read all time counters with only three read operations.
There are 3 Consolidated Time Registers. The minimum and maximum values of the various fields in these registers are same as the respective Time Counter Register.
These registers are read only. New values should be written to Time Counter Registers.
Consolidated Time Register 0 ( CTIME0 ) | |||||||
31:27 | 26:24 | 23:21 | 20:16 | 15:14 | 13:8 | 7:6 | 5:0 |
Reserved | Day of Week | Reserved | Hours | Reserved | Minute | Reserved | Second |
Consolidated Time Register 1 ( CTIME1 ) | |||||
31:27 | 27:16 | 15:12 | 11:8 | 7:5 | 4:0 |
Reserved | Year | Reserved | Month | Reserved | Day of Month |
Consolidated Time Register 2 ( CTIME2 ) | |
31:12 | 11:0 |
Reserved | Day of Year |
Steps for Using RTC
Initialize RTC
- Disable RTC clock using CCR ( Clock Control Register )
- Reset clock using CCR register
- Enable RTC calibration in RTC Calibration Register
- Enable the clock for RTC using CCR register
Set Date and Time
As we saw previously, there are separate Time Counter registers for each time parameter hour, min, sec and same is the case date. We just need to copy the required values to these registers.
Read Date and Time
The values of date and time can be read from associated Time Counter registers. Alternately, date and time can also be read from Consolidated Time registers.
We will use Time Counter registers for both reading and writing.
Code Example
Example 1
In this example we will see how to use lpc1768 inbuilt RTC. The time and date will be displayed continuously on 2x16 LCD.
#include <lpc17xx.h> //Device specific header file | |
#include "lcd.h" // Explore Embedded LCD library | |
/* bit position of CCR register */ | |
#define SBIT_CLKEN 0 /* RTC Clock Enable*/ | |
#define SBIT_CTCRST 1 /* RTC Clock Reset */ | |
#define SBIT_CCALEN 4 /* RTC Calibration counter enable */ | |
int main() | |
{ | |
uint16_t year; | |
uint8_t hour, min, sec, date, month; | |
SystemInit(); //Clock and PLL configuration | |
/* Setup/Map the controller pins for LCD operation | |
RS RW EN D0 D1 D2 D3 D4 D5 D6 D7 (P_NC: Not Connected)*/ | |
LCD_SetUp(P2_0,P2_1,P2_2,P_NC,P_NC,P_NC,P_NC,P1_24,P1_25,P1_26,P1_27); | |
/* Specify the LCD type(2x16) for initialization*/ | |
LCD_Init(2,16); | |
/* Disable RTC clock, reset clock, Enable RTC calibration */ | |
LPC_RTC->CCR = ((1 << SBIT_CTCRST ) | (1 << SBIT_CCALEN)); | |
LPC_RTC->CALIBRATION = 0x00; | |
LPC_RTC->CCR = (1 << SBIT_CLKEN); /* Enable the clock for RTC */ | |
/* Set Date and Time only once, comment these lines after setting the time and date */ | |
// Set Date 14th Nov 2015 | |
LPC_RTC->DOM = 14; // Update date value | |
LPC_RTC->MONTH = 11; // Update month value | |
LPC_RTC->YEAR = 2015; // Update year value | |
// Set Time 10:40:25 AM | |
LPC_RTC->HOUR = 10; // Update hour value | |
LPC_RTC->MIN = 40; // Update min value | |
LPC_RTC->SEC = 25; // Update sec value | |
while (1) | |
{ | |
/* Read Time */ | |
hour = LPC_RTC->HOUR; | |
min = LPC_RTC->MIN; | |
sec = LPC_RTC->SEC; | |
/* Read Date */ | |
date = LPC_RTC->DOM; | |
month = LPC_RTC->MONTH; | |
year = LPC_RTC->YEAR; | |
/* Display date and time on LCD */ | |
LCD_GoToLine(0); /* Go to First line of 2x16 LCD */ | |
LCD_Printf("Time: %2d:%2d:%2d",hour,min,sec); | |
LCD_GoToLine(1); /* Go to Second line of 2x16 LCD */ | |
LCD_Printf("Date: %2d/%2d/%4u",date,month,year); | |
} | |
} |
Using Explore Embedded Libraries
Now we will discuss how to use Explore Embedded Libraries for LPC1768 inbuilt RTC. Refer the LCD tutorial for interfacing the 2x16 lcd.
#include <LPC17xx.h> | |
#include "rtc.h" | |
#include "lcd.h" | |
int main() | |
{ | |
rtc_t rtc; | |
SystemInit(); | |
/*Connect RS RW EN D0 D1 D2 D3 D4 D5 D6 D7 (P_NC: Not Connected)*/ | |
LCD_SetUp(P2_0,P2_1,P2_2,P_NC,P_NC,P_NC,P_NC,P1_24,P1_25,P1_26,P1_27); | |
LCD_Init(2,16); | |
RTC_Init(); | |
rtc.hour = 10; // 10:40:20 am | |
rtc.min = 40; | |
rtc.sec = 0; | |
rtc.date = 1; //1st Jan 2016 | |
rtc.month = 1; | |
rtc.year = 2016; | |
rtc.weekDay = 5; // Friday: 5th day of week considering monday as first day. | |
/*##### Set the time and Date only once. Once the Time and Date is set, comment these lines | |
and reflash the code. Else the time will be set every time the controller is reset*/ | |
RTC_SetDateTime(&rtc); // 10:40:20 am, 1st Jan 2016 | |
/* Display the Time and Date continuously */ | |
while(1) | |
{ | |
RTC_GetDateTime(&rtc); | |
LCD_GoToLine(0); | |
LCD_Printf("time:%2d:%2d:%2d \nDate:%2d/%2d/%4d",(uint16_t)rtc.hour,(uint16_t)rtc.min,(uint16_t)rtc.sec,(uint16_t)rtc.date,(uint16_t)rtc.month,(uint16_t)rtc.year); | |
} | |
} |
Connection
Do the connections as shown the below image and flash the compiled code.
Downloads
Download the complete project folder from the below link:
https://codeload.github.com/ExploreEmbedded/Explore-Cortex-M3-LPC1768-Stick-DVB-14001/zip/master