123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)
- #include "TeensyStepFTM.h"
- #include "config.h"
- namespace TeensyStepFTM
- {
- namespace
- {
- bool isConfigured = false;
- IDelayHandler *callbacks[maxChannel];
- }
- void begin()
- {
- if (!isConfigured)
- {
- if (USE_TIMER == TIMER_TPM1)
- {
- SIM_SCGC2 |= SIM_SCGC2_TPM1;
- SIM_SOPT2 |= SIM_SOPT2_TPMSRC(2);
- }
- else if (USE_TIMER == TIMER_TPM2)
- {
- SIM_SCGC2 |= SIM_SCGC2_TPM2;
- SIM_SOPT2 |= SIM_SOPT2_TPMSRC(2);
- }
-
- timer->SC = FTM_SC_CLKS(0b00);
- timer->MOD = 0xFFFF;
- for (unsigned i = 0; i < maxChannel; i++)
- {
- if (isFTM)
- {
- timer->CH[i].SC &= ~FTM_CSC_CHF;
- }
- else
- {
- timer->CH[i].SC |= FTM_CSC_CHF;
- }
- timer->CH[i].SC &= ~FTM_CSC_CHIE;
- timer->CH[i].SC = FTM_CSC_MSA;
-
- }
- timer->SC = FTM_SC_CLKS(0b01) | FTM_SC_PS(prescale);
- NVIC_ENABLE_IRQ(irq);
- isConfigured = true;
- }
- }
- unsigned addDelayChannel(IDelayHandler *handler)
- {
- for (unsigned ch = 0; ch < maxChannel; ch++)
- {
- if (callbacks[ch] == 0)
- {
- callbacks[ch] = handler;
- return ch;
- }
- }
- return maxChannel;
- }
- void removeDelayChannel(unsigned chNr)
- {
- if (chNr < maxChannel)
- {
- noInterrupts();
- timer->CH[chNr].SC &= ~FTM_CSC_CHIE;
- callbacks[chNr] = nullptr;
- interrupts();
- }
- }
- }
- using namespace TeensyStepFTM;
- #if USE_TIMER == TIMER_FTM0
- void ftm0_isr(void)
- #elif USE_TIMER == TIMER_FTM1
- void ftm1_isr(void)
- #elif USE_TIMER == TIMER_FTM2
- void ftm2_isr(void)
- #elif USE_TIMER == TIMER_FTM3
- void ftm3_isr(void)
- #elif USE_TIMER == TIMER_TPM1
- void tpm1_isr(void)
- #elif USE_TIMER == TIMER_TPM2
- void tpm2_isr(void)
- #endif
- {
- for (unsigned i = 0; i < maxChannel; i++)
- {
- if ((timer->CH[i].SC & (FTM_CSC_CHIE | FTM_CSC_CHF)) == (FTM_CSC_CHIE | FTM_CSC_CHF))
- {
- timer->CH[i].SC &= ~FTM_CSC_CHIE;
- callbacks[i]->delayISR(i);
- }
- }
- }
- #endif
|