Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как работать с IAP?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
ar__systems
Цитата(TanT @ Mar 17 2009, 01:19) *
Вопрос к etoja по поводу записи, точнее верификации.
Пишу себе спокойно по IAP, проверяю двумя способами: в лоб по рекомендации KRS и IAPовским сравнением. И нет такого момента, чтобы без ошибок обошлось на 32 кб записи 2-3 ошибки в среднем. Ну это ещё полбеды. Смотрю где ошибка - записанно всё что требуется (покрайней мере в том месте

Не ту частоту передаете параметром в IAP. Flash не успевает прописаться надежно.
TanT
а вы правы, ar__systems. частота стояла из старого проекта в 4 раза меньше требуемой.
Для надёжного прописывания флеш сколько времени требуется - то есть после записи, требуется провести проверку, что же там написанно. Паузы не требуется между записью блока и проверкой?
HARMHARM
Цитата(TanT @ Mar 17 2009, 14:14) *
а вы правы, ar__systems. частота стояла из старого проекта в 4 раза меньше требуемой.
Для надёжного прописывания флеш сколько времени требуется - то есть после записи, требуется провести проверку, что же там написанно. Паузы не требуется между записью блока и проверкой?

Паузы не требуется. Я вообще проверяю целиком всю записанную информацию - считаю CRC. Ни разу не было проблем с записью (только при пропадании питания мусор естественно).
KRS
Цитата(TanT @ Mar 17 2009, 15:14) *
Паузы не требуется между записью блока и проверкой?

Не требуются, из IAP возвращается после того как запись полностью произойдет и флешь полностью можно исплоьзовать
Wano
Подскажите всё ли правильно делаю,чтобы зашить в LPC2134 число:
1) в кейле Options for Target задаю два раздела IROM1 от 0х0 до 0x17FFF IROM2 от 0х18000 до 0x20000, тоесть планирую писать в последний сектор,для этого создаю раздел IROM2.
2) в прогу определяю переменную как const unsigned int i __attribute__((at(0x18000)));
3) следующей функцией стираю последний сектор и записываю туда какой-то массив, в первом элементе которого хранится будущее значение i

Код
typedef void (*IAP)(unsigned int *in, unsigned int *result);
#define iap_entry ((IAP) 0x7FFFFFF1)

unsigned int program (unsigned int * data)  {
  unsigned int command[5];
  unsigned int result[5];
  unsigned int save_VicInt;                

  save_VicInt = VICIntEnable;              
  VICIntEnClr = 0xFFFFFFFF; //запрет прерываний            

  command[0] = 50;//подготовка                            
  command[1] = 10;                                             
  command[2] = 10;                                           
  iap_entry (command, result);                    
  if (result[0])goto exit;

  command[0] = 52;//стирание                            
  command[1] = 10; // начало
  command[2] = 10;// конец
  command[3] = 60000;// частота проца
  iap_entry (command, result);
  if (result[0])goto exit;

  command[0] = 50;//подготовка
  command[1] = 10;
  command[2] = 10;                                     
  iap_entry (command, result);
  if (result[0])goto exit;

  command[0] = 51;//запись
  command[1] = (unsigned int) 0x0018000;  // куда пишется
  command[2] = (unsigned int) data;//что пишется              
  command[3] = 256;// число байт
  command[4] = 60000;
  iap_entry (command, result);
  if (result[0])goto exit;

exit:

  VICIntEnable = save_VicInt;
  return (result[0]);
}


Проблема состоит в том, что в таком случае на команде стирания проц вылетает в PAbt_Handler. Если не объявлять раздел IROM2,тогда всё нормально проходит,но тогда как проконтролировать не залезет ли прога в область,где предполагается перезапись.
IgorMarx
Цитата(GetSmart @ Mar 15 2009, 23:34) *
В векторах программ чаще всего используется IRQ. Если по адресу 0x18 в нулевом секторе (загрузчике) стоит команда LDR PC,[PC,#-0xFF0], то этого достаточно чтобы IRQ прикладной программы нормально действовали. Для FIQ тоже можно сделать похожим образом. Ну а остальные вестора исключительных ситуаций обычно не возникают и для большинства программ не имеют значения. Обычно там вообще стоят заглушки типа зависона.


Это отличное решение для IRQ (главное не забыть запрограммировать VICDefVectAddr, иначе при spurious interrupt поимеем переход на нулевой адрес). Но я не уверен что для FIQ такой номер прокатит. Если мне не изменяет память, то инструкция LDR PC,[PC,#-0xFF0] загружает в PC значение, считанное по адресу PC,#-0xFF0, то есть VICVectAddr, и это хорошо подходит для векторных прерываний. FIQ к ним не относится. Могу ошибаться, поправьте, если я не прав (сам не пробовал). Но вряд ли FIQ понадобятся самому бутлоадеру, можно сделать обычный переход в нужную страницу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.