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

 
 
> AT91SAM7S64. не могу внутрипрограммно записать флэшку
vovchk
сообщение Sep 11 2007, 09:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 26-04-05
Из: Самара
Пользователь №: 4 526



уже все перепробывал, что знаю. Не получаеться записать даже 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;
}
Go to the top of the page
 
+Quote Post



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

 


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


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