|
-
-
- #ifndef __INTERVALTIMER_H__
- #define __INTERVALTIMER_H__
-
- #include <stddef.h>
- #include "imxrt.h"
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- class IntervalTimer {
- private:
- static const uint32_t MAX_PERIOD = UINT32_MAX / (24000000 / 1000000);
- public:
- constexpr IntervalTimer() {
- }
- ~IntervalTimer() {
- end();
- }
- bool begin(void (*funct)(), unsigned int microseconds) {
- if (microseconds == 0 || microseconds > MAX_PERIOD) return false;
- uint32_t cycles = (24000000 / 1000000) * microseconds - 1;
- if (cycles < 17) return false;
- return beginCycles(funct, cycles);
- }
- bool begin(void (*funct)(), int microseconds) {
- if (microseconds < 0) return false;
- return begin(funct, (unsigned int)microseconds);
- }
- bool begin(void (*funct)(), unsigned long microseconds) {
- return begin(funct, (unsigned int)microseconds);
- }
- bool begin(void (*funct)(), long microseconds) {
- return begin(funct, (int)microseconds);
- }
- bool begin(void (*funct)(), float microseconds) {
- if (microseconds <= 0 || microseconds > MAX_PERIOD) return false;
- uint32_t cycles = (float)(24000000 / 1000000) * microseconds - 0.5f;
- if (cycles < 17) return false;
- return beginCycles(funct, cycles);
- }
- bool begin(void (*funct)(), double microseconds) {
- return begin(funct, (float)microseconds);
- }
- void update(unsigned int microseconds) {
- if (microseconds == 0 || microseconds > MAX_PERIOD) return;
- uint32_t cycles = (24000000 / 1000000) * microseconds - 1;
- if (cycles < 17) return;
- if (channel) channel->LDVAL = cycles;
- }
- void update(int microseconds) {
- if (microseconds < 0) return;
- return update((unsigned int)microseconds);
- }
- void update(unsigned long microseconds) {
- return update((unsigned int)microseconds);
- }
- void update(long microseconds) {
- return update((int)microseconds);
- }
- void update(float microseconds) {
- if (microseconds <= 0 || microseconds > MAX_PERIOD) return;
- uint32_t cycles = (float)(24000000 / 1000000) * microseconds - 0.5f;
- if (cycles < 17) return;
- if (channel) channel->LDVAL = cycles;
- }
- void update(double microseconds) {
- return update((float)microseconds);
- }
- void end();
- void priority(uint8_t n) {
- nvic_priority = n;
- if (channel) {
- int index = channel - IMXRT_PIT_CHANNELS;
- nvic_priorites[index] = nvic_priority;
- uint8_t top_priority = nvic_priorites[0];
- for (uint8_t i=1; i < (sizeof(nvic_priorites)/sizeof(nvic_priorites[0])); i++) {
- if (top_priority > nvic_priorites[i]) top_priority = nvic_priorites[i];
- }
- NVIC_SET_PRIORITY(IRQ_PIT, top_priority);
- }
- }
- operator IRQ_NUMBER_t() {
- if (channel) {
- return IRQ_PIT;
- }
- return (IRQ_NUMBER_t)NVIC_NUM_INTERRUPTS;
- }
- private:
-
- IMXRT_PIT_CHANNEL_t *channel = nullptr;
- uint8_t nvic_priority = 128;
- static uint8_t nvic_priorites[4];
- bool beginCycles(void (*funct)(), uint32_t cycles);
-
- };
-
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
|