реклама на сайте
подробности

 
 
> не могу расположить код в LPC1768 начиная с 0x2000 в Keil, Could not write CPU register MSP: .....
Dunduk
сообщение Jan 31 2012, 08:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 15-08-09
Пользователь №: 51 904



довольно большой, рабочий проект решил сдвинуть на 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 - Jan 31 2012, 08:19
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Aaron
сообщение Feb 21 2012, 07:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Во! Столкнулся с аналогичной проблемой, у меня проц другой - 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)
    ....

Затык у меня на следующем шаге после компиляции sm.gif 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 рассчитана sm.gif
По-любому у кого-то здесь должен быть опыт подобного рода, прошу поделиться решением проблемы!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 21 2012, 08:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Если вы скомпилили программу так, чтобы она работала с бутлоадером, то его нужно предварительно прошить во флеш.
Также он должен знать куда передавать управление для запуска вашей прошивки.
Также его таблица векторов прерываний должна перенаправлять все прерывания на обработчики рабочей программы
(либо рабочая прога должна переместить таблицу своих векторов в ОЗУ).

Читайте даташиты по процессу загрузки процессора. Для LPC17x это "Boot process flowchart" - у NXP всё хорошо разжёвано.
Go to the top of the page
 
+Quote Post
Aaron
сообщение Feb 21 2012, 13:02
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Сыплю голову пеплом, почитал ман на 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.gif
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Feb 21 2012, 18:13
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Для примера работы с Ethernet бутлоадером брал образцы загрузчика с сайта NXP для LPC2368. Там все есть.
Но есть нюанс. sm.gif
На картинках настройки для проги, кторую шьем бутлоадером. На вкладке ASM есть строчка, что добавить нужно.

Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Aaron
сообщение Feb 22 2012, 06:46
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



EXeGLuMATOR, всё, спасибо большое! a14.gif Пара скриншотов - и наконец-то всё заработало! beer.gif На самом деле тут несколько ключевых моментов:
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 - а там ведь с начала сразу переменные пользовательские wink.gif . Итог: в пользовательской прошивке надо память ROM задавать со смещением по размеру бутлоадера, память RAM задавать со смещением по размеру векторов прерываний, которые туда скопируются.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 14:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016