ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
2 июля
325268
Xim73 (25.04.2012 19:10, просмотров: 1022)
Никак не могу заставить заработать прерывания на 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. } Что я делаю не так, может быть есть какие-то ошибки в коде?