реклама на сайте
подробности

 
 
> Зависание при попытке записи во Flash
mr.smart
сообщение Feb 8 2011, 20:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 2-10-10
Пользователь №: 59 884



Вновь обращаюсь к вам с просьбой о помощи! Использую компилятор WinARM, процессор - AT91SAM7S256.
Есть функция записи во флеш:
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();


Т.е. прерывания перед записью я отключаю, у функции записи прописал атрибут вызова из RAM... Но при любом обращении ко флеш (в коде пометил как "проблемные места") процессор зависает.
В чем может быть причина?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mr.smart
сообщение Feb 12 2011, 17:37
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 2-10-10
Пользователь №: 59 884



Цитата
А что делает магическая функция AT91F_Disable_Interrupt()? Возможно она запрещает только IRQ, а у вас еще задействовано FIQ? Даже и не знаю, что еще можно придумать. Проблема пропадает именно при включении светодиода, или при любом действии с портом? С питанием все в порядке? Земли на все ноги заведены, питание на VDDFLASH заведено и зашунтировано блокировочным конденсатором?


Код AT91F_Disable_Interrupt() :
Код
#define I_BIT 0x00000080
#define F_BIT 0x00000040

mrs r0,CPSR
orr r0, r0, #(I_BIT | F_BIT)
msr CPSR_c,r0
mrs r0,CPSR
ands r0,r0, #(I_BIT | F_BIT)
beq AT91F_Disable_Interrupt
bx lr


Т.е. FIQ вроде как тоже запрещается. С землей все в порядке, блокировочный конденсатор на месте.
После нескольких экспериментов оказалось, что проблема пропадает не только если зажечь светодиод, но и вообще после любого действия с любым PIO! Да даже запись в регистр RTMR помогает!
Теоретически... Возможно действительно что-то с питанием от USB... Ибо здесь у меня тоже были проблемы с зависанием при ожидании бита подтверждения, и был сделан вывод о несовершенстве моего USB-порта. Но только в данном-то случае по юсб ничего не передается, а бит подтверждения FRDY генерируется внутри процессора...

Чуть позже попробую испытать на другом компьютере... Может с ним все нормально будет...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.0583 секунд с 7
ELECTRONIX ©2004-2016