Use of two timers to implement a counter of an external signal

Dependencies:   mbed

Revision:
0:e619b6823668
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Timer3.cpp	Tue Jan 28 17:01:19 2014 +0000
@@ -0,0 +1,41 @@
+
+// Timer 3 is used by mbed library functions: Ticker, Timer, Wait
+
+#include "TARGET_LPC1768/LPC17xx.h"
+#include "mbed.h"
+#include "Timer3.h"
+
+funcptr3 timer3ISR;
+
+void Timer3_IRQHandler(void)
+{
+#define ICR0    (1<<5)              // CR0 interrupt bit
+int count; 
+    if (LPC_TIM3->IR & ICR0)
+    {
+        count = LPC_TIM3->TC;
+        LPC_TIM3->TCR = 2;         // Disable
+        LPC_TIM3->IR = ICR0;       // clear the interrupt
+        timer3ISR(count);          // return the count
+    }
+}
+
+void Timer3_init(funcptr3 callback)
+{
+    timer3ISR = callback;
+    LPC_SC->PCONP |= (1<<23);           // Power on the Timer3
+    LPC_TIM3->TCR = 2;                  // Reset the timer and prescale counters on next PCLK
+    LPC_SC->PCLKSEL1 &= ~(3<<14);
+    LPC_SC->PCLKSEL1 |= (1<<14);        // Select  CCLK for Timer3
+    LPC_PINCON->PINSEL1 |= (3<<16)|(3<<14);     // Connect CAP3.0 to P15, CAP3.1 to P16
+    LPC_PINCON->PINMODE1 &=~((3<<16)|(3<<14));
+    LPC_PINCON->PINMODE1 |= (2<<16)|(2<<14);    // no pull-p or pull-down
+    LPC_TIM3->CTCR = 1;                 // TC incremented by CAP3.0 (P15) rising edge
+    LPC_TIM3->PR = 0;                   // Set prescale register to zero
+    LPC_TIM3->CCR = 0x30;              // Capture on CAP3.1 (P16) falling edge and interrupt
+    NVIC_SetPriority(TIMER3_IRQn, 9);
+    NVIC_SetVector(TIMER3_IRQn, (uint32_t)&Timer3_IRQHandler);
+    NVIC_EnableIRQ(TIMER3_IRQn);
+    LPC_TIM3->TCR = 2;                  // Disable
+}
+