static bool stm32f1_option_write_erased(target *t, uint32_t addr, uint16_t value) { if (value == 0xffff) return true; /* Erase option bytes instruction */ target_mem_write32(t, FLASH_CR, FLASH_CR_OPTPG | FLASH_CR_OPTWRE); target_mem_write16(t, addr, value); /* Read FLASH_SR to poll for BSY bit */ while (target_mem_read32(t, FLASH_SR) & FLASH_SR_BSY) if(target_check_error(t)) return false; return true; }
/* MSP432 ROM routine invocation */ static void msp432_call_ROM(target *t, uint32_t address, uint32_t regs[]) { /* Kill watchdog */ target_mem_write16(t, WDT_A_WTDCTL, WDT_A_HOLD); /* Breakpoint at the beginning of CODE SRAM alias area */ target_mem_write16(t, SRAM_CODE_BASE, ARM_THUMB_BREAKPOINT); /* Prepare registers */ regs[REG_MSP] = SRAM_STACK_PTR; /* Stack space */ regs[REG_LR] = SRAM_CODE_BASE | 1; /* Return to beginning of SRAM CODE alias */ regs[REG_PC] = address; /* Start at given address */ target_regs_write(t, regs); /* Call ROM */ /* start the target and wait for it to halt again */ target_halt_resume(t, false); while (!target_halt_poll(t, NULL)); // Read registers to get result target_regs_read(t, regs); }