![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Use of two timers to implement a counter of an external signal
Diff: Timer2.cpp
- Revision:
- 0:e619b6823668
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Timer2.cpp Tue Jan 28 17:01:19 2014 +0000 @@ -0,0 +1,53 @@ + +/* + This counter establishes the measurent interval. + MAT2.0 (P8) is set when the interval has elapsed. + + This code generates timed intervals T = <prescale> * 100 ms. + mbed pin 8 goes high at the beginning of the interval and returns to zero at the end. + The interrupt occurs at the end of the interval. +*/ +#include "TARGET_LPC1768/LPC17xx.h" +#include "mbed.h" +#include "Timer2.h" + +funcptr timer2ISR; + +void Timer2_IRQHandler(void) +{ + if (LPC_TIM2->IR & 1) // MR0 interrupt + { + LPC_TIM2->IR = 1; // clear the interrupt + if (timer2ISR) + timer2ISR(); + } +} + +void Timer2_init(funcptr callback) +{ + timer2ISR = callback; + LPC_SC->PCONP |= (1<<22); // Power on the Timer2 + LPC_SC->PCLKSEL1 &= ~(3<<12); + LPC_SC->PCLKSEL1 |= (1<<12); // Select CCLK for Timer2 + LPC_PINCON->PINSEL0 &=~(3<<12); + LPC_PINCON->PINSEL0 |= (3<<12); // Connect MAT2.0 to mbed P8 + LPC_PINCON->PINMODE0 &=~(3<<12); + LPC_PINCON->PINMODE0 |= (2<<12); // no pull-p or pull-down + if (callback) + { + NVIC_SetPriority(TIMER2_IRQn, 10); + NVIC_SetVector(TIMER2_IRQn, (uint32_t)&Timer2_IRQHandler); + NVIC_EnableIRQ(TIMER2_IRQn); + } +} +void Timer2_start(int prescale) +{ + LPC_TIM2->TCR = 2; // Reset the timer and prescale counters on next PCLK + LPC_TIM2->MR0 = CLOCK/10; // Set the Timer2 match register for 100 ms resolution + LPC_TIM2->CTCR = 0; // Timer2 is incremented when the prescale register == 0 + LPC_TIM2->PR = prescale; // Update prescale register + LPC_TIM2->MCR = 3; // Interrupt on MR0 and reset + LPC_TIM2->EMR = (3<<4)|1; // Toggle MAT2.0 when match occurs. + LPC_TIM2->TCR = 1; // Enable Timer2 + LPC_TIM3->TCR = 1; // Enable Timer3 +}