|
-
-
-
- #ifndef __INTERVALTIMER_H__
- #define __INTERVALTIMER_H__
-
- #include <stdint.h>
- #include "mk20dx128.h"
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- class IntervalTimer {
- private:
- typedef void (*ISR)();
- typedef volatile uint32_t* reg;
- enum {TIMER_OFF, TIMER_PIT};
- static const uint8_t NUM_PIT = 4;
- static const uint32_t MAX_PERIOD = UINT32_MAX / (F_BUS / 1000000.0);
- static void enable_PIT();
- static void disable_PIT();
- static bool PIT_enabled;
- static bool PIT_used[NUM_PIT];
- bool allocate_PIT(uint32_t newValue);
- void start_PIT(uint32_t newValue);
- void stop_PIT();
- bool status;
- uint8_t PIT_id;
- reg PIT_LDVAL;
- reg PIT_TCTRL;
- uint8_t IRQ_PIT_CH;
- ISR myISR;
- bool beginCycles(ISR newISR, uint32_t cycles);
- public:
- IntervalTimer() { status = TIMER_OFF; }
- ~IntervalTimer() { end(); }
- bool begin(ISR newISR, unsigned int newPeriod) {
- if (newPeriod == 0 || newPeriod > MAX_PERIOD) return false;
- uint32_t newValue = (F_BUS / 1000000) * newPeriod - 1;
- return beginCycles(newISR, newValue);
- }
- bool begin(ISR newISR, int newPeriod) {
- if (newPeriod < 0) return false;
- return begin(newISR, (unsigned int)newPeriod);
- }
- bool begin(ISR newISR, unsigned long newPeriod) {
- return begin(newISR, (unsigned int)newPeriod);
- }
- bool begin(ISR newISR, long newPeriod) {
- return begin(newISR, (int)newPeriod);
- }
- bool begin(ISR newISR, float newPeriod) {
- if (newPeriod <= 0 || newPeriod > MAX_PERIOD) return false;
- uint32_t newValue = (float)(F_BUS / 1000000) * newPeriod + 0.5;
- if (newValue < 40) return false;
- return beginCycles(newISR, newValue);
- }
- bool begin(ISR newISR, double newPeriod) {
- return begin(newISR, (float)newPeriod);
- }
- void end();
- static ISR PIT_ISR[NUM_PIT];
- };
-
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
|