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

 
 
> [Решено] 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
Ответов
yanvasiij
сообщение Nov 7 2013, 07:56
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Я понял в чем проблема. Все дело в функции systemInit, которая вызывается у меня в начале всех программ. Ошибка конечно глупейшая, я не углядел, что в ней тоже инициализируется регистр VTOR:
CODE
void SystemInit (void)
{
#if (CLOCK_SETUP) /* Clock Setup */
LPC_SC->SCS = SCS_Val;
if (SCS_Val & (1 << 5)) { /* If Main Oscillator is enabled */
while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */
}

LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for sysclk/PLL0*/

#if (PLL0_SETUP)
LPC_SC->PLL0CFG = PLL0CFG_Val;
LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */
LPC_SC->PLL0FEED = 0xAA;
LPC_SC->PLL0FEED = 0x55;
while (!(LPC_SC->PLL0STAT & (1<<10)));/* Wait for PLOCK0 */
#endif

#if (PLL1_SETUP)
LPC_SC->PLL1CFG = PLL1CFG_Val;
LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */
LPC_SC->PLL1FEED = 0xAA;
LPC_SC->PLL1FEED = 0x55;
while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */
#endif

LPC_SC->CCLKSEL = CCLKSEL_Val; /* Setup Clock Divider */
LPC_SC->USBCLKSEL = USBCLKSEL_Val; /* Setup USB Clock Divider */
LPC_SC->EMCCLKSEL = EMCCLKSEL_Val; /* EMC Clock Selection */
LPC_SC->PCLKSEL = PCLKSEL_Val; /* Peripheral Clock Selection */
LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */
LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */
#endif

#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */
LPC_SC->FLASHCFG = FLASHCFG_Val|0x03A;
#endif

#ifdef __RAM_MODE__
SCB->VTOR = 0x10000000 & 0x3FFFFF80; /* <<< ВОТ ЗДЕСЬ ОН ИНИЦИАЛИЗИРУЕТСЯ ПОВТОРНО */
#else
SCB->VTOR = 0x00000000 & 0x3FFFFF80;
#endif

}


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

Сообщение отредактировал IgorKossak - Nov 7 2013, 08:14
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Cosmojam   [Решено] LPC1788 bootloader переход на адрес приложения   Aug 15 2013, 12:11
- - Axel   Цитата(Cosmojam @ Aug 15 2013, 15:11) Под...   Aug 15 2013, 12:44
|- - ar__systems   Цитата(Axel @ Aug 15 2013, 07:44) Делюсь:...   Sep 30 2013, 17:17
|- - 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
|- - 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 Текстовая версия Сейчас: 24th July 2025 - 11:05
Рейтинг@Mail.ru


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