Hi I am using uVision 3 and i have written a source code to enable Timer Counter 0 interrupt in at91sam7x256. My program compiles successfully and debugger starts well until TC0 interrupt occurs. It jumps suddenly to address 0x00000018 and so show me the very famous keil error message: no execute/read permission I have tried my projects RAM.ini file memory map in debuuger settings and so on. but the problem is not that the place my code is stored there or the place in memory that debugger starts from. The problem is that when Interrupt occurs debugger jumps to a memory space that is not address of my interrupt routine. This is my code:
#include <AT91SAM7X256.H> /* #include <lib_AT91SAM7X256.h> #define AIC_SVR_TC0IP AT91C_AIC_PRIOR_HIGHEST void mainTimer_isr () __irq{ timer++; AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); } int main (void) { // Enable the Clock of the PIO AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA); AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOB); AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC0); //* Disable the interrupt on the interrupt controller AT91C_BASE_AIC->AIC_IDCR = 0x1 << AT91C_ID_TC0 ; //* Save the interrupt handler routine pointer and the interrupt priority AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned int) mainTimer_isr ; /*This address stored well in SVR register. the address is like 0x001000840 but debugger didn't jumped to it. It jumps to address 0x00000018 all the time:( */ //* Store the Source Mode Register AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_HIGH_LEVEL | AIC_SVR_TC0IP ; //* Clear the interrupt on the interrupt controller AT91C_BASE_AIC->AIC_ICCR = 0x1 << AT91C_ID_TC0 ; AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_TC0); AT91C_BASE_TCB->TCB_BCR=0; AT91C_BASE_TC0->TC_CMR=AT91C_TC_CLKS_TIMER_DIV1_CLOCK|AT91C_TC_WAVE; AT91C_BASE_TC0->TC_CCR=5; AT91C_BASE_TC0->TC_IER=AT91C_TC_CPAS; AT91C_BASE_TC0->TC_RA=0x002C; }
Do you know why debugger jumps to 0x00000018 like this? How could I solve that? Thanks a lot.
Do you know why debugger jumps to 0x00000018 like this?
Yes. If you read the chapter in the datasheet of the chip about the AIC and interrupt handling in general, you will know why, too. And you should definitely read this chapter yourself if you plan to use interrupts on this chip.
In short: Jumping to 0x00000018 is normal behavior during interrupt handling for an AT91SAM7S, and if this causes problems with your program, then your program is at fault.
How could I solve that?
You read the appropriate chapter in the datasheet of the chip and change your program accordingly. If _any_ interrupt occurs, the uC will first jump to 0x00000018. The code that jumps to the appropriate interrupt handler, or a more elaborate interrupt vectoring mechanism, must be placed there. A detailed description can be found, as already mentioned, in the datasheet.
If you have any questions after you have read the chapter, feel free to ask them here.
Jumping to 0x00000018 is normal behavior during interrupt handling for an AT91SAM7S,
(and for an AT91SAM7X, too, since it has the same AIC).