npx skills add ...
npx skills add mohitmishra786/low-level-dev-skills --skill bootloaders-embedded
Embedded bootloader skill for firmware update and app handoff. Use when writing a custom bootloader, jumping to application code, relocating VTOR, or implementing DFU/USB firmware update on Cortex-M. Activates on queries about bootloader jump, vector table relocation, application entry point, STM32 DFU, or dual-bank flash.
npx skills add mohitmishra786/low-level-dev-skills --skill bootloaders-embedded
Guide agents through embedded bootloader fundamentals: vector table relocation, safe handoff from bootloader to application, flash partitioning, and basic firmware-update patterns (UART, USB DFU, or custom protocol) on Cortex-M and similar MCUs.
0x08010000)skills/baremetal/baremetal-startup and skills/baremetal/stm32-baremetal| Region | Address | Size | Content |
|---|---|---|---|
| Bootloader | 0x08000000 | 16–64 KB | BL code, update logic |
| Application | 0x08010000 | remainder | App vector + code |
Linker script for app must set FLASH ORIGIN to app base; vector table must live at app base.
Before jump, verify:
Application must set SCB->VTOR = APP_BASE early in Reset_Handler if startup assumes relocatable vector table.
STM32 chips expose USB DFU in system memory when BOOT0=1. Custom bootloaders are separate — do not confuse ROM DFU with user flash BL.
| Symptom | Cause | Fix |
|---|---|---|
| HardFault after jump | SP invalid or Thumb bit missing | Validate vectors; ensure reset | 1 |
| IRQs hit bootloader handlers | VTOR not relocated | Set SCB->VTOR before enabling IRQs |
| App OK standalone, fails via BL | Linker still at 0x08000000 | Relink app with correct ORIGIN |
| UART garbage after jump | BL left UART running | De-init or reset peripherals |
| Brick after OTA | Power loss mid-erase | Dual-bank or metadata rollback |
skills/baremetal/baremetal-startup — vector table and Reset_Handlerskills/baremetal/stm32-baremetal — flash map and CMSISskills/baremetal/interrupts-and-exceptions-baremetal — NVIC disable patternskills/embedded/linker-scripts — VMA/LMA for split imagesskills/embedded/openocd-jtag — recover bricked flashtypedef void (*app_entry_t)(void);
void jump_to_app(uint32_t app_base)
{
uint32_t sp = *(uint32_t *)app_base;
uint32_t reset = *(uint32_t *)(app_base + 4);
/* Disable interrupts and de-init peripherals/boot-owned hardware */
__disable_irq();
SysTick->CTRL = 0;
for (int i = 0; i < 8; i++) {
NVIC->ICER[i] = 0xFFFFFFFFU;
NVIC->ICPR[i] = 0xFFFFFFFFU;
}
SCB->VTOR = app_base;
__set_MSP(sp);
__DSB();
__ISB();
app_entry_t entry = (app_entry_t)reset;
entry(); /* does not return */
}Power-on
├── Init minimal clock + UART/USB for update
├── Check update flag in RTC backup / GPIO strap
├── If update requested → receive image, verify, program flash
└── Else if valid app → jump_to_app()
└── Else stay in bootloader shell/bootloaders-embedded Write STM32F4 jump-to-app at 0x08010000 with VTOR setup