Есть функция записи во флеш:
CODE
//********************************************************************************
******
// Тут у нас все что касается записи во флеш
//********************************************************************************
******
extern void AT91F_Enable_Interrupt(void);
extern void AT91F_Disable_Interrupt(void);
#define RAMFUNC __attribute__ ((section (".ram_func")))
#define EFC_PAGE_SIZE 256
#define EFC_PAGE_COUNT 1024
#define EFC_PagesInTheLockRegion 64
#define EFC_PAGE_SIZE_UINT (EFC_PAGE_SIZE/4) // Количество unsigned int
unsigned long int RAMFUNC EFC_WritePage(unsigned long int adr, unsigned long int *pbuf) {
unsigned int *pflash;
unsigned int page;
unsigned int region;
unsigned int i;
pflash = (unsigned int *)adr;
page = (adr & 0x3FFFF)/EFC_PAGE_SIZE;
region = (page/EFC_PagesInTheLockRegion);
//Init
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)) ;
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(100 <<16)) | AT91C_MC_FWS_1FWS ;
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)) ;
if (AT91C_BASE_MC->MC_FSR & (region << 16)) {
// lock set, clear it
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_2FWS ;
AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (region << 8 ) |AT91C_MC_FCMD_UNLOCK; //!!!проблемное место!!!
}
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)) ;
for (i = 0; i < EFC_PAGE_SIZE_UINT; i++)
*(pflash + i ) = *(pbuf + i); //!!!проблемное место!!!
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, 0x400 ) ;
AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG; //!!!проблемное место!!!
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)) ;
return 1;
}
void RAMFUNC EFCWrite(unsigned long int adr, unsigned char *pbuf, unsigned long int Len, unsigned long int NeedReset) {
unsigned long int l;
if (NeedReset) {
l=0;
}
l=0;
while (l<Len) {
EFC_WritePage(adr, (unsigned long int*)&(pbuf[l]));
l+=EFC_PAGE_SIZE;
adr+=EFC_PAGE_SIZE;
}
if (NeedReset) {
__asm("sub r0, r0,r0;");
__asm("bx r0;");
}
}
//********************************************************************************
******
В основной функции пишу:
Код
unsigned int buf1[1];
#define Tester 0x110001
buf1[1] = 1;
AT91F_Disable_Interrupt();
EFCWrite(Tester,(unsigned char*)buf1,4,0);
AT91F_Enable_Interrupt();
#define Tester 0x110001
buf1[1] = 1;
AT91F_Disable_Interrupt();
EFCWrite(Tester,(unsigned char*)buf1,4,0);
AT91F_Enable_Interrupt();
Т.е. прерывания перед записью я отключаю, у функции записи прописал атрибут вызова из RAM... Но при любом обращении ко флеш (в коде пометил как "проблемные места") процессор зависает.
В чем может быть причина?