Dunduk 0 31 января, 2012 Опубликовано 31 января, 2012 (изменено) · Жалоба довольно большой, рабочий проект решил сдвинуть на 2 сектора выше, дабы освободить место для Ethernet bootloader-а. Но Keil ругает меня, программа не идет. Could not write CPU register MSP: Written: 0xffffffff, Read: 0xfffffffc Единственное, что я делаю с рабочим проектом - я в проекте "Option for target" выставляю IROM1: 0x2000 и проблема появляется. Изначально, там был 0 и все работало. what the фак am i doing wrong? Пилю eth bootloader из комплекта Flash Magic. Там есть описание, как править проект чтоб оно заработало. Но как я понял, оно написано для LPC2378. Может, там есть какая-то специфика? Изменено 31 января, 2012 пользователем Dunduk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Во! Столкнулся с аналогичной проблемой, у меня проц другой - AT91SAM7A3, написал бутлоадер, добавил код по совету из того топика ниже. с адреса 0x00100000 бутлоадер, с адреса 0x00102800 пользовательская прошивка должна быть. По логике надо делать вот так: Тогда после компиляции в карте памяти имеем: .... FLASH_BASE 0x00100000 Number 0 sam7.o ABSOLUTE RESET 0x00102800 Section 324 sam7.o(RESET) Vectors 0x00102800 ARM Code 4 sam7.o(RESET) Reset_Addr 0x00102820 Data 4 sam7.o(RESET) Undef_Addr 0x00102824 Data 4 sam7.o(RESET) SWI_Addr 0x00102828 Data 4 sam7.o(RESET) PAbt_Addr 0x0010282c Data 4 sam7.o(RESET) DAbt_Addr 0x00102830 Data 4 sam7.o(RESET) Reserved_Addr 0x00102834 Data 4 sam7.o(RESET) IRQ_Addr 0x00102838 Data 4 sam7.o(RESET) FIQ_Addr 0x0010283c Data 4 sam7.o(RESET) SWI_Handler 0x00102844 ARM Code 4 sam7.o(RESET) MOSCS_Loop 0x00102884 ARM Code 4 sam7.o(RESET) PLL_Loop 0x00102898 ARM Code 4 sam7.o(RESET) WAIT_Rdy1 0x001028b0 ARM Code 4 sam7.o(RESET) WAIT_Rdy2 0x001028c4 ARM Code 4 sam7.o(RESET) !!!main 0x00102a00 Section 8 __main.o(!!!main) !!!scatter 0x00102a08 Section 56 __scatter.o(!!!scatter) !!handler_copy 0x00102a40 Section 40 __scatter_copy.o(!!handler_copy) !!handler_zi 0x00102a68 Section 44 __scatter_zi.o(!!handler_zi) .emb_text 0x00102a98 Section 16 lib_init.o(.emb_text) .text 0x00102aa8 Section 36 sam7.o(.text) .text 0x00102acc Section 4616 main.o(.text) .... Затык у меня на следующем шаге после компиляции :) Keil генерирует *.axf и *.hex файлы, для создания *.bin файла прошивки использовал всегда батник вида: C:\Keil\ARM\BIN30\fromelf.exe --bin --output "e:\project\compile\binary.bin" "e:\project\compile\binary.axf" Однако при выставлении смещения старт-адреса при запуске батника вместо бинарника получаю папку binary.bin и в ней два бинарных файла без расширений ER_IROM1 и STARTUP, по размерам соответствующие коду и RESET секции. Что делать с этим, ума не приложу. Попробовал кейловский axf подсунуть gcc objcopy - ругается на формат, естественно. Есть ещё старая утилитка у меня HEX2BIN.EXE - она тоже ругается на неверный формат hex файлов, вроде потому что она для C51 рассчитана :) По-любому у кого-то здесь должен быть опыт подобного рода, прошу поделиться решением проблемы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Откуда процессор узнает, что ему надо стартовать не с обычной точки старта (с начала флеш для LPC17x & LPC23x), а с вашего адреса? Если вы скомпилили программу так, чтобы она работала с бутлоадером, то его нужно предварительно прошить во флеш. Также он должен знать куда передавать управление для запуска вашей прошивки. Также его таблица векторов прерываний должна перенаправлять все прерывания на обработчики рабочей программы (либо рабочая прога должна переместить таблицу своих векторов в ОЗУ). Читайте даташиты по процессу загрузки процессора. Для LPC17x это "Boot process flowchart" - у NXP всё хорошо разжёвано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Сыплю голову пеплом, почитал ман на fromelf.exe, пришлось у друзей заимствовать свежую утилиту из 4-го кейла (из моего кейла ключик не поддерживается почему-то), батник изменился на: C:\Keil\ARM\BIN30\fromelf.exe --bincombined --output "e:\project\compile\binary.bin" "e:\project\compile\binary.axf" Теперь нормально бинарник на выходе получаю, но вопрос всё равно остался открытым... После передачи управления от бутлоадера к пользовательской прошивке (в указанном мной ранее соседнем топике подсказали): // copy application INTVEC to remapped INTVEC location (start of RAM) uint32_t const *Src = (uint32_t *)FLASH_USER_START; uint32_t *Dst = (uint32_t *)AT91C_ISRAM; //RAMSTART uint_fast8_t Size = 0x40 / sizeof *Dst; do { *Dst++ = *Src++; } while (--Size); BOARD_RemapRam(); BL_StartUserApplication = (void(*)(void))0x0; BL_StartUserApplication(); происходит сброс и снова вход в бутлоадер, вот пошаговое выполнение через j-link, начиная с последней строки кода: J-Link>s PC: 001014EA J-Link>s PC: 00000000 J-Link>s PC: 00100020 J-Link>s PC: 00100024 J-Link> Получается, что по нулевому адресу флэш, то есть ремап в RAM не происходит, так что ли? Поменял адрес для вызова функции: BL_StartUserApplication = (void(*)(void))AT91C_ISRAM; Теперь, поставив точку останова на 0x200000 = AT91C_ISRAM, имею: J-Link>regs PC: (R15) = 00200000, CPSR = 00000050 (User mode, ARM FIQ dis.) R0 = 00101425, R1 = 00100899, R2 = 002007A4, R3 = 00200000 R4 = 00000020, R5 = 001007A9, R6 = 00100475, R7 = 001000F4 USR: R8 =00200008, R9 =A5000001, R10=00206D70, R11 =00000000, R12 =00000000 R13=00207D50, R14=00101431 FIQ: R8 =FFFFF000, R9 =01000000, R10=00000000, R11 =00000002, R12 =00000000 R13=00207FE0, R14=02000000, SPSR=10000057 SVC: R13=00207F70, R14=00100E7F, SPSR=7000007F ABT: R13=00207FF0, R14=00000000, SPSR=3000001C IRQ: R13=00207FD0, R14=40000070, SPSR=40000070 UND: R13=00208000, R14=00000000, SPSR=600000DE J-Link>s PC: 00102860 J-Link>s PC: 00102864 J-Link>s PC: 00102868 Бинго! передал управление на RAM, оттуда перешёл на Reset_Handler (0x00102860), описанный в стандартном кейловском файле SAM7.S НО: где-то на этапе инициализации происходит сбой (если проект компилировать как самостоятельный без смещения памяти, то всё работает нормально), и я снова попадаю в бутлоадер. Через консоль j-link не получается нормально посмотреть, брейкпоинты почему-то один раз ставятся и потом не удаляются, и новые не ставятся. Буду копаться дальше, конечно. Но как же это муторно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EXeGLuMATOR 0 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Для примера работы с Ethernet бутлоадером брал образцы загрузчика с сайта NXP для LPC2368. Там все есть. Но есть нюанс. :) На картинках настройки для проги, кторую шьем бутлоадером. На вкладке ASM есть строчка, что добавить нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 22 февраля, 2012 Опубликовано 22 февраля, 2012 · Жалоба EXeGLuMATOR, всё, спасибо большое! :a14: Пара скриншотов - и наконец-то всё заработало! :beer: На самом деле тут несколько ключевых моментов: 1. Указание в настройках ассемблера RAM_INTVEC. У меня в бутлоадере уже копируются вектора из прошивки в RAM, поэтому например в моём случае заработало всё и без RAM_INTVEC. 2. Указание в настройках ассемблера REMAP. По идее у меня в бутлоадере используется функция BOARD_RemapRam(); но почему-то при попытке после этой функции стартануть по нулевому адресу через BL_StartUserApplication = (void(*)(void))0x0 стартует у меня из флэш-области. Так что в моём случае указание REMAP помогло. RAM_MODE у меня вообще не определён нигде в проекте. Видать, частный случай для LPC2xxx. 3. В настройках памяти проекта пользовательской прошивки необходимо указать области ROM и RAM со смещением. Почему-то нигде на форуме не нашёл этой информации в явном виде, по картинкам EXeGLuMATOR сравнил с докой на LPC, и догадался посмотреть на листинг памяти в области RAM - а там ведь с начала сразу переменные пользовательские ;) . Итог: в пользовательской прошивке надо память ROM задавать со смещением по размеру бутлоадера, память RAM задавать со смещением по размеру векторов прерываний, которые туда скопируются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться