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

 
 
> BootLoader для LPC1766, Как правильно вызывать прикладную программу.
Vitaliy_ARM
сообщение Jan 28 2010, 15:37
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Был у меня загрузчик для LPC2378 и прочих.
Теперь стала задача переписать его под LPC1766.

Все переписалось без особых проблем, однако камнем предкновения оказалось сделать вызов прикладной программы.

Прикладная программа заливается вместе с векторами начиная с адреса 0x1 0000 (16-я страница). Т.е. в ней находятся сначала вектора, а потом все остальное.

Код вызова программы:

Код
#define FIRST_PAGE_ADDR 0x10000
#define NVIC_VectTab_FLASH           (0x00000000)

// код вызова приложения

volatile unsigned long    *p = (volatile unsigned long*)NVIC_VECT_TABLE;
*p = NVIC_VectTab_FLASH | (USER_FLASH_START & 0x1FFFFF80);

void (*App)() =  (void(*)())(FIRST_PAGE_ADDR + 1);
App();            // уходим в прикладную программу


Код вызова брал по аналогии из LPC1700 USB Bootloader.

Сделал прикладную программу, которая настраивает порт светодиода на плате и зажигает его.
Прикладная программа вызывается неправильно. В ассемблерном коде используется BLX на адрес, 10001, хотя должен был быть 10002. И яр отображает код совсем подругому.
В приложенных файлах 001 и 002 показаны скриншоты яра при работе загрузчика и уходе в прикладную программу. На 003 - прикладная программа в отладочном режиме без загрузчика.

Как правильно вызывать?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jan 28 2010, 15:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Vitaliy_ARM @ Jan 28 2010, 18:37) *
В ассемблерном коде используется BLX на адрес, 10001, хотя должен был быть 10002.

А почему, собственно, 0x10000 + 0x01 должно быть равно 0x10002?
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Jan 28 2010, 16:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(aaarrr @ Jan 28 2010, 18:42) *
А почему, собственно, 0x10000 + 0x01 должно быть равно 0x10002?

cranky.gif наверное никак.
Сбил с толку указанный выше пример:

Код
void execute_user_code(void)
{
    void (*user_code_entry)(void);
    
    /* Change the Vector Table to the USER_FLASH_START
    in case the user application uses interrupts */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_START);

      user_code_entry = (void (*)(void))((USER_FLASH_START)+1);
    user_code_entry();

}


А что может находиться по адресу 0x10000 + 0x01? На сколько мне известно при 16 битных инструкциях прыгать нужно на адреса, выровненные под 16 битное пространство (т.е. в последнем бите должен быть 0).
Прикрепленные файлы
Прикрепленный файл  LPC1700_USB_Bootloader.zip ( 568.33 килобайт ) Кол-во скачиваний: 54
 


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:48
Рейтинг@Mail.ru


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