Weird thing is going on here.
I have LPC1788 board and I just started writing a simple application. If I initialize timer like this, code seems to be executed, but of course my timer interrupt is not called.
void initTimer (void) { LPC_TIM_TypeDef *timer = LPC_TIM1; LPC_SC->PCONP |= (0x1<<2); timer->TC = 0x00; //Clear Timer Counter timer->PR = 0x00; //No prescaler timer->MCR = 0x3; //enable interrupt timer->MR0 = 0x02710; //interrupt every 1ms //NVIC_EnableIRQ(TIMER1_IRQn); timer->TCR = 0x02; //reset timer timer->TCR = 0x01; //enable timer counter } void TIMER1_IRQHandler(void) { LPC_TIM1->IR = (1u<<0); // Reset the MR0 Interrupt; Writing a zero has no effect. decrementFlags(); }
As soon as I enable NVIC IRQ, my code crash and points to Default_Handler PROC in startup.s. Deducing R15(PC) with -8 and use U 0xXXX, I end up in SVC_Handler part. My Timer1_IRQ never got called.
There is really nothing going on in the code besides this. As I just started writing program and hit the wall...
Any idea what else could I try, to debug this ?
Thanks.
extern "C" void TIMER0_IRQHandler(void)
Good call.
If compiling for C++, then the compiler will add name mangling of external C++ symbols as a means to type-safe linking.
But C++ name mangling means the external symbol name of the interrupt handler will not match the name that the assembler file expects - the startup code is written to match the symbol names of a C program.
I was wondering when one of you oiks would think of that.
"I was wondering when one of you oiks would think of that."
It took quite a time before this thread got this sentence: "It is the .cpp file."
The original post did not show any C++ code and no file name or file extension was named. But the OP did get the suggestion to verify that the name of the handler actually matched the name expected by the startup file.
It can be quite hard to guess all important information the thread starters tends to forget to mention, while assuming it isn't relevant.