Cortex M0 + Перейти к ошибке приложения пользователя - PullRequest
0 голосов
/ 09 октября 2019

У меня есть KL17, я пытаюсь написать загрузчик для обновления OTA. У меня возникают проблемы при переходе к пользовательскому приложению, это то, что я пытаюсь сделать.

void JumpToUserApplication(uint32_t userSP, uint32_t userStartup)
{
printf("MSP BEFORE: %x \n", __get_MSP());
printf("PSP BEFORE: %x \n", __get_PSP());

SCB->VTOR = userSP; // SET UP INTERUPT VECTOR TABLE FOR APP
// set up stack pointer
__set_MSP(userSP);
__set_PSP(userStartup);
void (*user_app)(void) = userStartup;
user_app();

printf("BAD MSP AFTER: %x \n", __get_MSP());
printf("BAD PSP AFTER: %x \n", __get_PSP());

}

Я называю это так:

JumpToUserApplication(PROGRAM_ADDRESS, (PROGRAM_ADDRESS+0x4));

Я ожидаю, что оно перейдет в приложениеОднако вместо этого происходит перезагрузка загрузчика, как если бы он возвращался к сбросу загрузчика ...

WELCOME TO THE BOOTLOADER! 
MSP BEFORE: 20005fc0 
PSP BEFORE: 20006000 
WELCOME TO THE BOOTLOADER! 
MSP BEFORE: 20005fc0 
PSP BEFORE: 20006000
... and so on. 

Любой ввод приветствуется, спасибо!

1 Ответ

0 голосов
/ 09 октября 2019

Этот метод работает:

#define PROGRAM_VECTOR_TABLE ((uint32_t *) PROGRAM_ADDRESS)

void jump_to_app(void)
{
    static void (*go_to_app)(void) = 0;
    go_to_app = (void (*)(void))(PROGRAM_VECTOR_TABLE[1]);
    SCB->VTOR = (uint32_t)PROGRAM_VECTOR_TABLE;
    __set_MSP(PROGRAM_VECTOR_TABLE[0]);
    __set_PSP(PROGRAM_VECTOR_TABLE[0]);
    go_to_app();
}

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

...