番外二:使用 UART 接口连接主板通讯
参考文档:https://klipper.wiki/index.php/UART
除了使用传统的USB数据线连接上位机,我们还可以使用UART,它支持所有主板。
通过UART连接的优点是:
- 机身面板上没有数据线(封在电源仓内的除外)
- 可以连接没有 USB 接口的设备
- 方便刷写升级 STM32 设备固件和引导
- 对于没有 USB 主板供电选择开关的设备,可以避免
USB 5v
和主板24v供电混合
缺点:
- 需要 GPIO 引脚进行连接,这在 x86 计算机和笔记本电脑上是不可能的
- 需要额外配置单板计算机
- 无法访问 DFU,这在某些情况下导致无法在没有 SD 卡的情况下重新刷新电路板
大多数开发板以及部分电视盒子拥有 UART 接口可以直接使用,而树莓派比较特殊,所以单独叙述。
1.1 树莓派
树莓派有一个 miniuart
接口,还有一个全功能 UART 接口。前者有些限制所以不适用于 Klipper,后者有时候被板载的蓝牙模块占用。另外不同版本的树莓派也有差异,具体可以参考 RPi UART 文档 。
sudo raspi-config
# 【3 Interface Options】 - 【P6 Serial Port】 - 【NO】 - 【Yes】
sudo nano /boot/config.txt
#####################################################
## 在最后添加以下内容
enable_uart=1 # 没有则添加
dtoverlay=disable-bt # 除 RPi3 的其他版本树莓派
core_freq=250
# dtoverlay=pi3-disable-bt # 树莓派3 特殊设置
#####################################################
## 禁用蓝牙相关服务
sudo systemctl disable hciuart.service
sudo systemctl disable bluetooth.service
## 重启生效
sudo reboot
注意:
disable-bt
| 关闭蓝牙设备
sudo systemctl disable hciuart
| 关闭蓝牙服务
miniuart-bt
| 不要使用该 overlay。设置蓝牙设备使用 mini UART, 但会降低最大可用串口通讯波特率
force_turbo=1
或 core_freq=250
| 设置 VPU 核心时钟来固定频率
对应的配置文件如下:
# printer.cfg
[mcu] # 通过 ls /dev/ttyAMA* 来确定
serial: /dev/ttyAMA0
restart_method: command
# [mcu 2ndMCU] # 设置第2个MCU
# serial: /dev/ttyAMA0
# restart_method: command
接线方式:
树莓派 |
GND(Pin6/9) |
GPIO14(TX,Pin8) |
GPIO15(RX,Pin10) |
GPIO26(Pin37)* |
3.3v(Pin1)* |
MCU |
GND |
RX |
TX |
boot0 |
3.3v |
注意:
- 使用前3个引脚即可以通讯
- 后2个标记星号的为可选,用于刷写引导和固件。GPIO26 也可以换成其他未使用的引脚。
1.2 香橙派等其他设备
这些设备一般拥有独立的调试串口和额外 UART ,具体请参考其手册,使用调试串口需要关闭终端和内核信息输出功能。采用传统的接线方式即可。
以 Armbian 为例,修改 /boot/armbianEnv.txt
并添加对应的 overlays
。它们的设备好可以通过 ls /dev/ttyS*
查看。
【MKS Robin Nano v1.2 接线示意图】 请注意,有些主板的 UART 接口用于连接 WiFi模块后者其他设备。
番外三:不需要 microSD 卡的线刷模式
目前大多数32位主板需要通过拷贝固件到 SD卡刷来更新固件。那么有没有办法不用每次升级时要打开盖子插拔SD卡呢?
1. 官方伪线刷方法(SD updates)
Klipper 提供了一种伪线刷的方式,具体可以参考官方文档 SDCard updates,目前支持的主板可以通过 ~/klipper/scripts/flash-sdcard.sh -l
进行查询。kiauh 助手默认支持这种方式,但是需要插一张 SD 卡在主板上。
- 此方法仅适用于固件升级,你仍然需要通过传统方式安装 Klipper 固件
- 此方法仅适用于 SPI 接口的 SD 卡插槽,不支持 SDIO 接口(例如 Flyboard 以及 MKS Robin Nano V1/V2 等)
2. 新的线刷方法
在上面学习为STM32烧录引导和固件的过程中,我们联想到将树莓派的 GPIO引脚与最小系统的 BOOT0 引脚连接,即可以通过网页控制,切换MCU的boot0状态,闭合为高电平(ISP烧录模式),断开为低电平(正常运行模式),从而实现不需要microSD卡的固件线刷。
- 此方法可以用于 Klipper 固件首次烧录、升级,以及 bootloader 烧录
- 此方法不需要额外的 microSD 卡
- 【结论】STM32F103 和 STM32F4 都测试成功
是否可行,我们验证一下。此外,由于 Klipper 包括上位机和下位机才能运行和读写引脚,所以我们不能在 printer.cfg
里面进行设置,这里使用 moonraker 进行控制。
# moonraker.cfg
[power boot0]
type: gpio
pin: gpiochip0/gpio26 # 根据喜好和实际情况设置,用于输出设置 `boot0` 的高/低电平,需要共地
off_when_shutdown: True
initial_state: off
2.1 UART 模式通讯
此种模式除了 boot0 线之外,需要额外的三根线连接:GND、Rx、Tx。
此种方式适用于引出 boot0
的设备,比如 monster8 主板,否则无法使用,比如 boot0 接地的 robin nano v2
- 此时选择
No bootloader
,并且会覆盖之前烧录的 stm32duino bootloader
- 晶振频率请根据实际情况选择,可以在原理图上找到,我这里是
8 MHz
- 通讯端口我这里选择
USART1 Serial
,对应引脚为 PA10(Rx)和 PA9(Tx),也可以选择其他 UART 引脚
- 一定要确认通讯过程中良好接线
# 点击右上角 power,闭合开关使 boot0 为高信号,断开并重新给主板上电,使其进入 ISP 烧录模式
# 查看设备信息
sudo stm32flash /dev/ttyAMA0
# 刷入固件
sudo stm32flash -w ~/klipper/out/klipper.bin -v -g 0 /dev/ttyAMA0
# 刷入 bootloader,这里不需要,会被覆盖
# sudo stm32flash -w generic_boot20_pc13.bin -v -g 0 /dev/ttyAMA0
2.2 USB 模式通讯
此种模式除了 boot0 线之外,需要通过 USB 数据线与树莓派连接。
此种方式由于可以自定义进入 bootloader 的按键,所以不需要引出 boot0 也可以使用。但是需要主板支持使用 SWD 协议刷入引导。话说回来,有些主板既没有引出 boot0,又没有引出 SWD 引脚,SD卡又是通过 SDIO 协议通讯的,这种乖乖用 microSD 卡更新吧,说的就是 MKS Robin Nano v1/v2。
- 此时选择
8KiB bootloader
,烧录固件后不会覆盖,板载 LED 灯可以正常指示 bootloader 状态。
- 晶振根据实际情况选择
- 通讯接口选择USB,必要时查看原理图确认。
- 烧录方法和上面一样:
sudo dfu-util -d 1eaf:0003 -a 2 -R -D ~/klipper/out/klipper.bin