Library to simplify using capture pins on hardware.
When I first started experimenting with the notion of capture pins, I had no idea where to begin. Rather than write to registers in every single program, I decided to create a class that'd handle that heavy lifting for me!
Import library
Public Member Functions |
|
TimerCapture (PinName pCapturePin) | |
Configures registers to use the given pin as a capture pin.
|
|
uint32_t | getTime () |
Get the time captured by the capture pin's register.
|
|
Static Public Member Functions |
|
static void | startTimer () |
Starts the TIMER2 timer, and configures it if it's not already configured.
|
|
static bool | isRunning () |
Checks if the TIMER2 timer is running.
|
|
static void | stopTimer () |
Stops the TIMER2 timer.
|
|
static void | resetTimer () |
Resets the TIMER2 timer.
|
This code uses TIMER2 on the LPC1768. I have no idea if it will work on other hardware, but I hope it helps someone else!
Diff: TimerCapture.cpp
- Revision:
- 0:94cfc6ceec2f
- Child:
- 2:7c4ca945bfe1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TimerCapture.cpp Thu May 21 08:04:03 2015 +0000 @@ -0,0 +1,116 @@ +#include "TimerCapture.h" + +bool TimerCapture::timerStarted = false; + +TimerCapture::TimerCapture(PinName pCapturePin) { + uint8_t bitcount_pinselect = 0; + uint8_t bitcount_capture_control = 0; + + #if DEBUG + printf("Entering ctor\r\n"); + #endif + + switch (pCapturePin) { + case p30: + bitcount_pinselect = 8; + bitcount_capture_control = 0; + break; + case p29: + bitcount_pinselect = 10; + bitcount_capture_control = 3; + break; + default: + error("TimerCapture: Invalid pin specified! Pick either p29 (P0.5) or p30 (p0.4)."); + break; + } + + #if DEBUG + printf("Bitcounts selected: %d (pinselect) %d (capture control)\r\n", bitcount_pinselect, bitcount_capture_control); + #endif + + uint32_t bitmask_pinselect = (0x3 << bitcount_pinselect); + mCapturePin = pCapturePin; + + // error out if the pin is already configured. + if (LPC_PINCON->PINSEL0 & bitmask_pinselect == bitmask_pinselect) { + error("TimerCapture: Pin is already configured!"); + } + + #if DEBUG + printf("OK to configure registers\r\n"); + #endif + + // configure the pin + LPC_PINCON->PINSEL0 |= bitmask_pinselect; + + #if DEBUG + printf("Configuring rising edge. Register is %08x\r\n", LPC_TIM2->CCR); + #endif + + // store on rising edge of input + LPC_TIM2->CCR |= (1 << bitcount_capture_control); + + #if DEBUG + printf("Leaving ctor\r\n"); + #endif +} + +void TimerCapture::startTimer() { + if (!timerStarted) { + timerStarted = true; + + configureTimer(); + + //start timer + LPC_TIM2->TCR = 1; + } +} + +void TimerCapture::stopTimer() { + timerStarted = false; + //stop timer + LPC_TIM2->TCR = 0; +} + +bool TimerCapture::isRunning() { + return timerStarted; +} + +void TimerCapture::resetTimer() { + //reset timer + LPC_TIM2->TCR = 2; + LPC_TIM2->TCR = 0; + LPC_TIM2->CR0 = 0; + LPC_TIM2->CR1 = 0; +} + +uint32_t TimerCapture::getTime() { + uint32_t observedTime = 0; + switch(mCapturePin) { + case p30: + observedTime = LPC_TIM2->CR0; + break; + case p29: + observedTime = LPC_TIM2->CR1; + break; + default: + observedTime = 0; + break; + } + + return observedTime; +} + +void TimerCapture::configureTimer() { + // Power on Peripheral TIMER2 + LPC_SC->PCONP |= (1 << 22); + + // Set clock source for TIMER2 + uint8_t clockSel = 0x01; + LPC_SC->PCLKSEL1 |= (clockSel << 12); + + // Set prescaler counter + LPC_TIM2->PR = 100000; //should increment once a milisecond. + +} + \ No newline at end of file