
Klipper 固件 Bootloader 完全指南主流 MCU 平台的引导加载器刷写与应用程序烧录实战【免费下载链接】klipperKlipper is a 3d-printer firmware项目地址: https://gitcode.com/GitHub_Trending/kl/klipper本文以 Klipper 官方文档 docs/Bootloaders.md 为核心骨架系统讲解 Klipper 所支持微控制器AVR、SAM3/SAM4/SAMD/SAMC21、STM32F1/F4、LPC176x 等上常见的 Bootloader 原理、刷写步骤与应用程序烧录方法并结合 Klipper 仓库源码src/各平台bootloader_request实现、src/stm32/Kconfig 的 Bootloader offset 配置、lib/hidflash、lib/katapult/flashtool.py做源码级印证。读完本文你将掌握各主流 3D 打印机主控板的固件烧录全流程、在树莓派上用 OpenOCD 进行 SWD 调试刷写的完整方法以及如何从 Klipper 侧一键请求进入 Bootloader。1. 什么是 Bootloader为什么 3D 打印机固件离不开它Bootloader 是运行在微控制器上的第三方软件它在芯片首次上电时率先执行其典型用途是在不需要专用编程硬件的情况下把新应用程序例如 Klipper 固件写入芯片 Flash。遗憾的是业界没有统一的微控制器烧录标准也不存在一款能跨所有 MCU 使用的通用 Bootloader更麻烦的是每个 Bootloader 往往要求一套不同的烧录步骤。这正是本文存在的意义——把 Klipper 开发者在长期实践中积累的、针对各常见芯片的实用烧录信息整理成一份速查手册。需要特别强调两个核心认知这也是文档开篇反复提醒的能烧 Bootloader 的机制通常也能烧应用程序但直接用它烧应用程序存在风险——可能无意中把 Bootloader 抹掉导致以后只能借助专用硬件重新烧录Bootloader 通常只允许用户烧录应用程序它不会让普通操作破坏自身因此只要条件允许都应优先通过 Bootloader 来烧录应用程序。文档本身也声明这不是权威规范而是 Klipper 开发者积累的实用信息集合。实际操作时请以具体板卡的硬件手册与 Bootloader 项目文档为准。补充Klipper 自身还提供了从应用侧软请求进入 Bootloader 的机制详见本文第 12 节与 docs/Bootloader_Entry.md这让通过 Bootloader 刷应用的体验更顺滑。2. AVR 微控制器8 位 Atmel Atmega 系列对于 8 位 Atmel Atmega 系列Arduino 项目是 Bootloader 与烧录流程的权威参考资料特别是其boards.txt文件记录各板卡的熔丝位与 Bootloader 配置。2.1 烧录 Bootloader 所需的硬件与工具AVR 芯片烧写 Bootloader 需要外部硬件烧录器它通过SPI与芯片通信。常见选择购买成品烧录器可搜索 avr isp、arduino isp、usb tiny isp用另一块 Arduino 或树莓派充当 ISP 烧录器可搜索 program an avr using raspberry pi。本文示例统一假设使用AVR ISP Mk2型烧录器。烧录工具方面avrdude是最常用的程序既负责烧 Bootloader 也负责烧应用程序。2.2 Atmega2560Arduino Mega该芯片常见于 Arduino Mega也是3D 打印机主板中最常见的芯片之一。烧写 Bootloader含熔丝位设置注意-e全片擦除、-u禁用自动校验、lock 位分两步先解锁后锁定wget https://github.com/arduino/Arduino/raw/1.8.5/hardware/arduino/avr/bootloaders/stk500v2/stk500boot_v2_mega2560.hex avrdude -cavrispv2 -patmega2560 -P/dev/ttyACM0 -b115200 -e -u -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xD8:m -U lfuse:w:0xFF:m avrdude -cavrispv2 -patmega2560 -P/dev/ttyACM0 -b115200 -U flash:w:stk500boot_v2_mega2560.hex avrdude -cavrispv2 -patmega2560 -P/dev/ttyACM0 -b115200 -U lock:w:0x0F:m烧写 Klipper 应用程序使用wiring协议即 Arduino Mega 板载 USB 串口avrdude -cwiring -patmega2560 -P/dev/ttyACM0 -b115200 -D -Uflash:w:out/klipper.elf.hex:i-D表示不擦除芯片、直接写 Flash-Uflash:w:out/klipper.elf.hex:i中的i表示输入文件为 Intel HEX 格式。out/klipper.elf.hex是 Klipper 编译产物make之后生成于out/目录。2.3 Atmega1280早期 Arduino Mega该芯片见于早期版本的 Arduino Mega。烧写 Bootloaderwget https://github.com/arduino/Arduino/raw/1.8.5/hardware/arduino/avr/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex avrdude -cavrispv2 -patmega1280 -P/dev/ttyACM0 -b115200 -e -u -U lock:w:0x3F:m -U efuse:w:0xF5:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m avrdude -cavrispv2 -patmega1280 -P/dev/ttyACM0 -b115200 -U flash:w:ATmegaBOOT_168_atmega1280.hex avrdude -cavrispv2 -patmega1280 -P/dev/ttyACM0 -b115200 -U lock:w:0x0F:m烧写应用程序注意此芯片用arduino协议、波特率 57600avrdude -carduino -patmega1280 -P/dev/ttyACM0 -b57600 -D -Uflash:w:out/klipper.elf.hex:i2.4 Atmega1284pMelzi 类主板该芯片常见于Melzi 风格 3D 打印机主板。烧写 Bootloader示例使用 Optiboot 变体wget https://github.com/Lauszus/Sanguino/raw/1.0.2/bootloaders/optiboot/optiboot_atmega1284p.hex avrdude -cavrispv2 -patmega1284p -P/dev/ttyACM0 -b115200 -e -u -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xDE:m -U lfuse:w:0xFF:m avrdude -cavrispv2 -patmega1284p -P/dev/ttyACM0 -b115200 -U flash:w:optiboot_atmega1284p.hex avrdude -cavrispv2 -patmega1284p -P/dev/ttyACM0 -b115200 -U lock:w:0x0F:m烧写应用程序avrdude -carduino -patmega1284p -P/dev/ttyACM0 -b115200 -D -Uflash:w:out/klipper.elf.hex:i重要变体许多 Melzi 主板预装的 Bootloader 波特率为57600。此时烧应用程序应改为avrdude -carduino -patmega1284p -P/dev/ttyACM0 -b57600 -D -Uflash:w:out/klipper.elf.hex:i若波特率不匹配烧录会报握手失败或校验错误。2.5 At90usb1286Teensy本文不介绍该芯片的 Bootloader 烧写方法。Teensy 自带专有 Bootloader需使用 pjrc.com 配套的专用烧录工具teensy_loader_cliteensy_loader_cli --mcuat90usb1286 out/klipper.elf.hex -v2.6 Atmega168空间受限推荐 OptibootAtmega168 Flash 空间有限若用 Bootloader强烈建议 Optiboot体积更小。烧写 Optibootwget https://github.com/arduino/Arduino/raw/1.8.5/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega168.hex avrdude -cavrispv2 -patmega168 -P/dev/ttyACM0 -b115200 -e -u -U lock:w:0x3F:m -U efuse:w:0x04:m -U hfuse:w:0xDD:m -U lfuse:w:0xFF:m avrdude -cavrispv2 -patmega168 -P/dev/ttyACM0 -b115200 -U flash:w:optiboot_atmega168.hex avrdude -cavrispv2 -patmega168 -P/dev/ttyACM0 -b115200 -U lock:w:0x0F:m通过 Optiboot 烧应用程序avrdude -carduino -patmega168 -P/dev/ttyACM0 -b115200 -D -Uflash:w:out/klipper.elf.hex:i3. SAM3 / SAM4 微控制器Arduino Due / Duet WifiSAM3、SAM4 芯片通常不使用 Bootloader——芯片自带ROM 引导程序ROM bootloader可通过3.3V 串口或 USB直接编程 Flash。进入 ROM 的方法复位期间把 erase 引脚拉高这会擦除 Flash 内容并让 ROM 运行。Arduino Due在 programming usb port离电源最近的那个 USB 口上设置波特率1200即可触发该复位擦除序列编程工具使用 BOSSASAM3 建议1.9 及以上SAM4 必须1.8.0 及以上。SAM3Arduino Due烧写 Klipperbossac -U -p /dev/ttyACM0 -a -e -w out/klipper.bin -v -b bossac -U -p /dev/ttyACM0 -RSAM4Duet Wifi烧写 Klipperbossac --port/dev/ttyACM0 -b -U -e -w -v -R out/klipper.bin参数含义-U关掉自动校验前的解锁、-e擦除、-w写 Flash、-v校验、-b设置 boot 标志、-R复位芯片。Klipper 仓库 lib/bossac 中也内嵌了 BOSSA 源码供参考。4. SAMC21 微控制器Duet3D Toolboard 1LCSAMC21 通过ARM Serial Wire DebugSWD接口烧录通常使用专用 SWD 硬件烧录器也可以使用带 OpenOCD 的树莓派见本文第 11 节。Cold Plugging 模式如果板卡把 SWD 引脚复用作其他功能用 OpenOCD 前必须先把芯片置入 Cold Plugging 模式。在树莓派上可先执行以下 GPIO 操作SWCLK25、SWDIO24、SRST18SWCLK25 SWDIO24 SRST18 echo Exporting SWCLK and SRST pins. echo $SWCLK /sys/class/gpio/export echo $SRST /sys/class/gpio/export echo out /sys/class/gpio/gpio$SWCLK/direction echo out /sys/class/gpio/gpio$SRST/direction echo Setting SWCLK low and pulsing SRST. echo 0 /sys/class/gpio/gpio$SWCLK/value echo 0 /sys/class/gpio/gpio$SRST/value echo 1 /sys/class/gpio/gpio$SRST/value echo Unexporting SWCLK and SRST pins. echo $SWCLK /sys/class/gpio/unexport echo $SRST /sys/class/gpio/unexportOpenOCD 芯片配置source [find target/at91samdXX.cfg]烧写程序例如 Klipper 为 SAMC21 编译的固件at91samd chip-erase at91samd bootloader 0 program out/klipper.elf verify5. SAMD21 微控制器Arduino ZeroSAMD21 的 Bootloader 同样通过SWD 接口烧写专用 SWD 烧录器或树莓派 OpenOCD。用 OpenOCD 烧写 Bootloadersource [find target/at91samdXX.cfg]获取 Bootloader示例为 Arduino Zero 的samd21_sam_ba.binwget https://github.com/arduino/ArduinoCore-samd/raw/1.8.3/bootloaders/zero/samd21_sam_ba.bin烧写at91samd bootloader 0 program samd21_sam_ba.bin verify两种常见 Bootloader 布局差异务必区分板卡Bootloader 大小应用起始地址进入方式Arduino Zero8 KiB8 KiB0x2000双击复位按钮Arduino M016 KiB16 KiB0x4000复位后几秒内执行烧录命令Arduino Zero8 KiB烧写应用bossac -U -p /dev/ttyACM0 --offset0x2000 -w out/klipper.bin -v -b -RArduino M016 KiB烧写应用avrdude以 stk500v2 协议访问其串口 Bootloader复位 MCU 后须在开机的头几秒内执行avrdude -c stk500v2 -p atmega2560 -P /dev/ttyACM0 -u -Uflash:w:out/klipper.elf.hex:i6. SAMD51 微控制器Adafruit Metro-M4 等SAMD51 与 SAMD21 类似Bootloader 通过SWD烧写。OpenOCD 芯片配置SAMD51 系列使用atsame5x.cfgsource [find target/atsame5x.cfg]获取并烧写 Bootloader多个 Adafruit bootloader 均可用示例为 itsybitsy_m4 的 v3.7.0wget https://github.com/adafruit/uf2-samdx1/releases/download/v3.7.0/bootloader-itsybitsy_m4-v3.7.0.binat91samd bootloader 0 program bootloader-itsybitsy_m4-v3.7.0.bin verify at91samd bootloader 16384SAMD51 使用16 KiB Bootloader应用编译起始地址须为 16 KiB烧应用bossac -U -p /dev/ttyACM0 --offset0x4000 -w out/klipper.bin -v -b -R7. STM32F103 微控制器Blue Pill 等STM32F103 芯片自带ROM 引导程序可通过3.3V 串口烧写 Bootloader 或应用。典型接线把PA10MCU Rx与PA9MCU Tx接到 3.3V UART 适配器进入 ROM 需把boot 0 引脚置高、boot 1 引脚置低然后复位芯片。随后用stm32flash烧写stm32flash -w out/klipper.bin -v -g 0 /dev/ttyAMA0烧完后把boot 0 和 boot 1 都设回低让后续复位从 Flash 正常启动。树莓派注意事项若用树莓派 GPIO 提供 3.3V 串口stm32flash 协议使用的串口奇偶校验模式是树莓派 mini UART 不支持的需要先在树莓派上启用完整 UART参考树莓派官方文档 Configuring UARTs。7.1 STM32F103 stm32duino BootloaderUSB 烧录stm32duino 项目提供USB 烧录能力的 Bootloader。可通过 3.3V 串口烧写它wget https://github.com/rogerclarkmelbourne/STM32duino-bootloader/raw/master/binaries/generic_boot20_pc13.bin stm32flash -w generic_boot20_pc13.bin -v -g 0 /dev/ttyAMA0该 Bootloader 占用8 KiB Flash应用须以 8 KiB 起始地址编译。用dfu-util烧应用dfu-util -d 1eaf:0003 -a 2 -R -D out/klipper.binBootloader 只在开机后运行很短暂的一段时间运行期间板载 LED 会闪烁可能需要掐准时机执行上述命令或者把boot 0 置低、boot 1 置高让芯片复位后一直停留在 Bootloader。7.2 STM32F103 HID Bootloader免驱动 USB 烧录HID Bootloader是精简、免驱动的 USB 烧录 Bootloader另有针对SKR Mini E3 1.2的专用构建版本。通用 STM32F103 板如 Blue Pill可仿照上一节用 3.3V 串口 stm32flash 烧写只需把文件名换成对应的 HID bootloader 二进制Blue Pill 对应hid_generic_pc13.binSKR Mini E3其boot0 引脚直接接 GND、未引出无法用 stm32flash建议使用 STLink V2 STM32CubeProgrammer若没有 STLink也可用树莓派 OpenOCD芯片配置为source [find target/stm32f1x.cfg]可先备份当前 Flash耗时可能较长flash read_bank 0 btt_skr_mini_e3_backup.bin再烧写stm32f1x mass_erase 0 program hid_btt_skr_mini_e3.bin verify 0x08000000要点与警告上述示例先擦除整片再写 Bootloader无论用何种方式都建议烧写前先擦除芯片给 SKR Mini E3 换上此 Bootloader 后将无法再通过 SD 卡更新固件启动 OpenOCD 时可能需要按住板上的复位按钮直到 OpenOCD 输出类似Info : SWD DPIDR 0x1ba01477、Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints的信息后再松开复位。该 Bootloader 仅占用2 KiB Flash应用须以 2 KiB 起始地址编译。编译 hid-flash 工具Klipper 仓库内已内置源码 lib/hidflashsudo apt install libusb-1.0 cd ~/klipper/lib/hidflash make烧写 KlipperBootloader 运行期间执行~/klipper/lib/hidflash/hid-flash ~/klipper/out/klipper.bin也可直接用 Klipper 的make flashmake flash FLASH_DEVICE1209:BEBA若 Klipper 此前已被烧写过已有 USB CDC 设备节点make flash FLASH_DEVICE/dev/ttyACM0手动进入 HID Bootloader把 boot 0 置低、boot 1 置高。SKR Mini E3 没有引出 boot 1若烧的是hid_btt_skr_mini_e3.bin可把PA2 引脚拉低该引脚在 SKR Mini E3 PIN 文档中标注为 TFT 接口的 TX0旁边就有 GND 引脚可用。7.3 STM32F103 / STM32F072 MSC BootloaderU 盘式烧录MSC Bootloader是免驱动、可通过 USB 以**大容量存储设备U 盘**方式烧录的 Bootloader。烧写 Bootloader与 stm32duino 一节相同用 3.3V 串口 stm32flash替换为对应 MSC 二进制Blue Pill 对应MSCboot-Bluepill.binSTM32F072还可用 DFU 直接经 USB 烧写 Bootloaderdfu-util -d 0483:df11 -a 0 -R -D MSCboot-STM32F072.bin -s0x08000000:leave该 Bootloader 占用8 KiB 或 16 KiBFlash具体见 Bootloader 说明应用须以对应起始地址编译。使用方式双击板卡复位按钮激活 Bootloader板子随即以 USB 闪存盘形式出现直接把klipper.bin复制进去即可。7.4 STM32F103 / STM32F0x2 CanBootKatapultBootloaderCANBUS 远程刷写CanBoot现更名为KatapultBootloader 提供通过 CANBUS 上传 Klipper 固件的能力其本身派生自 Klipper 源码。目前支持 STM32F103、STM32F042、STM32F072。推荐用 ST-Link 烧写 CanBootSTM32F103 也可用stm32flashSTM32F042/072 可用dfu-util参照本文前述方法把文件名换成canboot.bin首次烧写CanBoot 后它会检测到无应用而自动进入 Bootloader若未进入可连续按两次复位按钮手动进入。Klipper 仓库在 lib/katapult/flashtool.py 中提供了flashtool.py工具对应文档中的flash_can.py用于上传固件。烧录需要设备 UUID可先查询当前处于 Bootloader 的节点python3 flash_can.py -q该命令会返回所有未分配 UUID 的节点包含当前处于 Bootloader 的全部节点。拿到 UUID 后上传固件python3 flash_can.py -i can0 -f ~/klipper/out/klipper.bin -u aabbccddeeff其中aabbccddeeff替换为你的 UUID-i与-f可省略默认分别为can0与~/klipper/out/klipper.bin。为 CanBoot 编译 Klipper 时请在make menuconfig中选择 8 KiB Bootloader 选项。8. STM32F4 微控制器SKR Pro 1.1 等STM32F4 自带系统 Bootloader支持 USBDFU、3.3V 串口等多种方式详见 ST 文档 AN2606。但部分板卡如 SKR Pro 1.1无法进入 DFU Bootloader此时可选HID BootloaderSTM32F405/407 板仓库提供了针对 SKR Pro 1.1 的构建版本。除 DFU 外最通用的方式仍是3.3V 串口 stm32flash流程同 STM32F103wget https://github.com/Arksine/STM32_HID_Bootloader/releases/download/v0.5-beta/hid_bootloader_SKR_PRO.bin stm32flash -w hid_bootloader_SKR_PRO.bin -v -g 0 /dev/ttyAMA0该 Bootloader 在 STM32F4 上占用16 KiB Flash应用须以 16 KiB 起始地址编译。上传二进制同样使用 hid-flash 工具编译与用法见 7.2 节。手动进入 Bootloader把 boot 0 置低、boot 1 置高后插电烧写完成后拔掉电源并把 boot 1 设回低应用才会被加载。9. LPC176x 微控制器Smoothieboard本文不介绍 LPC176x Bootloader 自身的烧写方法可参考 Smoothieware 官网的 flashing the bootloader 专题。Smoothieboard 常见预装 Bootloader 来自 triffid 的LPC17xx-DFU-Bootloader项目。使用该 Bootloader 时应用须以 16 KiB 起始地址编译。最简单的应用烧写方式是把应用文件如out/klipper.bin复制为 SD 卡上的firmware.bin然后用这张 SD 卡重启 MCUBootloader 会自动完成烧写。Klipper 的 scripts/flash_usb.py 也提供了flash_lpc176x等 USB 烧写路径支持samd、same5、lpc176、stm32f103等目标可作为 USB 连接的补充手段。10. LPC176x 之外的其它平台的 Bootloader 概念补充从 Klipper 源码可以直观看到各平台bootloader_request的实现差异详见第 12 节例如 src/stm32/stm32f1.c 在MACH_STM32F1上会把 HID Bootloader magic key 写入备份寄存器再复位从而进入 HID Bootloadersrc/lpc176x/main.c 则通过 USB 断开重连进入 LPC17xx-DFU-Bootloadersrc/rp2040/main.c 调用bootrom_reboot_usb_bootloader()进入 RP2040 的 USB ROM Bootloader。这些差异正是每个 Bootloader 步骤各不相同的代码级写照。11. 在树莓派上运行 OpenOCDOpenOCD是一款能做底层芯片烧写与调试的软件包可通过树莓派 GPIO 引脚与多种 ARM 芯片通信。本节方法源自 Adafruit 的公开教程是烧写 SAMD/SAMC21/STM32F1 等芯片的通用手段。11.1 下载与编译每步可能耗时数分钟make可能超过 30 分钟sudo apt-get update sudo apt-get install autoconf libtool telnet mkdir ~/openocd cd ~/openocd/ git clone http://openocd.zylin.com/openocd cd openocd ./bootstrap ./configure --enable-sysfsgpio --enable-bcm2835gpio --prefix/home/pi/openocd/install make make install11.2 配置 OpenOCD创建配置文件nano ~/openocd/openocd.cfg内容示例使用树莓派 GPIO25SWDCLK、GPIO24SWDIO、GPIO18nRST# Uses RPi pins: GPIO25 for SWDCLK, GPIO24 for SWDIO, GPIO18 for nRST source [find interface/raspberrypi2-native.cfg] bcm2835gpio_swd_nums 25 24 bcm2835gpio_srst_num 18 transport select swd # Use hardware reset wire for chip resets reset_config srst_only adapter_nsrst_delay 100 adapter_nsrst_assert_width 100 # Specify the chip type source [find target/atsame5x.cfg] # Set the adapter speed adapter_khz 40 # Connect to chip init targets reset halt其中source [find target/atsame5x.cfg]需按目标芯片替换为前文各节给出的配置at91samdXX.cfg、stm32f1x.cfg等。11.3 接线安全第一接线前必须同时关闭树莓派与目标芯片的电源并确认目标芯片工作电压为3.3V再与树莓派连接。接线映射目标芯片引脚树莓派引脚GNDGNDSWDCLKGPIO25SWDIOGPIO24RSTGPIO18随后给树莓派上电并给目标芯片供电。11.4 运行 OpenOCDcd ~/openocd/ sudo ~/openocd/install/bin/openocd -f ~/openocd/openocd.cfg正常时 OpenOCD 会打印一些文本消息然后停留等待不应立即返回 shell 提示符。如果 OpenOCD 自行退出或持续刷消息请重新检查接线。OpenOCD 稳定运行后可通过 telnet 发送命令另开一个 SSH 会话telnet 127.0.0.1 4444退出 telnet按Ctrl]然后输入quit。11.5 OpenOCD 与 gdb 联合调试 Klipper可在桌面级机器上用 gdb 调试 Klipper。先在 OpenOCD 配置文件中追加bindto 0.0.0.0 gdb_port 44444重启树莓派上的 OpenOCD然后在桌面机器上执行cd /path/to/klipper/ gdb out/klipper.elf在 gdb 内连接target remote octopi:44444把octopi替换为树莓派的主机名。连接成功后即可设置断点、查看寄存器。12. 从 Klipper 侧请求进入 BootloaderKlipper 提供了多种软请求进入 Bootloader 的方式详见 docs/Bootloader_Entry.md配合本文各节可大幅简化刷机流程虚拟串口USB-ACM在 1200 波特率下脉冲 DTR 即请求 Bootloader。可用 scripts/flash_usb.pycd klipper/scripts python3 -c import flash_usb as u; u.enter_bootloader(DEVICE)或 picocompicocom -b 1200 DEVICE后按Ctrl-ACtrl-P物理串口发送字符串SPACEFSSPACERequest Serial Bootloader!!SPACE~FS为 ASCII 0x1c。Shell 方式stty BAUD /dev/DEVICE echo $~ \x1c Request Serial Bootloader!! ~ /dev/DEVICECANBUS通过 CAN 管理消息请求即使设备已有 nodeid 或处于 shutdown 也生效CANBridge 模式同样适用。用 Katapult 的flashtool.pypython3 ./katapult/scripts/flashtool.py -i CAN_IFACE -u UUID -r-i can0可省略UUID 查询见 docs/CANBUS.md。Klipper 收到上述请求后的行为源码佐证若安装了 Katapult原 CanBootKlipper 会请求 Katapult 在下一次启动保持活动并复位 MCU否则进入平台相关 Bootloader如 STM32 的 DFU 模式。这一逻辑在源码中有多处体现例如 src/generic/serial_irq.c 检测物理串口魔术串并调用bootloader_request()、src/generic/usb_cdc.c 处理 1200 波特率 DTR 请求、src/generic/canserial.c 处理 CAN 管理消息最终都汇聚到各平台 board/misc.h 声明的bootloader_request()。STM32 DFU 警告部分板卡如 Octopus Pro v1进入 DFU 模式可能引发意外行为例如 DFU 模式下加热器上电。进入 DFU 前务必断开加热器等执行机构并查阅板卡文档确认。13. 编译 Klipper 时的 Bootloader 偏移配置Kconfig 对应关系前文反复强调应用必须以 XX KiB 起始地址编译这正是 Klipper 编译时在make menuconfig中配置的。在 src/stm32/Kconfig 的 Bootloader offset 菜单中可按所选 Bootloader 选择对应偏移例如2 KiB bootloaderHID Bootloader如MACH_STM32F1038 KiB bootloaderstm32duino、CanBoot/Katapult 等16 KiB bootloaderMSC 变体、部分 STM32F207/F401/F4x5/F072 等20 KiB / 28 KiB / 32 KiB / 34 KiB / 36 KiB / 48 KiB / 64 KiB / 128 KiB等针对不同芯片与 Bootloader 的选项No bootloader应用从 Flash 起始地址开始适用于无 Bootloader 方案。AVR 与其它平台同理——例如本文 2.6 节 Atmega168 用 Optiboot 后留给应用的 Flash 更小务必在编译时选择正确的 Bootloader 配置使固件起始地址与 Bootloader 占用的偏移一致否则固件无法被 Bootloader 正确加载。14. 常见误区与安全操作清单能用烧 Bootloader 的硬件烧应用但别这么做ISP/SWD 直写会覆盖整个 Flash操作不当会抹掉 Bootloader之后只能重新借助专用硬件熔丝位AVR与偏移ARM不能错AVR 的 lock/efuse/hfuse/lfuse 位、ARM 的 Bootloader offset 都必须与所用 Bootloader 严格匹配SKR Mini E3 换 HID Bootloader 后将失去 SD 卡更新能力务必想清楚再动手接线前断电、确认 3.3V 电平树莓派 GPIO 直连目标芯片前必须核对电平防止损坏进入 DFU 前断开加热器避免 DFU 模式下意外上电烧录前先备份如 OpenOCD 的flash read_bank关键时刻可回滚。15. 结语本文完整复刻并扩展了 docs/Bootloaders.md 的全部内容从 AVR 的 avrdude/熔丝位流程到 SAM 系列的 BOSSA/SWD 方案再到 STM32 家族 stm32duino/HID/MSC/Katapult 四类 Bootloader 与 LPC176x 的 SD 卡刷写最后给出树莓派 OpenOCD 调试刷写与 Klipper 侧软请求 Bootloader 的完整方案。结合 Klipper 源码中bootloader_request的实现与 src/stm32/Kconfig 的偏移配置你可以对照板卡型号快速定位正确的烧录路径。无论你是第一次给 Blue Pill 刷 Klipper还是要在 SKR 系列板卡上折腾 HID/Katapult Bootloader本文都能作为可靠的速查手册。【免费下载链接】klipperKlipper is a 3d-printer firmware项目地址: https://gitcode.com/GitHub_Trending/kl/klipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考