RTC example on ARM7 LPC2148 using WinARM

Finally got my LPC2148 RTC working on my development board. arm7 base development board for lpc2148

I am quite new to ARM microcontrollers, so I managed to make few tests using them by driving some peripherals and writing some test routines. First code I tried was simple LED blink program first lpc2148 arm7 microcontroller test led blink

This one is running microcontrollers real time clock (RTC) and generating interrupts every second. When Interrupt occurs microcontroller sends particular message to UART that I could see via Terminal program.

The main program:

/******************************************************************************

*

* WinARM RTC application

*

* - UART0 send in Interrupt-Mode

* - Sends message every seccond.

* - RTC interupt every second

******************************************************************************/

#include “types.h”

#include “LPC214x.h”

#include “config.h”

#include “armVIC.h”

#include “uart.h”

uint32_t time_toggle=0;

static void rtc0(void) __attribute__ ((interrupt (”IRQ”)));

static void lowInit(void)

{

// set PLL multiplier & divisor.

// values computed from config.h

PLLCFG = PLLCFG_MSEL | PLLCFG_PSEL;

// enable PLL

PLLCON = PLLCON_PLLE;

PLLFEED = 0xAA; // Make it happen. These two updates

PLLFEED = 0×55; // MUST occur in sequence.

// setup the parallel port pin

IO0CLR = PIO0_ZERO_BITS; // clear the ZEROs output

IO0SET = PIO0_ONE_BITS; // set the ONEs output

IO0DIR = PIO0_OUTPUT_BITS; // set the output bit direction

IO1CLR = PIO1_ZERO_BITS; // clear the ZEROs output

IO1SET = PIO1_ONE_BITS; // set the ONEs output

IO1DIR = PIO1_OUTPUT_BITS; // set the output bit direction

// wait for PLL lock

while (!(PLLSTAT & PLLSTAT_LOCK))

continue;

// enable & connect PLL

PLLCON = PLLCON_PLLE | PLLCON_PLLC;

PLLFEED = 0xAA; // Make it happen. These two updates

PLLFEED = 0×55; // MUST occur in sequence.

// setup & enable the MAM

MAMTIM = MAMTIM_CYCLES;

MAMCR = MAMCR_FULL;

// set the peripheral bus speed

// value computed from config.h

VPBDIV = VPBDIV_VALUE; // set the peripheral bus clock speed

}

static void sysInit(void)

{

lowInit(); // setup clocks and processor port pins

// set the interrupt controller defaults

#if defined(RAM_RUN)

MEMMAP = MEMMAP_SRAM; // map interrupt vectors space into SRAM

#elif defined(ROM_RUN)

MEMMAP = MEMMAP_FLASH; // map interrupt vectors space into FLASH

#else

#error RUN_MODE not defined!

#endif

VICIntEnClear = 0xFFFFFFFF; // clear all interrupts

VICIntSelect = 0×00000000; // clear all FIQ selections

VICDefVectAddr = (uint32_t)reset; // point unvectored IRQs to reset()

// wdtInit(); // initialize the watchdog timer

initSysTime(); // initialize the system timer

uart0Init(UART_BAUD(HOST_BAUD), UART_8N1, UART_FIFO_8); // setup the UART

}

/*************************************************************/

void rtc0(void)

{

if (time_toggle==0)

{

uart0Puts(”\n\rTic\r\n”);//Tic Tac output to UART0

time_toggle=1;

}

else

{

uart0Puts(”\n\rTac\r\n”);

time_toggle=0;

}

ILR |= 1; // Clear interrupt flag

VICVectAddr = 0; // Acknowledge Interrupt

PCON = 1; // IDLE mode

}

void init_rtc(void)

{

ILR = 3; // Disable 32′768 interrupt

CCR = 0×11; // Clock enable + 32′767Hz quartz enable

CIIR = 0×01; // Interupt every second

VICVectAddr1 = (unsigned long)rtc0; // set interrupt vector in 1

VICVectCntl1 = 0×0000002D; // use it for RTC Interrupt

VICIntEnable = 0×00002000; // Enable RTC Interrupt

}

void set_time(void)

{

YEAR = 2006; // Year

MONTH = 5; // Month

DOM = 23; // Day of month

DOY = 38; // Day of year

DOW = 143; // Day of week

HOUR = 23; // Hours

MIN = 14; // Minutes

SEC = 30; // Seconds

}

int main(void)

{

uint32_t startTime;

sysInit();

#if defined(UART0_TX_INT_MODE) || defined(UART0_RX_INT_MODE)

enableIRQ();

#endif

uart0Puts(”\n\rRTC interupts every second\r\n”);

startTime = getSysTICs();

init_rtc();

set_time();

for (;;) {

} // for

return 0;

}

And zipped project files:RTC clock example on ERM7 LPC2148 using WinARM

Blogsphere: TechnoratiFeedsterBloglines
Bookmark: Del.icio.usSpurlFurlSimpyBlinkDigg
RSS feed for comments on this post
 |  TrackBack URI for this post

New on WinAVR Tutorial
Running TX433 and RX433 RF modules with AVR microcontrollers,
Sometimes in embedded design you may want to go wireless. Might be you will want to log various readi …
Programming AVR ADC module with WinAVR,
Most of AVR microcontrollers have Analog to Digital Converter (ADC) integrated in to chip. Such solut …
New on WinARM Tutorial
What are differences between WinARM and WinAVR,
Everyone who is working with AVR microcontrollers knows this powerful tool – WinAVR (http://win …
LPC2000 watchdog timer,
As in all microcontrollers watchdog timers purpose isto reset microcontroller after reasonable amount …

One Response to “RTC example on ARM7 LPC2148 using WinARM”

  1. Sumit Bhatnagar Says:

    My objective is to use the Olimex LPC2148 Header board shown here:
    http://www.sparkfun.com/commerce/product_info.php?products_id=676

    Issue is how to use the UART. I have currently written a led blinking program for this board. How can I test out the UART on this board/use hyperterm

Leave a Reply