How to convert PlatformIO firmware with build offset to firmware without
Some firmwares are build with a build offset to accomodate flash space (like 32k - 0x8000
) for a bootloader that is started before the firmware. One of the downsides of using such a firmware is that it always depends on a compatible bootloader to be present (compatibility is mostly defined by how much flash is allocated for the bootloader)
If you want to convert a firmware to a “normal” non-bootloader firmware, this is what you’ll have to do:
- Set
board_build.offset
to0x0
- look not only in your build configuration inplatformio.ini
and all included files, but also look in the configuration that your configextends
, if any. - Set
board_upload.offset_address
to0x0
. This mostly affects uploading with a debugger, but you should always keep this information consistent because debugging that is a huge nightmare. - Edit the specific linker script your firmware is using and set the flash offset appropriately:
Look for the MEMORY
section like this:
MEMORY
{
FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 512K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
As you can see in
FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 512K
the flash for this STM32 (example) is not at the MCU’s flash address 0x8000000
, but at 0x8008000
- basically, the linker is told to skip the 0x8000
(32k) the bootloader occupies (else, it would overwrite the bootloader.
Change this to your MCU’s flash adress. For ARMs like the STM32, this is typically 0x8000000
.
Now recompile and your firmware should work without the bootloader.