Hi,
I slightly modified the code.
/* Interrupt routine to determine period of tested signal */
void FTM0_Ch0_Ch1_IRQHandler(void) 
{
  period[counter] = FTM0->CONTROLS[0].CnV - temp;
  temp = FTM0->CONTROLS[0].CnV;
  FTM0->CONTROLS[0].CnSC &= ~FTM_CnSC_CHF_MASK; // clear channel flag
  counter++;
  if((counter) == 20){
    FTM1->SC = 0;
  }
}The results:
Since
FTM1->MOD = FTM_MOD_MOD(11200 - 1); // Set Modulo (10kHz PWM frequency @112MHz system clock)the result seems to be correct.
Regards,
Daniel
I created a new project in order to allow you to compile it. I attached it below.
Yes, it is triggering and the counter is working ok, but i don't know why i can't get the results.
/*
 * main implementation: use this 'C' sample to create your own application
 *
 */
#include "S32K144.h" /* include peripheral declarations S32K144 */
uint32_t temp, counter, FTM0_CH0_period;
/* Transmit from RUN mode to HSRUN mode */
void HSRUN_Init()
{
 SMC->PMPROT=SMC_PMPROT_AHSRUN_MASK // Allows High Speed Run
 |SMC_PMPROT_AVLP_MASK; // Allows Very Low Power Modes
 SMC->PMCTRL=SMC_PMCTRL_RUNM(3); // Entry to High Speed Run
 /* Wait for High Speed Run mode */
 while(SMC->PMSTAT != SMC_PMSTAT_PMSTAT(128))
 {
 }
}
/* System oscillator and HSRUN configuration */
void SCG_Init()
{
 /* SOSC Configuration
 * OSC_OUT = 8MHz, 8MHz EXTAL */
SCG->SOSCDIV=SCG_SOSCDIV_SOSCDIV1(1) // System OSC DIV1=1
 |SCG_SOSCDIV_SOSCDIV2(1); // System OSC DIV2=1
 SCG->SOSCCFG=SCG_SOSCCFG_RANGE(2) // Medium frequency range OSC 1-8MHz
 |SCG_SOSCCFG_EREFS(1); // Select internal OSC
 while(SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK); // Wait for SOSCCSR unlocked state
 SCG->SOSCCSR=SCG_SOSCCSR_SOSCEN_MASK; // Enable OSC
 // | SCG_SOSCCSR_SOSCLPEN_MASK // Enable OSC in very low power modes
 while(!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)); // Wait for OSC enabling and valid output
/* SPLL Configuration
 * PLL_OUT = 112MHz, 8MHz EXTAL */
SCG->SPLLDIV=SCG_SPLLDIV_SPLLDIV1(1) // PLL DIV1=1
 |SCG_SPLLDIV_SPLLDIV2(1); // PLL DIV2=1
 SCG->SPLLCFG=SCG_SPLLCFG_PREDIV(0) // PLL PREDIV=0
 |SCG_SPLLCFG_MULT(12); // PLL MULT=28
 while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK); // Wait for SPLLCSR unlocked state
 SCG->SPLLCSR=SCG_SPLLCSR_SPLLEN_MASK; // Enable PLL
 while(!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK)); // Wait for PLL enabling and valid output
/* HCCR Configuration
 * PLL_OUT = 112MHz, 8MHz EXTAL */
SCG->HCCR=SCG_HCCR_SCS(6) // PLL source clock
 |SCG_HCCR_DIVCORE(0) // DIVCORE=1, Core=112MHz
 |SCG_HCCR_DIVBUS(1) // DIVBUS=2, BUS=56MHz
 |SCG_HCCR_DIVSLOW(3); // DIVSLOW=4, Flash=28MHz
}
/* FTM1 is initialized to generate signals for Single-Edge Capture Mode of FTM0
 * and Dual-Edge Capture Mode of FTM0 */
