KRS 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Это-же не IAP. ISP выполняет ROM-код он и должен рулить мапингом при необходимости. Должен, но он этого не делает! Все программаторы, если они хотят счтитать или проверить первые 64 байта флеша, при помощи команд ISP грузят в ОЗУ подпрограмму которая мапит флеш на адрес 0! После этого все работает как ожидается. Да и кстати это, по крайней мере не у всех серий, не ROM - а флешь. У первых серий это вообще была последняя страница флеша. Для некоторых серий NXP выкладывал апгрейд бутлоадера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Все программаторы, если они хотят счтитать или проверить первые 64 байта флеша, при помощи команд ISP грузят в ОЗУ подпрограмму которая мапит флеш на адрес 0! После этого все работает как ожидается. Ну что-ж - вполне правдоподобно. Значит ТС может сделать то же самое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Кроме того если нужно ускорить прошивку. можно загрузить в ОЗУ подпрограмму которая принимает данные из UART по другому протоколу - например просто принимает напр 4 кб данных и возвращает контрольную сумму для проверки и возвращается в бутлоадер, а программатор потом вызывает команду записи флеша, потом опять подпрограмму загрузки для следующей старницы и т.д. Причем подпрограмму можно грузить один раз ни бутлоадер ни IAP не портят память, они используют те области которые указаны в даташите. Ускорение полезно для больших прошивок, особенно когда к чипу через USBUART идет подключение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Ну что-ж - вполне правдоподобно. Значит ТС может сделать то же самое. Поподробнее, если можно....пока что не понимаю как конкретно пошагово это делать...какие команды и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 27 марта, 2015 Опубликовано 27 марта, 2015 · Жалоба загрузить в ОЗУ, например по адресу 0x40000200 24 байта (0x0C, 0x00, 0x9F, 0xE5, 0x01, 0x10, 0xA0, 0xE3, 0x00, 0x10, 0x80, 0xE5, 0x0E, 0xE0, 0x81, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0x40, 0xC0, 0x1F, 0xE0,) Потом дать бутлоадеру команду "G 1073742336 A" код этот не очень "красивый", взят ЕМНИП снифером из первого филисовского программатора. LDR R0, =0xE01FC040 MOV R1, #1 STR R1, [R0] ORR LR, R1, LR BX LR но тут оптимизации не к чему :) Работает вроде на всех LPC2xxx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 28 марта, 2015 Опубликовано 28 марта, 2015 · Жалоба но тут оптимизации не к чему :) Работает вроде на всех LPC2xxx. На всех, у которых ROM-код исполняется в Thumb. :-) ЗЫ: Его можно оптимизировать по размеру, переписав в Thumb. :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 29 марта, 2015 Опубликовано 29 марта, 2015 · Жалоба На всех, у которых ROM-код исполняется в Thumb. :-) ЗЫ: Его можно оптимизировать по размеру, переписав в Thumb. :-) А у всех LPC ARM7 boot код в THUMB, а что IAP (который часть boot rom) в THUMB - так явно в даташите указано. Инструкция ORR LR, R1, LR лишняя, если конечно в какой то версии бутлоадера не было баги в реализации команды G. А так можно смело в THUMB запускать, кстати удобно тесты железа запускать еще до прошивки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 2 апреля, 2015 Опубликовано 2 апреля, 2015 · Жалоба Спасибо всем огромное! В очередной раз форумчане выручают начинающего чайника!) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба Думал что на этом эпопея закончится, ан нет... Новый виток: перед тем как шиться выполняю из оперативной памяти код, который скинул форумчанин KRS, получаю всю память в FF как и желаю, пишу первый блок в 256 байт, он записывается как положено, потом дописываю все остальное (всего чуть больше килобайта). Записываемая программа должна моргать диодом с периодом в 1-2 секунды. Что происходит по окончании прошивки: диод начинает моргать циклично, но период увеличен раз так в 10-20, и после выключения-включения питания первые 64 байта опять переписываются как им удобно и код перестает работать. Что здесь можно предпринять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба и после выключения-включения питания первые 64 байта опять переписываются как им удобно и код перестает работать. Именно переписываются? Или все таки это бутлоадер туда отмаплен? Контрольная сумма векторов прерываний посчитана? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба Надо отпустить ногу бута. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба Надо отпустить ногу бута. Порт 2.10? Отпущен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба Если контрольная сумма векторов прерываний не посчитана, чип будет переходить в бутлоадер в любом случае! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба Именно переписываются? Или все таки это бутлоадер туда отмаплен? Контрольная сумма векторов прерываний посчитана? Я думал, что в готовой прошивке все должно быть посчитано.... Вот что в даташите написано по этому поводу Как в таком случае самому подсчитать и записать куда надо эту контрольную сумму? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба При записи по 0 адресу: uint32_t s; s=((uint32_t*)buf)[0]+ ((uint32_t*)buf)[1]+ ((uint32_t*)buf)[2]+ ((uint32_t*)buf)[3]+ ((uint32_t*)buf)[4]+ //((uint32_t*)buf)[5]+ !!skip!! ((uint32_t*)buf)[6]+ ((uint32_t*)buf)[7]; ((uint32_t*)buf)[5]=-s; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться