STM32 DFU-Bootloader Firmware-Upgrade in Marlin mit M997 implementieren
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:
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
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: