EugenB2 0 11 августа, 2010 Опубликовано 11 августа, 2010 · Жалоба Да. Точно. За основу то взял пример стандартный... Когда не знаешь, да еще и забудешь.. таких делов можно наворотить. =P И все-таки после брейкпоинта прерывания иногда умирают. Хотя флаги в AIC_IPR и AIC_IMR стоят. CPSR_I=0. Ну ладно, это не критично - отлажусь на осциллографе и консоли. Еще раз стандартный startup посмотреть надо, там была ошибка, не восстанавливались флаги после выхода из прерывания. IRQ_Handler_Entry: ;- Manage Exception Entry ;- Adjust and save LR_irq in IRQ stack sub lr, lr, #4 stmfd sp!, {lr} ;- Save and r0 in IRQ stack stmfd sp!, {r0} mrs r0, spsr stmdb sp!,{r0} ; Save the context of the current task. !!!!!! ;- Write in the IVR to support Protect Mode ;- No effect in Normal Mode ;- De-assert the NIRQ and clear the source in Protect Mode ldr r14, =AT91C_BASE_AIC ldr r0 , [r14, #AIC_IVR] str r14, [r14, #AIC_IVR] ;- Enable Interrupt and Switch in Supervisor Mode msr CPSR_c, #ARM_MODE_SVC ;- Save scratch/used registers and LR in User Stack stmfd sp!, { r1-r11, r12, r14} ;- Branch to the routine pointed by the AIC_IVR mov r14, pc bx r0 ;- Restore scratch/used registers and LR from User Stack ldmia sp!, { r1-r11, r12, r14} ;- Disable Interrupt and switch back in IRQ mode msr CPSR_c, #I_BIT | ARM_MODE_IRQ ;- Mark the End of Interrupt on the AIC ldr r14, =AT91C_BASE_AIC str r14, [r14, #AIC_EOICR] ldmia sp!,{r0} ; и здесь вот так !!!!!!!! msr SPSR_cxsf,r0 ; и здесь вот так !!!!!!!! ;- Restore SPSR_irq and r0 from IRQ stack ldmia sp!, {r0} ;- Restore adjusted LR_irq from IRQ stack directly in the PC ldmia sp!, {pc}^ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться