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!
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:
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!