|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
-
-
- #include "IntervalTimer.h"
-
- static void dummy_funct(void);
-
- #if defined(KINETISK)
- #define NUM_CHANNELS 4
- static void (*funct_table[4])(void) = {dummy_funct, dummy_funct, dummy_funct, dummy_funct};
-
- #elif defined(KINETISL)
- #define NUM_CHANNELS 2
- static void (*funct_table[2])(void) = {dummy_funct, dummy_funct};
- uint8_t IntervalTimer::nvic_priorites[2] = {255, 255};
- #endif
-
-
- bool IntervalTimer::beginCycles(void (*funct)(), uint32_t cycles)
- {
- if (channel) {
- channel->TCTRL = 0;
- channel->TFLG = 1;
- } else {
- SIM_SCGC6 |= SIM_SCGC6_PIT;
- __asm__ volatile("nop");
- PIT_MCR = 1;
- channel = KINETISK_PIT_CHANNELS;
- while (1) {
- if (channel->TCTRL == 0) break;
- if (++channel >= KINETISK_PIT_CHANNELS + NUM_CHANNELS) {
- channel = NULL;
- return false;
- }
- }
- }
- int index = channel - KINETISK_PIT_CHANNELS;
- funct_table[index] = funct;
- channel->LDVAL = cycles;
- channel->TCTRL = 3;
- #if defined(KINETISK)
- NVIC_SET_PRIORITY(IRQ_PIT_CH0 + index, nvic_priority);
- NVIC_ENABLE_IRQ(IRQ_PIT_CH0 + index);
- #elif defined(KINETISL)
- nvic_priorites[index] = nvic_priority;
- if (nvic_priorites[0] <= nvic_priorites[1]) {
- NVIC_SET_PRIORITY(IRQ_PIT, nvic_priorites[0]);
- } else {
- NVIC_SET_PRIORITY(IRQ_PIT, nvic_priorites[1]);
- }
- NVIC_ENABLE_IRQ(IRQ_PIT);
- #endif
- return true;
- }
-
-
- void IntervalTimer::end() {
- if (channel) {
- int index = channel - KINETISK_PIT_CHANNELS;
- #if defined(KINETISK)
- NVIC_DISABLE_IRQ(IRQ_PIT_CH0 + index);
- #elif defined(KINETISL)
-
- #endif
- funct_table[index] = dummy_funct;
- channel->TCTRL = 0;
- #if defined(KINETISL)
- nvic_priorites[index] = 255;
- if (nvic_priorites[0] <= nvic_priorites[1]) {
- NVIC_SET_PRIORITY(IRQ_PIT, nvic_priorites[0]);
- } else {
- NVIC_SET_PRIORITY(IRQ_PIT, nvic_priorites[1]);
- }
- #endif
- channel = 0;
- }
- }
-
-
- #if defined(KINETISK)
- void pit0_isr()
- {
- PIT_TFLG0 = 1;
- funct_table[0]();
- }
-
- void pit1_isr() {
- PIT_TFLG1 = 1;
- funct_table[1]();
- }
-
- void pit2_isr() {
- PIT_TFLG2 = 1;
- funct_table[2]();
- }
-
- void pit3_isr() {
- PIT_TFLG3 = 1;
- funct_table[3]();
- }
-
- #elif defined(KINETISL)
- void pit_isr() {
- if (PIT_TFLG0) {
- PIT_TFLG0 = 1;
- funct_table[0]();
- }
- if (PIT_TFLG1) {
- PIT_TFLG1 = 1;
- funct_table[1]();
- }
- }
- #endif
-
- static void dummy_funct(void)
- {
- }
-
|