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!
TimerCapture.h
- Committer:
- dishbreak
- Date:
- 2015-05-21
- Revision:
- 2:7c4ca945bfe1
- Parent:
- 1:660af7d3c416
- Child:
- 3:4c06a8b54655
File content as of revision 2:7c4ca945bfe1:
#ifndef TIMERCAPTURE_H #define TIMERCAPTURE_H #include "mbed.h" /** Directive that will toggle debug output via `printf`. Set to 1 to enable, 0 to disable. */ #define DEBUG 0 /** A class that will start TIMER2 on the LPC1768 and configure it to use one of the two capture pins (p29 or p30). * Capture pins allow the hardware to "timestamp" when a pin goes high or low, depending on the configuration. For more information, consult the * <a href="http://www.nxp.com/documents/user_manual/UM10360.pdf">LPC1768 user manual</a>. * <h2>Example</h2> * @code * #include "mbed.h" * #include "TimerCapture.h" * * Serial pc(USBTX, USBRX); * TimerCapture * capture; * * void handleInput() { * pc.getc(); // clear the interrupt handler. * printf("Capture register reads: %d\r\n", capture->getTime()); * } * * int main() { * pc.printf("Timer Capture Program Starting\r\n"); * TimerCapture::startTimer(); * capture = new TimerCapture(p29); * pc.attach(&handleInput); * } * @endcode * * @attention Because this code operates directly on TIMER2, it has the potential to (a) mess with existing code or (b) cause errors when you instantiate too many objects. * Make sure to read this documentation thoroughly, else you may find yourself staring at <a href="https://developer.mbed.org/handbook/Debugging#runtime-errors">lights of death</a>! */ class TimerCapture { public: /** Configures registers to use the given pin as a capture pin. * Initializes an object that will configure and read from a capture pin. * If the timer is not already running, it will get configured. * * @attention *There are only two pins that will act as capture pins for TIMER2.* These are P0.4 (DIP p30) and P0.5(DIP p29). * * @warning This will cause a runtime error if: *<ul> * <li>The `capture_pin` is not set to an actual capture pin on the LPC1768. * <li>The specified capture pin is already in use (i.e. already configured). * <li>The timer hasn't yet been started (i.e. peripheral is off) *</ul> * @param pCapturePin The PinName intended to be used for the capture. */ TimerCapture(PinName pCapturePin); /** Get the time captured by the capture pin's register. * @return Time in miliseconds since the timer got started. */ uint32_t getTime(); /** Starts the TIMER2 timer, and configures it if it's not already configured. */ static void startTimer(); /** Checks if the TIMER2 timer is running. * @return True if the timer is running, false otherwise. */ static bool isRunning(); /** Stops the TIMER2 timer. */ static void stopTimer(); /** Resets the TIMER2 timer. * @attention This will also clear both timer registers. You've been warned! */ static void resetTimer(); private: PinName mCapturePin; static bool timerStarted; static void configureTimer(); }; #endif