Timer configuration problem LPC 1769

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Timer configuration problem LPC 1769

871 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Fabienvg on Wed Oct 09 08:41:48 MST 2013
Hello,

I'm really new to microcontrollers and I have problems with setting up a timer (timer 0 in my case)  and interrupt. For Example the prescaler, I think I didn't set it right. I want to set the prescaler to 1 ms. Is 1000-1 then right? I cannot imagine it works on only 1 Mhz. I think I made multiple mistakes in the basic configuration. Could anyone modify this to right code or help me out?

Thanks a lot

User manual LPC 1769: http://www.nxp.com/documents/user_manual/UM10360.pdf
Basic configuration Timer starts at page 490.

#defineTMR16B0TC  0x40004008
#define PCLKSEL0        0x400FC1A8
#define TMR16B0IR 0x40004000
#define TMR16B0TCR 0x40004004
#define TMR16B0PR 0x4000400C
#define TMR16B0MR0 0x40004018
#define TMR16B0MCR  0x40004014
#define TMR16B0CTCR 0x40004070
#define PCONP 0x400FC0C4
#define ISER0 0xE000E100

int* pCLKSEL0= (int*) PCLKSEL0;
int* tMR16B0TCR = (int*) TMR16B0TCR;
int* tMR16B0PR = (int*) TMR16B0PR;
int* tMR16B0MR0 = (int*) TMR16B0MR0;
int* tMR16B0MCR = (int*) TMR16B0MCR;
int* tMR16B0CTCR = (int*) TMR16B0CTCR;
int* tMR16B0IR = (int*) TMR16B0IR;
int* iSER0 = (int*) ISER1;
int* tMR16B0TC = (int*) TMR16B0TC;
int* pCONP = (int*) PCONP;

void (*timer_tmr_callback)();

void init()
{
*pCONP = 0x2;
*pCLKSEL0    = 0xC;
*tMR16B0TC   = 0x0;
*tMR16B0PR     = 1000 - 1;
*tMR16B0CTCR    = 0;

}

void timer_async_usec( unsigned int msec, void (*callback)())
{
timer_tmr_callback = callback;
*tMR16B0MR0    = msec;
*tMR16B0MCR        = 0x07;
*iSER0    = (1 << 1);
*tMR16B0TCR    = 0x2;
*tMR16B0TCR    = 0x1;
}

void (TIMER0_IRQHandler(void))
{
*tMR16B0IR = 0x1F;
timer_tmr_callback();
}
Labels (1)
0 Kudos
3 Replies

600 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by cfbsoftware on Thu Oct 10 05:07:22 MST 2013
Your PCLK speed for Timer0 is CCLK divided by 1, 2, 4 or 8 depending on the value in the PCLK_TIMER0 bits in the PCLKSEL0 register (see Table 40 and 42).

The value of CCLK depends on the PLL settings you have used in your clock configuration. You can find all of the relevant formulae in Chapter 4: LPC17xx Clocking and power control. As an example, the default Oberon initialisation code we use for development boards with a 12Mhz crystal as the clock source is:

 
NSEL := 0;
  CCLKSEL := 3;
  MSEL := 11;
  Fcco := (2 * 12000000 * (MSEL + 1)) DIV (NSEL + 1);
  CCLK := Fcco DIV (CCLKSEL + 1);
  PCLK := CCLK DIV 4;


That results in CCLK = 72Mhz and PCLK = 18Mhz
0 Kudos

600 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Fabienvg on Thu Oct 10 00:41:47 MST 2013
Thank you. Could you tell me what the PCLK speed is? I could not find it in the use manual. Do you mind taking a look?
0 Kudos

600 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by cfbsoftware on Wed Oct 09 14:31:46 MST 2013
If you want a delay of 1 msec then you should set the prescale register to (PCLK / 1000) - 1 where PCLK is your peripheral clock speed. Watch out for rounding / truncation issues if PCLK is not a multiple of 1000.
0 Kudos