static void banzai() { // Disable all interrupts __disable_irq(); // Avoid erasing the application if APP_START is < than the minimum bootloader size // This could happen if without_bootloader linker script was chosen // Minimum bootloader size in SAMD21 family is 512bytes (RM section 22.6.5) if (APP_START < (0x200 + 4)) { goto reset; } // Erase application while (!nvmReady()) ; NVMCTRL->STATUS.reg |= NVMCTRL_STATUS_MASK; NVMCTRL->ADDR.reg = (uintptr_t)&NVM_MEMORY[APP_START / 4]; NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMD_ER | NVMCTRL_CTRLA_CMDEX_KEY; while (!nvmReady()) ; reset: // Reset the device NVIC_SystemReset() ; while (true); }
static void banzai() { // Disable all interrupts __disable_irq(); // Erase application while (!nvmReady()) ; NVMCTRL->STATUS.reg |= NVMCTRL_STATUS_MASK; NVMCTRL->ADDR.reg = (uintptr_t)&NVM_MEMORY[APP_START / 4]; NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMD_ER | NVMCTRL_CTRLA_CMDEX_KEY; while (!nvmReady()) ; // Reset the device NVIC_SystemReset() ; while (true); }