Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: операции IAP и АРМ2388
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
M0HAX
Привет всем!
Возникла проблема. Почему-то не программируется flash-память с помощью оперции IAP.
Использую стандартный код
Код
#define IAP_LOCATION 0x7ffffff1

unsigned long iap_command[5];
unsigned long iap_result[3];
...........
iap_entry(iap_command, iap_result); // и др.команды


Чтение версии загрузчика с помощью дает нужный результат,т.е. операция срабатывает.
Например, хочу запрограммировать один 7-й сектор:
Код
  iap_command[0] = 50;
  iap_command[1] = 7;
  iap_command[2] = 7;
  iap_entry(iap_command, iap_result);

  iap_command[0] = 51;
  iap_command[1] = 0x7000;
  iap_command[2] = (unsigned long)RAMbuffer;
  iap_command[3] = 4096;                                                                                                
  iap_command[4] = SYS_GetFsclk()/1000;
  iap_entry(iap_command, iap_result);


Перед выполнением этих операций считываю содержимое сектора 7 и выбрасываю через com-порт на терминал
После выполнения каждой операции на комп отправляется результат операции. Получаю код CMD_SUCCESS = 0,т.е. все хорошо, а
затем считываю вновь содержимое сектора 0x7000. Получаю те же самые нули, что и были до программирования,т.е. сектор не запрограммировался...

Не понимаю, что не так...
jcxz
Предварительно стереть не забываете? Разрешить запись не забываете? Запретить прерывания не забываете?
Стирание секторов:
CODE
typedef void (__thumb *iap_entry_typ)(u32 *, u32 *);
#define iap_entry ((iap_entry_typ)0x7FFFFFF1)
__thumb __interwork u32 ClearFlash(uint beginSector, uint endSector)
{
u32 ibuf[5], obuf[3];
ibuf[0] = 50;
ibuf[1] = beginSector;
ibuf[2] = endSector;
iap_entry(ibuf, obuf);
if (!obuf[0]) {
ibuf[0] = 52;
ibuf[3] = CCLK / 1000;
iap_entry(ibuf, obuf);
}
return obuf[0];
}
M0HAX
1. Как я понял, стирать (командой 52) предварительно нет необходимости(но счас попробую), по крайней мере, написано в даташите, что
Цитата
The affected sectors should be prepared first by calling "Prepare Sector for Write Operation" command. The
affected sectors are automatically protected again once the copy command is successfully executed.
Это цитата к команде "IAP Copy RAM to flash command". Т.е. как и показано в начальном посте,сначала выполняю команду 50, потом команду 51.

2. Прерывания запрещал тоже - эффекта не было.

3. "Разрешить запись" - это через CRP? Опять же,возможно, я неправильно понял, но написано,что CRP не влияет на IAP команды.
Код
IAP commands are not affected by the code read protection


-------------------------------
Да,так и есть - после команды 52 запись сработала. Спасибо! Странно,что в даташите не написали,что для записи надо последовательно выполнить 4 команды: 50,52,50,51...
jcxz
Цитата(M0HAX @ Mar 28 2012, 17:49) *
Да,так и есть - после команды 52 запись сработала. Спасибо! Странно,что в даташите не написали,что для записи надо последовательно выполнить 4 команды: 50,52,50,51...

По-моему - это очевидно, что перед записью флешку надо предварительно стереть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.