уже все перепробывал, что знаю. Не получаеться записать даже 1 сектор, точнее получаеться но потом все виснет. Может быть нужно понижать частоту периферии при работой с флэшкой как у LPC? Может у меня в функциях ошибки, хотя я их вроде из примеров взял. Помогите, а то уже голова квадратная :'(
Начало здесь -> http://telesys.ru/wwwboards/mcontrol/1785/...es/155802.shtml
Почему то при выполение кода в пошаговом режиме (MT-Link+Keil) все записываеться и даже выходит из функции записи FlashWrite, но если выполнять не в пошаговом режиме и нажать на кнопку останова, то курсор указывает на PAbt_Handler:
0x00108224 EAFFFFFE B PAbt_Handler?A(0x00108224)
и фсе.
unsigned char test_buff[]={...}
unsigned char test_buff2[256] _at 0x0010A000;
void main(void)
{
....
i=FlashWrite(test_buff, 320); //
i=FlashWrite(test_buff, 320);
...
}
unsigned int FlashWriteCriticalSection(unsigned long Page) //__ram
{
unsigned long status = 0;
/* Устанавливаем базовый адрес Flash контроллера */
AT91PS_MC ptMC = AT91C_BASE_MC;
/* Устанавливаем команду записи Flash */
ptMC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_START_PROG | (AT91C_MC_PAGEN & (Page << 8)) ;
/* Ожидаем выполнения команды */
while ((status & AT91C_MC_FRDY) != AT91C_MC_FRDY )
status = AT91C_BASE_MC->MC_FSR;
return status;
}
/* Запись во флэш */
int FlashWrite(unsigned char *buf, unsigned long page) //__ram
{
unsigned long *Flash = (unsigned long *)(page * 128 + 0x00100000);
unsigned long i,lwd,status;
/* Устанавливаем время ожидания записи во флэш */
// AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN) & (72 << 16)) | AT91C_MC_FWS_1FWS;
/* Копируем новые значения в буфер */
for ( i = 0; i < 32; i++)
{
lwd = buf[i * 4] + (buf[i * 4 + 1] << 8) + (buf[i * 4 + 2] << 16) + (buf[i * 4 + 3] << 24);
*Flash = lwd;
Flash++;
}
__disable_interrupt(); /* Запрещаем прерывания на время записи */
status = FlashWriteCriticalSection(page);
__enable_interrupt(); /* Разрешаем прерывания */
/* Проверка результата */
if ((status & (AT91C_MC_PROGE | AT91C_MC_LOCKE)) != 0)
return 0;
return 1;
}