Timer 2 Capture Help

17 Nov 2011

Hello! I am new to mbed programming, and I have an issue with my code that I can't figure out. I am working on making a time-to-digital converter that measures the time between two TTL pulses accurately. I'd like to use Timer2's capture feature for exact timing, with CAP2.0 = mbed pin 30, and CAP2.1 = MBED pin 29. Here is my code:

void TIMER2_IRQHandler(void)
{
    uint32_t clocks1 = LPC_TIM2->CR0;
    uint32_t clocks2 = LPC_TIM2->CR1;
    
    if(clocks2 > clocks1)
        pc.printf("%d ns \n\r", (clocks2 - clocks1)*CLOCKS_TO_SECONDS);
        
    if(clocks2 < clocks1)   // timer has overflowed and restarted before second pulse came in
        pc.printf("%d ns \n\r", ((MAX_INT32 - clocks1) + clocks2)*CLOCKS_TO_SECONDS);

    LPC_TIM2->IR |= 0xFFFFFFFF;     // clear Timer2 interrupt register
}

int main()
{
//    LPC_PINCON->PINSEL0  |= 0x00000180; // set P0.4 to CAP2.0 (BREAKS CODE!!)
    LPC_PINCON->PINSEL0  |= 0x00000600; // set P0.5 to CAP2.1
    LPC_PINCON->PINMODE0 |= 0x00000500; // set P0.4 and P0.5 to have neither pull-up nor pull-down resistors

    pc.baud(115200);    // init serial
    pc.printf("Press 'b' to begin capture, 'e' to end...\n\r");
    NVIC_SetVector(TIMER2_IRQn, uint32_t(TIMER2_IRQHandler));
    
    // init Timer 2 (cap2.0 = DIP30, cap2.1 = DIP29)
    LPC_SC->PCONP |= (1 << 22);         // Timer2 power on
    LPC_SC->PCLKSEL1 |= (1 << 12);      // Divide CCLK by 1 for Timer2
    LPC_TIM2->TC = 0;                   // clear timer counter
    LPC_TIM2->PC = 0;                   // clear prescale counter
    LPC_TIM2->PR = 0;                   // clear prescale register
    LPC_TIM2->TCR |= (1 << 1);          // reset timer
    LPC_TIM2->TCR &= ~(1 << 1);         // release reset
    LPC_TIM2->IR = 0xFFFFFFFF;          // clear interrupt register
    LPC_TIM2->CCR |= 0x00000029;        // enable cap2.0 and cap2.1 rising-edge capture; interrupt on cap2.1
    LPC_TIM2->TCR |= (1 << 0);          // start Timer2
    
    pc.printf("Setup complete.\n\r");
    
    while(1)
    {
        char command = pc.getc();
        
        switch(command)
        {
            case 'B': case 'b':     // case: Begin
                pc.printf("Starting capture...\n\r");
                NVIC_DisableIRQ(TIMER3_IRQn);
                NVIC_EnableIRQ(TIMER2_IRQn);
                break;
            case 'E': case 'e':     // case: End
                NVIC_DisableIRQ(TIMER2_IRQn);
                NVIC_EnableIRQ(TIMER3_IRQn);
                pc.printf("Capture ended.\n\r");
                break;
        }
    }
}

As noted in the comments in the code, setting P0.4 to CAP2.0 causes the program to hang somewhere between the "Setup complete" statement and the getc() call. Moreover, even without CAP2.0 set up, I can't get an interrupt to trigger on CAP2.1. I have no idea how to go about fixing these problems; any help would be greatly appreciated. Thanks!

10 Dec 2011

should be 0x300