У меня загрузчик прыгает на основное приложение так (основа - примеры от ST):
Код
// Адрес начала основного приложения.
#define APLICATION_ADDRESS 0x08003000
//------------------------------------------------------------------------------
// Запуск основного приложения, если оно зашито. Иначе возврат из функции.
void run_app_if()
{
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
if (((*(__IO uint32_t*)APLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
// Jump to user application
JumpAddress = *(__IO uint32_t*) (APLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
// Initialize user application's Stack Pointer
__set_MSP(*(__IO uint32_t*) APLICATION_ADDRESS);
Jump_To_Application();
}
}