attilio rossi

TPM channel on K27

Discussion created by attilio rossi on Nov 24, 2019
Latest reply on Nov 26, 2019 by attilio rossi

Good morning.

I'd like to use the TPM counter and its channel for some timing uses.

Prescale must be set at 128, so with a 24 mhz of bus clock I have 187, 5 Khz for tpm clock.

One channel (..ch2) must be set to get an interrupt break at every 1ms. I write the simple code that I use now.

It works properly for just 250 ms. After that, the TPM0 interrupt it does not work anymore and the output is fixed at one.

I don't understand this behavior. Probably something is missing in my code.

Look at CH2

Thanks in advance.

Attilio

 

 

#define        TPM_CHANNEL_0                0                                    // tpm channel 0 mask
#define        TPM_CHANNEL_1                1                                    // tpm channel 1 mask
#define        TPM_CHANNEL_2                2                                    // tpm channel 2 mask
#define        TPM_CHANNEL_3                3                                    // tpm channel 3 mask
#define        TPM_CHANNEL_4                4                                    // tpm channel 4 mask
#define        TPM_CHANNEL_5                5                                    // tpm channel 5 mask

 

#define        TPM_CH0_FLAG                0x01                                // channel 0 event flag
#define        TPM_CH1_FLAG                0x02                                // channel 1 event flag
#define        TPM_CH2_FLAG                0x04                                // channel 2 event flag
#define        TPM_CH3_FLAG                0x08                                // channel 3 event flag
#define        TPM_CH4_FLAG                0x10                                // channel 4 event flag
#define        TPM_CH5_FLAG                0x20                                // channel 5 event flag

 

#define        TPM_OVERFLOW_COUNTER        0x100                                // overflow counter flag

 

 

This the init function

void InitTimers(void)
{

 

    SIM->SCGC6 |= SIM_SCGC6_TPM0_MASK;                                           // clock gating
    SIM->SOPT2 |= SIM_SOPT2_TPMSRC(0x10);                                         // tpm clock source

 

    TPM0->SC  = TPM_SC_PS(0x07)    |                                                        // prescaler divide 0x07 = 128 times
                           TPM_SC_CMOD(0x01);                                                        // tpm increment every tpm counter clock

 

    TPM0->MOD = 46750;                                                                               // timer period

 

    // CHANNEL 2 SETTING
    TPM0->CONTROLS[TPM_CHANNEL_2].CnV  = 23375;                     // first int. after ~125ms
    TPM0->CONTROLS[TPM_CHANNEL_2].CnSC = (OUT_COMPARE_TOGGLE + TPM_CnSC_CHIE_MASK);        

 

    PORTA->PCR[5] = PORT_PCR_MUX(ALTERNATE_FUNCTION_3);      // PTA5 wired to out

 

    ConnectInterruptToCortex(TPM0_IRQn);                                                 // set TPM0 interrupt
}

 

 

This the interrupt

void TPM0_IRQHandler(void)
{
    UINT32     status;
    UINT32   l;

 

    status = TPM0->STATUS;

 

    // OVERFLOW
    if(status & TPM_OVERFLOW_COUNTER)
    {
    }

 

    // CH0
    if(status & TPM_CH0_FLAG)
    {
    }

 

    // CH1
    if(status & TPM_CH1_FLAG)
    {
    }

 

 

 

    // CH2
    if(status & TPM_CH2_FLAG)
    {
        l = TPM0->CNT;
        l = l + 376;
        l = l % 65535;

 

        TPM0->CONTROLS[TPM_CHANNEL_2].CnV = (UINT16)l;
    }

 

 

 


    // CH3
    if(status & TPM_CH3_FLAG)
    {
    }

 

    // CH4
    if(status & TPM_CH4_FLAG)
    {
    }

 

    // CH5
    if(status & TPM_CH5_FLAG)
    {
    }

 

    TPM0->STATUS |= status;

 

}

Outcomes