From 2a80d89c7dd5c26aca756908ef202ef7fac39795 Mon Sep 17 00:00:00 2001 From: darya Date: Tue, 23 Jun 2026 20:48:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=2023.06.2026?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/BootJump.h | 1 + Src/BootJump.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/Inc/BootJump.h b/Inc/BootJump.h index 9f202f1..059a109 100644 --- a/Inc/BootJump.h +++ b/Inc/BootJump.h @@ -7,6 +7,7 @@ #include "stdint.h" +void BootFastJumpToAddress(const uint32_t address); void BootJumpToAddress(const uint32_t address); void Reset(); diff --git a/Src/BootJump.c b/Src/BootJump.c index d21b881..9a301a0 100644 --- a/Src/BootJump.c +++ b/Src/BootJump.c @@ -150,6 +150,40 @@ void BootJumpToAddress(const uint32_t address) { while (1); } + +void BootFastJumpToAddress(const uint32_t address) { + + + // 1. Подготовка процессора + if (CONTROL_nPRIV_Msk & __get_CONTROL()) { + EnablePrivilegedMode(); + } + + if (CONTROL_SPSEL_Msk & __get_CONTROL()) { + __set_MSP(__get_PSP()); + __set_CONTROL(__get_CONTROL() & ~CONTROL_SPSEL_Msk); + } + + // 2. Получаем стек и точку входа приложения + uint32_t appStack = *((__IO uint32_t *) address); + pFunction appEntry = (pFunction) *((__IO uint32_t *) (address + 4)); + + // 3. Устанавливаем VTOR и стек + SCB->VTOR = address; + __set_MSP(appStack); + + // 4. Очищаем регистры, которые могут содержать данные загрузчика + __ISB(); // Instruction Synchronization Barrier + __DSB(); // Data Synchronization Barrier + + // 5. Переход БЕЗ включения прерываний! + // Приложение само должно включить прерывания после инициализации + appEntry(); + + while (1); +} + + void Reset() { // DeInitAll();