Dunduk 0 11 ноября, 2013 Опубликовано 11 ноября, 2013 · Жалоба Этот метод не работает, точнее работает неправильно. При заходе в main() стэк оказывается сдвинут на 0x680 по сравнению с запуском приложения без бутлоадера. Ассемблерный вариант работает правильно. Интересно почему это происходит? И что за магическое число 0x680 Я вижу у себя ту же картину. То есть, переход происходит совсем не туда куда я хочу (0x2000) Мой код: __asm void boot_jump( uint32_t address ){ LDR SP, [R0] ;Load new stack pointer address LDR PC, [R0, #4];Load new program counter address } void execute_user_code(void) { uint8_t tmp; NVIC->ICER[0] = 0xFFFFFFFF; //Disable all interrupts NVIC->ICER[1] = 0x00000001; NVIC->ICPR[0] = 0xFFFFFFFF; //Clear all pending interrupts NVIC->ICPR[1] = 0x00000001; for(tmp = 0; tmp < 32; tmp++) // Clear all interrupt priority { NVIC->IP[tmp] = 0x00; } 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 = (0x2000) & 0x1FFFFF80; boot_jump(0x2000); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dunduk 0 13 ноября, 2013 Опубликовано 13 ноября, 2013 · Жалоба Oops... Сам себя обманул :-) У меня в проекте там задан адрес старта 0x2000. При этом я собственными руками писал scatter file для линкера, где указа адрес старта 0x0000. И поставил галочку "верить скеттеру" :-) Щас все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться