目 录CONTENT

文章目录

使用Arduino开发板给3D打印机主控芯片刷入bootloader

成培培
2026-01-22 / 0 评论 / 0 点赞 / 8 阅读 / 0 字

前情提要:创想三维3D打印机Ender-3S升级Klipper固件
之前我想给我的打印机更新Klipper固件,结果因为出厂的主控芯片不带Bootloader,导致我没发串口线刷固件,经过一番折腾还是决定买块Arduino Nano开发板来解决Bootloader的问题,正常其实应该买个USBasp下载器,不过买个开发板我以后还能玩,顺便学习下Arduino也好。

给开发板刷ArduinoISP

之前本来准备折腾stm32刷入ArduinoISP的,见这篇博文:Arduino环境下开发STM32
虽然可能行不通,不过Arduino环境还是搭建起来了,接着这里开始刷就简单了,我这个开发板type-c接口是支持串口的,所以直接用A to C线把它和电脑连起来就好了,然后打开ArduinoIDE选择示例程序:
https://www.chengpei.top/upload/ArduinoISP_program.png
弹出了新的窗口,工具里选择开发板和端口,就可以直接点击左上角的验证和上传把代码烧录到你的开发板上了,成功后这块开发板就变成了一个ISP下载器,可以代替USBasp了

硬件接线

电脑和开发板已经通过串口连接了,剩下的就是开发板和打印机主板连接了,其实就是ISP的6根线:

Arduino Nano 引脚 打印机主板 ISP 引脚
D11 MOSI
D12 MISO
D13 SCK
D10 RESET
GND GND
5V VCC(可选,不推荐)

VCC不推荐大概是怕供电不稳吧,但是前提是主板有单独供电,信号这边共地即可
这里差点踩坑,本来以为开发板的ISP接口和打印机主板的ISP接口一一对应连接即可,其实是错误的!上表前3个引脚开发板上跟ISP引脚确实对应,但是D10和开发板的RESET并不对应,所以主板ISP的RESET引脚必须拉线和开发板的D10引脚连起来

原厂固件备份

所有线接好后,刷入bootloader前第一步我准备把原厂固件备份一下,因为刷bootloader时原厂固件就没了

# 先测试一下线路是否正常
avrdude -c arduino \
  -P /dev/ttyUSB0 \
  -b 19200 \
  -p m1284p \
  -v
  
# 读取并保存 Fuse 位
avrdude -c arduino -P /dev/ttyUSB0 -b 19200 -p m1284p \
-U lfuse:r:lfuse.hex:h \
-U hfuse:r:hfuse.hex:h \
-U efuse:r:efuse.hex:h

# 完整备份 EEPROM
avrdude -c arduino -P /dev/ttyUSB0 -b 19200 -p m1284p \
-U eeprom:r:eeprom.bin:r

# 尝试读取 Flash
avrdude -c arduino -P /dev/ttyUSB0 -b 19200 -p m1284p \
-U flash:r:flash.bin:r

如果读取Flash失败了,大概是原厂主板锁死了 Flash 读取,那也只能放弃了,不过后续也可以通过编译Marlin固件还原,参考这篇博文:创想三维Ender-3S打印机Marlin固件编译
后续想还原用一下命令:

avrdude -c arduino -p m1284p \
-U flash:w:flash.bin:r \
-U eeprom:w:eeprom.bin:r \
-U lfuse:w:0xFF:m \
-U hfuse:w:0xD6:m \
-U efuse:w:0xFD:m

备份时踩到第一个坑,硬件连线确认没问题后,执行第一个测试命令就失败了,查了两个资料后了解到:
Arduino开发板为了方便烧写程序都有一套串口触发自动复位的设计,就是为了方便你在ArduinoIDE里点击上传程序可以方便的烧录,而不用像stm32那样手动通过boot0引脚切换来使程序复位到bootloader中,但是这么一个方便的设计放到我们这个场景中就弄巧成拙了,本来开发板运行着ISP程序,使用avrdude命令进行相关操作时,执行命令PC打开串口触发串口DTR信号,开发板一下就复位进入bootloader模式了,后续命令后不认识了。
这里有两种解决方案:

  1. 在开发板的REST引脚和GND引脚之间接一个10µF 电容,就可以完全禁用自动复位,ArduinoISP程序始终常驻,不过这样搞后面要烧录其他程序就麻烦了,那我还不如买个USBasp
  2. 在执行 avrdude 命令前按住开发板的 RESET,开始后立刻松开,这样做可以手动把PC打开串口时的DTR 触发的复位脉冲吃掉,松开时直接运行 ArduinoISP接收接下来的指令,我就是用的这种方法,对手速有一定要求,不过熟练后成功率很高!

获取optiboot_atmega1284p.hex刷入

备份好后就准备正式给打印机刷入bootloader了,首先要找到bootloader,由于打印机主控是ATmega1284P,Arduino官网并没有直接支持这个芯片,得着第三方开源项目Sanguino来获取这个芯片的相关程序
github地址:https://github.com/Lauszus/Sanguino
从他的描述页面找到板卡管理器地址:
https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json
添加到ArduinoIDE设置的其他开发板管理器地址里,就跟之前添加STM32的一样,添加好后在开发板管理器里搜索Sanguino并安装,工具里就可以选择这个开发板以及打印机对应的主控芯片型号了,再选好端口,以及编程器:Arduino as ISP,就可以点击烧录引导程序来开始刷入bootloader了
自动复位的问题解决后,在此又踩到第二个坑,通过ArduinoIDE操作给主板刷入bootloader时报错了:
具体报错我没有截图,反正就是因为我的MacOS系统导致的版本不兼容,如果你用windows可能不会出现,就算出现也有其他方式解决,就是不要用ArduinoIDE去刷打印机的bootloader,而改用以下命令:

# 设置 Fuse(为 Optiboot 做准备)
avrdude \
  -c arduino \
  -p atmega1284p \
  -P /dev/tty.usbserial-14210 \
  -b 19200 \
  -e \
  -U lock:w:0x3F:m \
  -U efuse:w:0xFD:m \
  -U hfuse:w:0xDE:m \
  -U lfuse:w:0xFF:m
# 写入 Optiboot 本体
avrdude \
  -c arduino \
  -p atmega1284p \
  -P /dev/tty.usbserial-14210 \
  -b 19200 \
  -U flash:w:optiboot_atmega1284p.hex:i
# 锁定 Bootloader 区(推荐)
avrdude \
  -c arduino \
  -p atmega1284p \
  -P /dev/tty.usbserial-14210 \
  -b 19200 \
  -U lock:w:0x0F:m

其实ArduinoIDE的烧录引导程序也是在调用这些命令,不过别忘了替换-P参数为你的串口

刷入Klipper

bootloader成功刷入后,就可以接着我这边的klipper下位机安装的步骤进行下去了:
Klipper安装-下位机安装

至此我已经将我的Ender-3S刷为了Klipper固件,配合一个树莓派上位机,目前打印速度翻倍了,而且还有更重要的网床校准功能,虽然Marlin固件也有网床校准功能,但是在我这颗8位主控上想跑估计不太行,Flash都不够

0

评论区