CMT timer test based on teensy 3 IRremote lib. 50us interrupt or khz carrier

Dependencies:   mbed

main.cpp

Committer:
manitou
Date:
2016-04-20
Revision:
0:0d9b39b610c5

File content as of revision 0:0d9b39b610c5:

// check pwm and 50us values for IRremote  IRremoteInt.h
// CMT timer ch 39,  pin pg 196  CMT_IRO PTD7  on 2x4 RF header
// derived from teensy 3 IRremote lib
// https://forum.pjrc.com/threads/26331-IRRemote-issues?p=52316&viewfull=1#post52316

#include "mbed.h"

static uint32_t khz=40, CMT_PPS_VAL, fbus=60000000, cmd2=30, cmd4=19;
DigitalOut led(LED1);

volatile uint32_t ticks;

extern "C" void CMT_IRQHandler() {
     uint8_t tmp = CMT_MSC;  // reset interrupt
     CMT_CMD2 = 30; 
     led = !led; 
     ticks++;
}

//  ref 39.7.3.1  30+1+19 = 50us period
void init1() {
    SIM_SCGC4 |= (1<<SIM_SCGC4_CMT_SHIFT);
    CMT_PPS = CMT_PPS_VAL;    // 8 mhz
    CMT_CGH1 = 1;
    CMT_CGL1 = 1;
    CMT_CMD1 = 0;
    CMT_CMD2 = cmd2;    // mark low down counter  8-bit
    CMT_CMD3 = 0;
    CMT_CMD4 = cmd4;    // space low  period  8-bit
    CMT_OC = 0;
    CMT_MSC = 0x03;     // enable CMT and interrupt
    NVIC_EnableIRQ(CMT_IRQn);
}

void init_pwm(int khz) {
    SIM_SCGC4 |= (1<<SIM_SCGC4_CMT_SHIFT);
    SIM_SOPT2 |= (1 << SIM_SOPT2_PTD7PAD_SHIFT);   // drive strength
    CMT_PPS = CMT_PPS_VAL;    // 8 mhz
    CMT_CGH1 = 2667 / khz;    // high time  30% duty  8-bit  ticks*.125us
    CMT_CGL1 = 5333 / khz;    // low time
    CMT_CMD1 = 0;
    CMT_CMD2 = cmd2;              // no effect
    CMT_CMD3 = 0;
    CMT_CMD4 = 0;               // space low
    CMT_OC = 0x60;     // enable IRO
    CMT_MSC = 0x01; // enable

    SIM_SCGC5 |= (1 << SIM_SCGC5_PORTD_SHIFT);  // power PORTD
    PORTD_PCR7 = PORT_PCR_MUX(2)|(1<< PORT_PCR_DSE_SHIFT)|(1 << PORT_PCR_SRE_SHIFT);
}

main() {
  // get F_BUS freq
  fbus = SystemCoreClock / (((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV2_MASK) >> SIM_CLKDIV1_OUTDIV2_SHIFT) + 1);
  printf("\nSystemCoreClock %d  bus %d  %s %s\n",SystemCoreClock,fbus,__TIME__,__DATE__);
  if (fbus == 48000000) CMT_PPS_VAL = 5 ;
  else if (fbus == 24000000)CMT_PPS_VAL = 2 ;
  else if (fbus == 16000000) CMT_PPS_VAL= 1 ;
  else if (fbus ==  8000000)CMT_PPS_VAL = 0 ;
  else if (fbus == 56000000)CMT_PPS_VAL = 6 ;
  else if (fbus == 36000000) { CMT_PPS_VAL = 3 ; cmd4=25; khz=(32*khz)/36; }
  else if (fbus == 60000000) { CMT_PPS_VAL = 6 ; cmd4=23; khz = (56*khz)/60; }
  else if (fbus ==  4000000) { CMT_PPS_VAL = 0 ; cmd2=5;  khz=2*khz; }
  else if (fbus ==  2000000) { CMT_PPS_VAL = 0 ; cmd2=5; cmd4=7; khz=4*khz; }


#if 1
  init_pwm(khz);    // pwm freq in khz
  while(true) {
      led= !led;
      wait(1.0);
  }
#else
    init1();      // 50us interrupts
    while(true) {
        printf("ticks %d\n",ticks);
        wait(2.);
    }
#endif
}