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

 
 
> [Решено] LPC1788 bootloader переход на адрес приложения, приводит к lockup
Cosmojam
сообщение Aug 15 2013, 12:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Не получается запустить приложение из загрузчика. Пример из AN10866 работает на LPC1768, но на LPC1788
Код
static void boot(uint32_t a)
{
    __asm volatile (
    "LDR SP, [R0]\n"
    "LDR PC, [R0, #4]\n"
            );
}

вызывает сброс в lockup и так по кругу. На следующем старте источник сброса SYSRESET и LOCKUP в RSID.
Посмотреть отладчиком что там происходит крайне затруднительно по причине его тормознутости и глючности (китайский j-link, кое-как с openocd рабоает и вообще никак с фирменной софтиной)

Код
__disable_irq();
__disable_fault_irq();

delay_loop(3000000u);
SCB->VTOR = (start_address & 0x1FFFFF80);
__asm volatile (
            "dmb\n"
            "dsb\n"
            "isb\n"
        );
boot(start_address);


Приложение записано с помощью IAP и судя по содержимому памяти записано верно. На LPC1768 помню приходилось перед модификацией PC переключаться на встроенный RC генератор и отключать PLL Тут это тоже пробовал - не помогает, либо я не правильно читаю даташит.

Поделитесь у кого есть реально рабочий код запуска приложения из загрузчика на этом процессоре с gcc.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Axel
сообщение Aug 15 2013, 12:44
Сообщение #2


Местный
***

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



Цитата(Cosmojam @ Aug 15 2013, 15:11) *
Поделитесь у кого есть реально рабочий код запуска приложения из загрузчика на этом процессоре с gcc.

Делюсь:
CODE
typedef void (*pFunction)(uint32_t app_start);

void JumpToApp (uint32_t app_start)
{
pFunction jump_to_app = (pFunction)(*(volatile uint32_t *) (app_start + 4));

LPC_SC->CCLKSEL = 0x01; // set sysclk (12MHz) as clock source
LPC_SC->PLL0CON = 0; // disable PLL
LPC_SC->PLL0FEED = 0xAA;
LPC_SC->PLL0FEED = 0x55;

SCB->VTOR = (uint32_t)app_start; // Change the Vector Table to the APP_CODE_START
__ASM volatile ("MSR psp, %0" : : "r" (*(volatile uint32_t *)app_start)); // Load new stack pointer address
jump_to_app(app_start); // Jump to application code
}

Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 30 2013, 17:17
Сообщение #3


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Axel @ Aug 15 2013, 07:44) *
Делюсь:
CODE
typedef void (*pFunction)(uint32_t app_start);

void JumpToApp (uint32_t app_start)
{
pFunction jump_to_app = (pFunction)(*(volatile uint32_t *) (app_start + 4));

LPC_SC->CCLKSEL = 0x01; // set sysclk (12MHz) as clock source
LPC_SC->PLL0CON = 0; // disable PLL
LPC_SC->PLL0FEED = 0xAA;
LPC_SC->PLL0FEED = 0x55;

SCB->VTOR = (uint32_t)app_start; // Change the Vector Table to the APP_CODE_START
__ASM volatile ("MSR psp, %0" : : "r" (*(volatile uint32_t *)app_start)); // Load new stack pointer address
jump_to_app(app_start); // Jump to application code
}


Этот метод не работает, точнее работает неправильно. При заходе в main() стэк оказывается сдвинут на 0x680 по сравнению с запуском приложения без бутлоадера. Ассемблерный вариант работает правильно.

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Cosmojam   [Решено] LPC1788 bootloader переход на адрес приложения   Aug 15 2013, 12:11
|- - Dunduk   Цитата(ar__systems @ Sep 30 2013, 21:17) ...   Nov 11 2013, 14:58
|- - Dunduk   Oops... Сам себя обманул :-) У меня в проекте там ...   Nov 13 2013, 07:18
- - _Артём_   Цитата(Cosmojam @ Aug 15 2013, 15:11) Не ...   Aug 15 2013, 12:55
|- - Cosmojam   Спасибо за код и подсказку. Буду внимательнее смот...   Aug 15 2013, 18:02
- - Fedor   Попробуйте обявить эту функцию с __attribute__((na...   Aug 16 2013, 08:29
|- - Cosmojam   Цитата(Fedor @ Aug 16 2013, 11:29) Попроб...   Aug 16 2013, 09:09
- - yanvasiij   У меня схожая проблема. При переключении из bootlo...   Nov 6 2013, 07:38
- - Cosmojam   Попробуйте отключить systick перед запуском прилож...   Nov 6 2013, 17:10
- - Bass   В таблице векторов прерываний по нулевому смещению...   Nov 6 2013, 17:39
- - yanvasiij   Cosmojam Отключение systick не помогло. Bass Не со...   Nov 7 2013, 03:25
- - yanvasiij   Я понял в чем проблема. Все дело в функции systemI...   Nov 7 2013, 07:56
|- - Cosmojam   Цитата(yanvasiij @ Nov 7 2013, 10:56) Вых...   Nov 7 2013, 09:08
- - yanvasiij   Cosmojam Где определен указатель g_pfnVectors?   Nov 7 2013, 10:02
- - Cosmojam   Цитата(yanvasiij @ Nov 7 2013, 13:02) Cos...   Nov 7 2013, 17:02


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

 


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


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