Никак не могу заставить заработать прерывания на LPC 2294. Под JTAGом они работают, но как только перезапускаю микроконтроллер - работать перестают. С помощью того же JTAGа установил, что после рестарта в регистре MEMMAP записана 3 вместо 1 и команды выполняться не хотят, т.е. микроконтроллер не видит даже startup.
Вот код начальной инициализации
MODULE ?cstartup
;; Forward declaration of sections.
SECTION IRQ_STACK:DATA:NOROOT(3)
SECTION FIQ_STACK:DATA:NOROOT(3)
SECTION ABT_STACK:DATA:NOROOT(3)
SECTION SVC_STACK:DATA:NOROOT(3)
SECTION UND_STACK:DATA:NOROOT(3)
SECTION CSTACK:DATA:NOROOT(3)
;
; The module in this file are included in the libraries, and may be
; replaced by any user-defined modules that define the PUBLIC symbol
; __iar_program_start or a user defined start symbol.
;
; To override the cstartup defined in the library, simply add your
; modified version to the workbench project.
SECTION .intvec:CODE:NOROOT(2)
PUBLIC __vector
PUBLIC __vector_0x14
PUBLIC __iar_program_start
EXTERN irq_handler,fiq_handler
ARM
__vector:
ldr pc,[pc,#+24] ;; Reset 00 PC = PC+0x18 = 0x8+0x18 = 0x20
B . ;; Undefined instructions 04
B . ;; Software interrupt (SWI/SVC) 08
B . ;; Prefetch abort 0c
B . ;; Data abort 10
__vector_0x14:
DC32 0 ;; RESERVED 14
ldr pc,[pc,#+24] ;; IRQ 18 PC = PC+0x8+0x18 = 0x18+0x8+0x18 = 0x38
ldr pc,[pc,#+24] ;; FIQ 1c PC = 0x8+0x1c+0x18 = 3c
DC32 __iar_program_start ;; Reset 20
DC32 0 ;; Undefined instructions 24
DC32 0 ;; Software interrupt (SWI/SVC) 28
DC32 0 ;; Prefetch abort 2c
DC32 0 ;; Data abort 30
DC32 0 ;; RESERVED 34
DC32 irq_handler ;; IRQ 38
DC32 fiq_handler ;; FIQ 3c
; --------------------------------------------------
; ?cstartup -- low-level system initialization code.
;
; After a reser execution starts here, the mode is ARM, supervisor
; with interrupts disabled.
;
SECTION .text:CODE:NOROOT(2)
; PUBLIC ?cstartup
EXTERN ?main
REQUIRE __vector
ARM
__iar_program_start:
?cstartup:
А вот обработчик прерывания
// IRQ exception handler. Calls the interrupt handlers.
__irq __arm void irq_handler(void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.
VICVectAddr = 0; // Clear interrupt in VIC.
}
Что я делаю не так, может быть есть какие-то ошибки в коде?