Cortex M0+ Ошибка перехода к пользовательскому приложению
У меня 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 ответ
Этот метод работает:
#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();
}
Несколько изменений, однако я заметил, что адрес вектора для перехода к приложению разрешился на другое значение, чем я пытался.