STM32 DFU-Bootloader Firmware-Upgrade in Marlin mit M997 implementieren

English Deutsch

Marlin implementiert den M997-Befehl, der dazu dient, das Mainboard in einen Firmware-Upgrade-Modus zu versetzen.

Alle STM32-Varianten haben einen integrierten (fest codierten - also keine Notwendigkeit, ihn selbst zu flashen) Bootloader, der notorisch schwer zu aktivieren ist.

Marlin implementiert M997 auf dem STM32 jedoch als einfachen Neustart:

flash_firmware_dfu.cpp
void flashFirmware(const int16_t) { HAL_reboot(); }

Dies funktioniert nur, wenn Sie einen benutzerdefinierten Bootloader auf Ihrem Board verwenden - es nutzt jedoch nicht den integrierten STM32-Bootloader.

Der folgende Code wurde auf dem STM32F446 (BigTreeTech Octopus V1) getestet, sollte aber auf jeder STM32-Variante funktionieren. Er basiert auf vorheriger Arbeit von Dave Hyland auf StackOverflow. Ersetzen Sie die Standard-flashFirmware()-Funktion in Marlin/src/HAL/STM32/HAL.cpp

flash_firmware_instructions.sh
void flashFirmware(const int16_t) {
    HAL_RCC_DeInit();
    HAL_DeInit();

    __HAL_REMAPMEMORY_SYSTEMFLASH();

    // arm-none-eabi-gcc 4.9.0 inline diese MSP-Funktion
    // nicht korrekt, daher schreiben wir sie hier explizit aus.
    //__set_MSP(*((uint32_t*) 0x00000000));
    __ASM volatile ("movs r3, #0\nldr r3, [r3, #0]\nMSR msp, r3\n" : : : "r3", "sp");

    ((void (*)(void)) *((uint32_t*) 0x00000004))();

    // Dies wird nie ausgeführt
    HAL_reboot();
}

Beachten Sie, dass wir einen HAL_reboot()-Aufruf als Sicherheitsmaßnahme am Ende belassen haben, falls die vorherigen Aufrufe fehlschlagen.

Auf meinem BigTreeTech Octopus V1 (STM32F446) können Sie mit diesem Code erfolgreich den integrierten DFU-Bootloader aktivieren.

Siehe auch unsere vorherigen Beiträge zur Verwendung des STM32 im DFU-Bootloader-Modus:


Check out similar posts by category: 3D Printing, C/C++, STM32