Всем большое спасибо за советы, вроде решил проблему. Закоментировал участок стартапа загрузчика: /*---------------------------------------- Read/modify/write CP15 control register ----------------------------------------*/ mrc p15, 0, r0, c1, c0,0 /* read cp15 control registre (cp15 r1) in r0 */ ldr r3,= 0xC0000080 /* Reset bit :Little Endian end fast bus mode */ ldr r4,= 0xC0001000 /* Set bit :Asynchronous clock mode, Not Fast Bus, I-Cache enable */ bic r0, r0, r3 orr r0, r0, r4 mcr p15, 0, r0, c1, c0,0 /* write r0 in cp15 control registre (cp15 r1) */
то есть похоже что кэш инструкций мешал при переходе от бутлоадера к основной программе.
И ещё в библиотеке lib_AT91RM9200.h вроде ошибка (помечена /*!!!!!!!!!!!!!!!!!!*/):
inline void AT91F_AIC_Open( AT91PS_AIC pAic, // \arg pointer to the AIC registers void (*IrqHandler) (), // \arg Default IRQ vector exception void (*FiqHandler) (), // \arg Default FIQ vector exception void (*DefaultHandler) (), // \arg Default Handler set in ISR void (*SpuriousHandler) (), // \arg Default Spurious Handler unsigned int protectMode) // \arg Debug Control Register { int i;
// Disable all interrupts and set IVR to the default handler for (i = 0; i < 32; ++i) { AT91F_AIC_DisableIt(pAic, i); AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, DefaultHandler); }
// Set the IRQ exception vector AT91F_AIC_SetExceptionVector((unsigned int *) 0x18/*!!!!!!!!!!!!!!!!!!*/, IrqHandler); // Set the Fast Interrupt exception vector AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C/*!!!!!!!!!!!!!!!!!!*/, FiqHandler);
pAic->AIC_SPU = (unsigned int) SpuriousHandler; pAic->AIC_DCR = protectMode; }
inline unsigned int AT91F_AIC_SetExceptionVector ( unsigned int *pVector, // \arg pointer to the AIC registers void (*Handler) () ) // \arg Interrupt Handler { unsigned int oldVector = *pVector;
if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; else *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000;
return oldVector; }
0x18 и 0x1C никак не "pointer to the AIC registers".
|