void Signals_Generator()
{
 /* Enable clock for FTM1 */
 PCC->PCCn[PCC_FTM1_INDEX] = PCC_PCCn_PCS(6) | PCC_PCCn_CGC_MASK;
 /* Enable clock for PORTB */
 PCC->PCCn[PCC_PORTB_INDEX] = PCC_PCCn_CGC_MASK;
 /* Enable clock for PORTC */
 PCC->PCCn[PCC_PORTD_INDEX] = PCC_PCCn_CGC_MASK;
PORTB->PCR[2] = PORT_PCR_MUX(2); // Set PTB2 for FTM1 – Channel0
 PORTB->PCR[3] = PORT_PCR_MUX(2); // Set PTB3 for FTM1 – Channel1
 PORTD->PCR[8] = PORT_PCR_MUX(6); // Set PTD8 for FTM1 – Channel4
 PORTD->PCR[9] = PORT_PCR_MUX(6); // Set PTD9 for FTM1 – Channel5
FTM1->CONTROLS[0].CnSC=FTM_CnSC_MSB_MASK|FTM_CnSC_ELSB_MASK; // Select high-true pulses
 FTM1->CONTROLS[1].CnSC=FTM_CnSC_MSB_MASK|FTM_CnSC_ELSB_MASK; // Select high-true pulses
 FTM1->CONTROLS[4].CnSC=FTM_CnSC_MSB_MASK|FTM_CnSC_ELSB_MASK; // Select high-true pulses
 FTM1->CONTROLS[5].CnSC=FTM_CnSC_MSB_MASK|FTM_CnSC_ELSB_MASK; // Select high-true pulses
 FTM1->MOD = FTM_MOD_MOD(11200 - 1); // Set Modulo (10kHz PWM frequency @112MHz system clock)
 FTM1->CONTROLS[0].CnV=FTM_CnV_VAL(2800); // Set channel Value
 FTM1->CONTROLS[1].CnV=FTM_CnV_VAL(5600); // Set channel Value
 FTM1->CONTROLS[4].CnV=FTM_CnV_VAL(1000); // Set channel Value
 FTM1->CONTROLS[5].CnV=FTM_CnV_VAL(5600); // Set channel Value
 FTM1->CNT = 0; // Counter reset
 FTM1->SC|=FTM_SC_CLKS(1)|FTM_SC_PWMEN0_MASK|FTM_SC_PWMEN1_MASK|FTM_SC_PWMEN4_MASK
 |FTM_SC_PWMEN5_MASK; // Select clock and enable PWM
}
/* SW=4 - Single-Edge Capture Mode */
void FTM0_Single_Edge_Capture_Mode()
{
 /* Enable clock for PORTD */
 PCC->PCCn[PCC_PORTD_INDEX] = PCC_PCCn_CGC_MASK;
 /* Select and enable clock for FTM0 */
 PCC->PCCn[PCC_FTM0_INDEX] = PCC_PCCn_PCS(6) | PCC_PCCn_CGC_MASK;
PORTD->PCR[15] = PORT_PCR_MUX(2); // Set PTD15 for FTM0 - Channel0
 S32_NVIC->ICPR[99 / 32] = 1 << (99 % 32); /* IRQ48-FTM0 ch0: clr any pending IRQ*/
 S32_NVIC->ISER[99 / 32] = (1 << (99 % 32)); // Enable FTM0 interrupt
/* Input capture mode sensitive on rising edge to measure period of tested signal */
 FTM0->CONTROLS[0].CnSC = 0x48u; //Falling edge 0x48u; Rising FTM_CnSC_ELSA_MASK | FTM_CnSC_CHIE_MASK (Enable Interrupt)
 //Rising or Falling 0x4Cu (Enable interrupt 0x40u);
 /* Reset counter */
 FTM0->CNT = 0;
 /* Select clock */
 FTM0->SC = FTM_SC_CLKS(1);
}
void WDOG_disable (void) {
 WDOG->CNT=0xD928C520; /* Unlock watchdog */
 WDOG->TOVAL=0x0000FFFF; /* Maximum timeout value */
 WDOG->CS = 0x00002100; /* Disable watchdog */
 }
int main(void)
{
WDOG_disable();
 SCG_Init();
 HSRUN_Init();
 /* Single-Edge Capture Mode */
Signals_Generator();
 FTM0_Single_Edge_Capture_Mode();
for(;;);
}
void FTM0_IRQHandler() { /* Interrupt routine to determine period of tested signal */
 counter++;
 FTM0_CH0_period = FTM0->CONTROLS[0].CnV - temp; // Period calculation
 temp = FTM0_CH0_period + temp; // Save C0V value into the variable
 FTM0->CONTROLS[0].CnSC &= ~FTM_CnSC_CHF_MASK; // clear channel flag
}
Hi,
I slightly modified the code.
/* Interrupt routine to determine period of tested signal */
void FTM0_Ch0_Ch1_IRQHandler(void) 
{
  period[counter] = FTM0->CONTROLS[0].CnV - temp;
  temp = FTM0->CONTROLS[0].CnV;
  FTM0->CONTROLS[0].CnSC &= ~FTM_CnSC_CHF_MASK; // clear channel flag
  counter++;
  if((counter) == 20){
    FTM1->SC = 0;
  }
}The results:
Since
FTM1->MOD = FTM_MOD_MOD(11200 - 1); // Set Modulo (10kHz PWM frequency @112MHz system clock)the result seems to be correct.
Regards,
Daniel