С прерываниями там очень хитро Самы надежный и дубовый вариант перопределить irq_handler описанный в стартапе
void irq_handler(void) __attribute__((naked));
void irq_handler(void){
asm("stmfd sp!, {r0-r12, lr}");
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr;
interrupt_function = (void(*)())vector;
(*interrupt_function)();
VICVectAddr = 0;
asm("ldmfd sp!, {r0-r12, lr}");
asm("subs pc, lr, #4");
}
В отладчике все видно.Так нужно по описанию делать, типа в каком то месте он сам разруливает по твоим IRQ
static void timer0ISR(void) __attribute__ ((interrupt ("IRQ")));
Саое интересное , что этот пример у меня работает. Но когда я начал в своем проекте так делать, то не захотело. Надо где-то по установкам проекта полазить, может выключить пустышку irq_handler в стартапе. Не стал разбираться.