Перейти к содержанию
    

не могу расположить код в LPC1768 начиная с 0x2000 в Keil

довольно большой, рабочий проект решил сдвинуть на 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. Может, там есть какая-то специфика?

 

 

Изменено пользователем Dunduk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во! Столкнулся с аналогичной проблемой, у меня проц другой - AT91SAM7A3, написал бутлоадер, добавил код по совету из того топика ниже.

с адреса 0x00100000 бутлоадер,

с адреса 0x00102800 пользовательская прошивка должна быть.

По логике надо делать вот так:

post-21007-1329808978_thumb.png

Тогда после компиляции в карте памяти имеем:

    ....
    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 рассчитана :)

По-любому у кого-то здесь должен быть опыт подобного рода, прошу поделиться решением проблемы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда процессор узнает, что ему надо стартовать не с обычной точки старта (с начала флеш для LPC17x & LPC23x), а с вашего адреса?

 

Если вы скомпилили программу так, чтобы она работала с бутлоадером, то его нужно предварительно прошить во флеш.

Также он должен знать куда передавать управление для запуска вашей прошивки.

Также его таблица векторов прерываний должна перенаправлять все прерывания на обработчики рабочей программы

(либо рабочая прога должна переместить таблицу своих векторов в ОЗУ).

 

Читайте даташиты по процессу загрузки процессора. Для LPC17x это "Boot process flowchart" - у NXP всё хорошо разжёвано.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сыплю голову пеплом, почитал ман на 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 не получается нормально посмотреть, брейкпоинты почему-то один раз ставятся и потом не удаляются, и новые не ставятся. Буду копаться дальше, конечно. Но как же это муторно! :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для примера работы с Ethernet бутлоадером брал образцы загрузчика с сайта NXP для LPC2368. Там все есть.

Но есть нюанс. :)

На картинках настройки для проги, кторую шьем бутлоадером. На вкладке ASM есть строчка, что добавить нужно.

post-2305-1329847953_thumb.png

post-2305-1329847962_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 задавать со смещением по размеру векторов прерываний, которые туда скопируются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...