RIT (Repetitive Interrupt Timer) Library.
Dependents: ORTP-L_SensorTest ORTP-L_V01 ORTP-L_V01 RIT_Demo
Diff: RIT.h
- Revision:
- 0:af45bc81d34c
- Child:
- 3:682b29493aa0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RIT.h Fri Mar 11 10:24:47 2011 +0000 @@ -0,0 +1,151 @@ +/* mbed Repetitive Interrupt Timer Library + * Copyright (c) 2011 wvd_vegt + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef __RIT_h +#define __RIT_h + +#include "mbed.h" + +//veg: Copied parts BLDC's main.h and ADC_Full +//veg: Changed RIT_FREQ to 1ms default + +#define SYSCLK 96000000L +#define ONEMHZ 1000000L +#define RIT_FREQ 96*1000L +#define RIT_DIV (SYSCLK/RIT_FREQ)-1 + +/** Repetitive Interrupt Timer (RIT) class.<br/> +* <br/> +* Sample Code:<br/> +* <br/> +* DigitalOut rit_led(LED3); <br/> +* <br/> +* //Our function isr. <br/> +* void RIT_IRQHandler(void) { <br/> +* rit_led=!rit_led; // Flash a Led <br/> +* } <br/> +* <br/> +* RIT rit(1000); //Set interval to 1000 ms or 1 second. <br/> +* <br/> +* rit.append(RIT_IRQHandler); //Append our own function ISR. <br/> +* rit.enable(); <br/> +* <br/> +* wait(10); //wait 10 seconds (and watch the led flashing). <br/> +* <br/> +* rit.disable(); <br/> +* rit.unappend(); <br/> +*/ +class RIT { +public: + /** Constructor. + * + * @parm ms the number of milliseconds between two interrupts. + */ + RIT(uint32_t ms); + + /** Setup timing in ms. + * + * @parm ms the number of milliseconds between two interrupts. + */ + void setup_ms(uint32_t ms); + + /** Setup timing in us. + * + * @parm us the number of microseconds between two interrupts. + */ + void setup_us(uint32_t us); + + /** Attach custom interrupt handler replacing default. + * + * @parm fptr the new interrupt handler. + */ + void attach(void(*fptr)(void)); + + /** Restore default interrupt handler. + * + */ + void detach(void); + + /** Append function isr to global interrupt handler. + * + * @parm fptr the function isr to be called from within the default interrupt handler. + */ + void append(void(*fptr)(void)); + + /** Remove function isr from global interrupt handler. + * + */ + void unappend(); + + /** Enable RIT & Interrupt + * + */ + void enable(void); + + /** Disable RIT & Interrupt. + * + */ + void disable(void); + + /** Power up RIT. + * + */ + void power_enable(void); + + /** Power down RIT + * + * Note: Powering down might take some more effect when entering Deep Sleep, + * accoring to errata.lpc1768.pdf. + */ + void power_disable(void); + +private: + + /** There can only be one. + * + */ + static RIT *instance; + + /** Storage for an appended function isr. + * + */ + void(*_rit_g_isr)(void); + + /** The default (instance) isr. + * + * Note: this isr calls the static one so there is only be a single one. + */ + void ritisr(void); + + /** The actual (static) default isr. + * + */ + static void _ritisr(void); + + /** Select the Peripheral Clock (PCLK_RIT) for the RIT + * to be equal to the CCLK. + * + */ + void select_clk(void); +}; + +#endif \ No newline at end of file