|
|
  |
как работать с IAP? |
|
|
|
Mar 16 2009, 02:31
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(cornflyer @ Jan 29 2009, 07:47)  на форуме нет внятного описания как работать с IAP, нет рабочего кода, только какие-то танцы с бубном  пробовал код с форума - то пишет, то не пишет... непонятно почему в самой документации на lpc2148 - только пару строк хотя я все делал как требуется: выключал прерывания вызывал функцию подготовки флеша потом писал туда массив байт из RAM'а выложи свой рабочий код, который пишет и читает внутреннюю FLASH через IAP  Может вы не ту доку читали? Я пользовался LPC2478, в доке все внятно прописано более менее. Не пара строк. За пару часов запись удалось осуществить.
|
|
|
|
|
Mar 17 2009, 06:19
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
Вопрос к etoja по поводу записи, точнее верификации. Пишу себе спокойно по IAP, проверяю двумя способами: в лоб по рекомендации KRS и IAPовским сравнением. И нет такого момента, чтобы без ошибок обошлось на 32 кб записи 2-3 ошибки в среднем. Ну это ещё полбеды. Смотрю где ошибка - записанно всё что требуется (покрайней мере в том месте куда указывают функции сравнения). Ладно, думаю, по не опытности накосячил где-нить с указателями и не то сравниваю, однако, прошивка не запускается. Но стоит повторить целиком запись прошивки "поверх" старой, и - о чудо - всё работает и ошибок проверки не возникает. Чем это может быть обоснованно? Как всё таки достоверно сравнивать данные из ОЗУ и флеш?
P.S. Записывал массив одинаковых символов, смотрел глазками что вышло, всё в идеале, хотя ошибки всё равно лезут. Прерывания естественно все отключены, даже пробовал модуль акселератора памяти отключать (МАМ), думалось может при обращении к флеш не-то читается - не помогло в общем.
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Mar 17 2009, 12:14
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210

|
а вы правы, ar__systems. частота стояла из старого проекта в 4 раза меньше требуемой. Для надёжного прописывания флеш сколько времени требуется - то есть после записи, требуется провести проверку, что же там написанно. Паузы не требуется между записью блока и проверкой?
--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете. Альберт Эйнштейн
|
|
|
|
|
Aug 3 2009, 09:32
|
Местный
  
Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737

|
Подскажите всё ли правильно делаю,чтобы зашить в 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,тогда всё нормально проходит,но тогда как проконтролировать не залезет ли прога в область,где предполагается перезапись.
|
|
|
|
|
Aug 27 2009, 19:57
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(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 понадобятся самому бутлоадеру, можно сделать обычный переход в нужную страницу.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|