自行构建RepRapFirmware固件
本文最后更新于:2026年6月7日 晚上
前言
RepRapFirmware是一款开源且功能全面的运动控制固件,广泛用于各种DIY机器,常见于CNC和3D打印,也可以自定义各种复杂运动学,并且无需其他硬件,全部控制由ARM芯片完成,进一步提升了机器运行时的稳定性。
该官方固件目前只适配了Duet出品的主板,而第三方开源主板并不能使用,好在gloomyandy对其进行了扩展,适配了部分开源3D打印主板,但是随着RRF源码变得越来越复杂,构建的固件体积也越来越大,截止到目前稳定版本(v3.6),已经有相当一部分的主板由于芯片Flash空间只有512Kb而被淘汰(仅可以使用之前的老版本),当前最新稳定版仅支持Flash空间大于或等于1024Kb的芯片才可使用。
其实还有一小部分支持的主板可以使用当前最新版的RRF固件,例如:MKS Robin Nano V3.0(STM32F407VGT6),可不知为何gloomyandy并未发布相关固件,所以在查阅大量资料后,打算自己在本地来构建该主板可用的RRF固件,并对过程进行记录,仅供参考。
安装工具
安装构建所需工具请查看网页说明:Firmware Building Instructions
对于编译工具链请查看以下说明:Instructions for building under Windows,请根据具体构建的RRF版本选择合适的工具链版本,否则后续构建可能会报错。
项目分析
构建流程
以下构建流程分析来自DeepSeek AI,请注意甄别
1 | |
观察并打开各流程的文件进行查看,暂时不要修改任何文件,直接在Git Bash终端运行任务build octopus pro f4 firmware进行初次构建,留意构建日志信息。
构建日志
1 | |
RRFBuild项目已经对源码进行了封装与集中化管理,在编译构建时不涉及任何PIN引脚功能配置(默认硬件核心功能除外),生成的base_stm32f4.bin文件对于STM32F4系列芯片为通用文件(可搭配SD卡sys文件夹中的board.txt、rrfboot.txt、rrfpins.txt进行自定义使用),只在最后步骤使用CrcAppender工具对相应boards文件夹下的板级描述文件(rrfboot.txt、rrfpins.txt)进行打包合并,生成适用于对应主板的firmware_octopuspro1_0_f4.bin文件。
这也体现了RepRapFirmware固件的一个特点:编译时硬件无关,运行时动态选择,所以接下来我们只需要编写一个适合MKS Robin Nano V3.0(STM32F407VGT6)主板的板级描述文件,然后让工具打包生成所需固件即可。
构建便捷固件
便捷固件构建简单快捷,无需过多修改原项目的文件即可构建出RRF固件,但是需要先使用Jlink等工具通过SWD接口烧录一个其他相同芯片型号的主板Bootloader(对于本次使用的主板可以选择Fly E3 V2),然后再根据Bootloader的偏移量烧录RRF固件,但这种与主板不匹配的Bootloader可能会在实际使用过程造成启动失败,请谨慎操作,该方法仅作为实验性质提出。
如需专用且匹配的Bootloader,请查看后续构建稳定固件方法。
新建板级描述文件
在boards文件夹下,新建一个mks/robin_nano_f4文件夹,新建以下文件并填入相应内容:
boards\mks\robin_nano_f4\rrfboot.txt
WIFI模块为ESP-12F(ESP8266)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31board=robin_nano_f4
board.longName="MKS Robin Nano V3.0 STM32F4"
sdcard.internal.type=3
SPI0.pins={A.5,A.6,A.7}
SPI1.pins={B.13,C.2,C.3}
SPI2.pins={C.10,C.11,C.12}
SPI3.pins={D.0,D.1,D.14}
SPI4.pins={NoPin,NoPin,NoPin}
SPI5.pins={NoPin,NoPin,NoPin}
stepper.powerEnablePin=NoPin
stepper.enablePins={E.4,E.1,B.8,B.3,A.3}
stepper.stepPins={E.3,E.0,B.5,D.6,D.15}
stepper.directionPins={E.2,B.9,B.4,D.3,A.1}
stepper.numSmartDrivers=5
stepper.TmcUartPins={D.5,D.7,D.4,D.9,D.8}
stepper.spiChannel=3
sbc.TfrReadyPin=NoPin
sbc.csPin=NoPin
sbc.spiChannel=255
pins.SetHigh = {B.12}
serial.aux.rxTxPins = {NoPin,NoPin}
wifi.espDataReadyPin=C.13
wifi.TfrReadyPin=C.7
wifi.espResetPin=E.9
wifi.csPin=C.15
wifi.spiChannel=1
wifi.serialRxTxPins={A.10,A.9}
heat.tempSensePins={C.0,C.1,A.2}
accelerometer.spiChannel=0
can.spiChannel=255▶参数含义以下内容来自RepRapFirmware\src\Hardware\STM32\BoardConfig.cpp文件,并对其中各项参数进行中文注释,翻译不一定准确,具体参数功能请查阅项目源码以及Board.txt Configurables Applicable to STM32网页介绍。
由于RRF固件是逐行解析rrfboot.txt文件,所以对参数定义顺序有要求,部分重要参数不能随意调换位置,可查看boards文件夹下的其他板级描述文件作为参考。
请注意,不是每个参数必须定义然后对其进行配置,部分参数有其默认值,详情请查阅项目源码。
Nomal
board:主板简称board.longName:DuetWebControl网页显示的主板完整名称leds.diagnostic:LED诊断指示灯引脚leds.diagnosticOn:配置LED诊断指示灯引脚的逻辑电平,默认值为trueleds.activity:CAN-FD指示灯引脚leds.activityOn:配置CAN-FD指示灯引脚的逻辑电平,默认值为truePin States
pins.SetHigh:设置引脚初始化为高电平,最多可配置16个引脚pins.SetLow:设置引脚初始化为低电平,最多可配置16个引脚Internal SDCard
sdcard.internal.type:内部SD卡通道组,默认值为SD_UNKNOWN,可配置为以下选项(输入分析结论中的数字即可):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22//以下内容来自RepRapFirmware\src\Hardware\STM32\BoardConfig.cpp文件的第58行
typedef enum {
SD_SPI1_A, //enum SDConfigs::SD_SPI1_A = 0
SD_SPI1_B, //enum SDConfigs::SD_SPI1_B = 1
SD_SDIO, //enum SDConfigs::SD_SDIO = 2
SD_SPI3_A, //enum SDConfigs::SD_SPI3_A = 3
SD_SPI3_B, //enum SDConfigs::SD_SPI3_B = 4
SD_SPI2_A, //enum SDConfigs::SD_SPI2_A = 5
SD_UNKNOWN = 0xfe, //enum SDConfigs::SD_UNKNOWN = 254
SD_NONE = 0xff //enum SDConfigs::SD_NONE = 255
} SDConfigs;
/*以下分析结论来自RepRapFirmware\src\Hardware\STM32\BoardConfig.cpp文件的第59行与第598行
0:SD_SPI1_A 对应的引脚号为:PA5(SCK)、PA6(MISO)、PB5(MOSI)、PA4(CS)
1:SD_SPI1_B 对应的引脚号为:PA5(SCK)、PA6(MISO)、PA7(MOSI)、PA4(CS)
2:SD_SDIO 对应的引脚号为:PC8(SDIO_D0)、PC9(SDIO_D1)、PC10(SDIO_D2)、PC11(SDIO_D3)、PC12(SDIO_CK)、PD2(SDIO_CMD)
3:SD_SPI3_A 对应的引脚号为:PC10(SCK)、PC11(MISO)、PC12(MOSI)、PC9(CS)
4:SD_SPI3_B 对应的引脚号为:PC10(SCK)、PC11(MISO)、PC12(MOSI)、PA15(CS)
5:SD_SPI2_A 对应的引脚号为:PB13(SCK)、PB14(MISO)、PB15(MOSI)、PB12(CS)
254:SD_UNKNOWN 未知SD卡
255:SD_NONE 无SD卡
*/sdCard.internal.spiFrequencyHz:内部SD卡SPI通道频率,默认值为25000000,即频率为25MHzExternal SDCard
sdCard.external.csPin:外部SD卡Cs引脚,默认值为NoPinsdCard.external.cardDetectPin:外部SD卡检测引脚,默认值为NoPinsdCard.external.spiFrequencyHz:外部SD卡SPI通道频率,默认值为4000000,即频率为4MHzsdCard.external.spiChannel:外部SD卡使用的SPI通道组,可以配置为SPI Channel中的SPI通道组,也可配置为以下默认选项,默认值为SSPNONE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31//以下内容来自CoreN2G\src\STM32\SharedSPI\SPI.h文件的第22行
enum SSPChannel : uint8_t
{
//Hardware SPI
SSP1 = 0, // SPI0
SSP2, // SPI1
SSP3, // SPI2
//Software SPI
SWSPI0, // SPI3
SWSPI1, // SPI4
SWSPI2, // SPI5
//Additional Hardware devices
# if STM32H7
SSP4, // SPI6
SSP5, // SPI7
SSP6, // SPI8
# endif
SSPMAX, // Unknown configuration
// Hardware SDIO
SSPSDIO = 0xef, //239
// Not defined
SSPNONE = 0xff //255
};
//以下内容来自RepRapFirmware\src\Hardware\STM32\BoardConfig.cpp文件的第598行
{SSP1, {PA_5, PA_6, PB_5, PA_4, NoPin, NoPin}, {0x502, 0x502, 0x502, 0x1}}, // SKR Pro
{SSP1, {PA_5, PA_6, PA_7, PA_4, NoPin, NoPin}, {0x502, 0x502, 0x502, 0x1}}, // GTR
{SSPSDIO, {PC_8, PC_9, PC_10, PC_11, PC_12, PD_2}, {0xc02, 0xc02, 0xc02, 0xc02, 0xc02, 0xc02}}, // Fly/SDIO
{SSP3, {PC_10, PC_11, PC_12, PC_9, NoPin, NoPin}, {0x602, 0x602, 0x602, 0x1}}, // MKS?
{SSP3, {PC_10, PC_11, PC_12, PA_15, NoPin, NoPin}, {0x602, 0x602, 0x602, 0x1}}, // BTT BX
{SSP2, {PB_13, PB_14, PB_15, PB_12, NoPin, NoPin}, {0x502, 0x502, 0x502, 0x1}}, // BTT kraken?SPI Channel
SPI0.pinsSPI1.pinsSPI2.pinsSPI3.pinsSPI4.pinsSPI5.pinsSPI6.pinsSPI7.pinsSPI8.pins
SPI通道组,严格遵循以下定义顺序:SCK, MISO, MOSI- 对于构建STM32F4系列芯片,其中0、1、2必须是硬件SPI;而3、4、5则是软件SPI,必须申明0~5所有的SPI通道组,若实际芯片没有使用这么多SPI通道,未使用可以填写NoPin
- 对于构建STM32H7系列芯片,其中0、1、2、6、7、8必须是硬件SPI;而3、4、5则是软件SPI,必须申明0~8所有的SPI通道组,若实际芯片没有使用这么多SPI通道,未使用可以填写NoPin
Steppers
stepper.powerEnablePin:电机驱动电源使能引脚,没有则填写NoPinstepper.enablePins:电机驱动Enable引脚组,STM32最多支持11个驱动stepper.stepPins:电机驱动Step引脚组,STM32最多支持11个驱动stepper.directionPins:电机驱动Dir引脚组,STM32最多支持11个驱动stepper.digipotFactor:数字电位器系数(电路板是否内置了通过数字电位器实现的电流控制功能?)stepper.TmcUartPins:TMC22XX驱动Uart引脚组,STM32最多支持11个驱动stepper.DriverType:电机驱动类型组,可配置为以下选项:1
2
3
4
5
6
7
8
9
10
11
12
13
14//以下选项来自以下RepRapFirmware\src\Hardware\STM32\Pins_STM32.h文件的第202行
NamedEnum(DriverType, uint8_t,
unknown,
none,
stepdir,
tmcuartauto,
tmc2208,
tmc2209,
tmc2660,
tmcspiauto,
tmc5160,
tmc2240,
tmcauto,
invalid);stepper.num5160Drivers:支持TMC5160电机驱动总个数,驱动号必须从0开始stepper.numSmartDrivers:支持TMC22XX电机驱动总个数,驱动号位于TMC5160之后,且必须从0开始stepper.spiChannel:电机驱动使用的SPI通道组,详细配置说明请查看External SDCard ->sdCard.external.spiChannel,默认值为SSPNONEstepper.csDelay:电机驱动SPI通道Cs延迟时间stepper.TmcDiagPins:TMC驱动Diag引脚组ATX Power
atx.powerPin:ATX电源引脚,没有则填写NoPinatx.powerPinInverted:配置ATX电源引脚的逻辑电平,默认值为falseatx.initialPowerOn:ATX电源初始化时开启引脚,默认值为truePower
power.VInDetectPin:电源电压监测引脚,没有就填写NoPinpower.voltage:电源电压,默认值为24SBC Cofig
sbc.TfrReadyPin:SBC模式传输就绪引脚sbc.csPin:SBC模式Cs引脚,默认值为PB12(SD_SPI2_A CS)sbc.spiChannel:SBC模式使用的SPI通道组,详细配置说明请查看External SDCard ->sdCard.external.spiChannel,默认值为SSP2sbc.loadConfig:SBC模式是否从单板计算机加载配置,默认值为true- 该选项为true,且External SDCard ->
sdCard.external.spiChannel配置为SSPNONE,代表没有外部SD卡,因此SBC模式会从单板计算机加载board.txt文件 - 该选项为true,且External SDCard ->
sdCard.external.spiChannel配置外部SD卡,不管外部SD卡是否存放board.txt文件,都会优先从单板计算机上进行加载 - 该选项为false,且External SDCard ->
sdCard.external.spiChannel配置外部SD卡,则会从外部SD卡加载board.txt文件
sbc.sbcMode:是否开启SBC模式,0为关闭,1为开启- 该选项为true,且External SDCard ->
WIFI Cofig
wifi.espDataReadyPin、8266wifi.espDataReadyPin:ESP模块数据就绪引脚,一般是指ESP模块上的IO0wifi.TfrReadyPin、8266wifi.TfrReadyPin:ESP模块传输就绪引脚,一般是指ESP模块上的IO1或者IO4wifi.espResetPin、8266wifi.espResetPin:ESP模块复位引脚,一般是指ESP模块上的RSTwifi.csPin、8266wifi.csPin:ESP模块SPI Cs引脚,默认为PB12(SD_SPI2_A CS)wifi.serialRxTxPins、8266wifi.serialRxTxPins:ESP模块Rx、Tx引脚,严格遵循以下定义顺序:RX, TXwifi.spiChannel、8266wifi.spiChannel:ESP模块使用的SPI通道组,详细配置说明请查看External SDCard ->sdCard.external.spiChannel,默认值为SSP2wifi.clockReg:可配置WIFI时钟速度,仅适用于ESP32模块wifi.moduleType、8266wifi.moduleType:WIFI模块类型,可配置为以下选项:1
2
3
4
5
6
7
8
9
10
11//以下选项来自以下RepRapFirmware\src\Hardware\STM32\Pins_STM32.h文件的第350行
//目前该项目仅支持esp8266、esp32、esp32eth,其他类型可能是测试用途,请注意区分!
NamedEnum(NetworkModuleType, uint8_t,
espauto,
none,
esp8266,
esp32,
esp32eth,
esp32s3,
esp32c3,
esp32c5);Heater & Sensors
heat.tempSensePins:普通热敏引脚组,从热床开始依次配置,STM32最大支持9个热敏heat.spiTempSensorCSPins:SPI温度传感器Cs引脚组,STM32最多可连接2个SPI温度传感器heat.spiTempSensorChannel:SPI温度传感器使用的通道组,详细配置说明请查看External SDCard ->sdCard.external.spiChannel,默认值为255heat.thermistorSeriesResistor:普通热敏上拉电阻阻值,默认值为4700.0,即上拉电阻为4.7KΩMINI12864
lcd.lcdCSPin:LCD芯片Cs引脚lcd.lcdBeepPin:LCD蜂鸣器引脚lcd.encoderPinA:LCD编码器引脚Alcd.encoderPinB:LCD编码器引脚Blcd.encoderPinSw:LCD编码器按钮引脚lcd.lcdDCPin:LCD数据/指令引脚lcd.panelButtonPin:LCD面板按钮引脚lcd.spiChannel:LCD使用的SPI通道组,详细配置说明请查看External SDCard ->sdCard.external.spiChannel,默认值为SSPNONESerial
serial.aux.rxTxPins:扩展接口串口组,严格遵循以下定义顺序:RX, TX,默认值为PA10、PA9serial.aux2.rxTxPins:扩展接口2串口组,严格遵循以下定义顺序:RX, TXRGB
led.neopixelPin:RGB信号引脚accelerometer
accelerometer.spiChannel:加速度计使用的SPI通道组,详细配置说明请查看External SDCard ->sdCard.external.spiChannel,默认值为SSPNONECAN Bus
can.spiChannelSPI2CANFD模块使用的SPI通道组,详细配置说明请查看External SDCard ->sdCard.external.spiChannelcan.csPinSPI2CANFD模块的Cs引脚can.spiFrequencyHzSPI2CANFD模块SPI通道频率,默认值为15000000,即频率为15MHzcan.readPinSPI2CANFD模块的CAN_TX引脚,仅STM32H7系列芯片支持,默认值为PB8can.writePinSPI2CANFD模块的CAN_RX引脚,仅STM32H7系列芯片支持,默认值为PB9can.exp.address当主板与扩展板通过CAN通讯连接时,需要设置其地址,默认地址为255
boards\mks\robin_nano_f4\rrfpins.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41C.1 e1temp,t1
A.2 e2temp,t2
C.0 bedtemp,tb
A.15 xmin,xstop
D.2 ymin,ystop
C.8 zmin,zstop
C.4 zmax
A.13 pwdet,servo0
A.4 mtdet1,rgb
E.6 mtdet2
B.2 pwoff
A.8 bltouch,probe
A.0 bed,hbed
E.5 e0heat,he0
B.0 e1heat,he1
C.14 fan1,fan
B.1 fan2
C.5 beep
E.13 btnenc
D.13 lcden
C.6 lcdrs,tx6
E.15 lcdd5
E.14 lcdd4
D.11 lcdd6
D.10 lcdd7
A.5 lcdsck
A.6 lcdmiso
A.7 lcdmosi
E.10 lcdcs
E.8 btnen1
E.11 btnen2
E.12 spirs
D.0 tmcsck,can1rx
D.1 tmcmiso,can1tx
D.14 tmcmosi
B.10 tx3
B.11 rx3
D.12 sddet
B.14 otgdm
B.15 otgdp▶申明格式A.1 e0temp,t0前面为对应引脚号,后面则为引脚别名,有多个别名使用逗号分隔,便于在sys/config.g中进行引用。
修改构建脚本
.vscode\tasks.json
在适当位置添加以下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31{
"label": "build robin nano f4 firmware",
"type": "shell",
"command": "bash ./testbuild.sh Debug STM32 STM32F4 STM32F4 COMBINED mks robin_nano_f4",
"osx": {
"options": {
"env": {
"PATH": "${env:PATH}"
}
}
},
"linux": {
"options": {
"env": {
"PATH": "${env:PATH}"
}
}
},
"windows": {
"options": {
"env": {
"PATH": "${env:PATH}"
}
}
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$gcc"
},
开始构建常规固件
在git bash终端运行任务:build robin nano f4 firmware,等待构建完成就会生成firmware_robin_nano_f4.bin文件。
构建稳定固件
稳定固件需要使用MKS曾经为该主板适配的早期版本(v3.2)RepRapFirmware-for-MKS-Boards中的Bootloader(nano_v3_bootloader.bin)文件,该文件对使用RRF固件做了适配,并且提供SD卡更新固件的功能,方便后续升级。
但是该Bootloader偏移量为48Kb,而原项目默认为32Kb,所以想要构建的RRF固件正常使用,就需要修改以下部分文件内容。
修改文件记录
请先按本文章前面部分构建便捷固件中的新建板级描述文件以及修改构建脚本进行操作,再执行以下修改!
RepRapFirmware\src\Hardware\STM32\variants\STM32F407\ldscript.ld
原文件:1
2
3VECTOR (rx) : ORIGIN = 0x8008000, LENGTH = 16K
RESETDATA (rx) : ORIGIN = 0x800C000, LENGTH = 16K // 32Kb Bootloader
FLASH (rx) : ORIGIN = 0x8010000, LENGTH = 1024K - 64K修改为:
1
2
3VECTOR (rx) : ORIGIN = 0x800C000, LENGTH = 16K
RESETDATA (rx) : ORIGIN = 0x8010000, LENGTH = 64K // 48Kb Bootloader
FLASH (rx) : ORIGIN = 0x8020000, LENGTH = 1024K - 128KRepRapFirmware\src\Hardware\STM32\Pins_STM32.h
原文件:1
2
3# define FIRMWARE_NAME "RepRapFirmware for STM32F4 based Boards"
...
# define FLASH_DATA_LENGTH (16*1024) //size of the Software Reset Data in Flash修改为:
1
2
3# define FIRMWARE_NAME "RepRapFirmware for STM32F4 based Boards"
...
# define FLASH_DATA_LENGTH (64*1024) //size of the Software Reset Data in FlashRepRapFirmware\makefiles\STM32F4\makefile
原文件:1
FLAGS += -DRTOS -DFREERTOS_USED -DSUPPORT_USB=1 -DUSB_PRODUCT=\"RepRapFirmware\" -DVECT_TAB_OFFSET=0x8000 # 32Kb Bootloader修改为:
1
FLAGS += -DRTOS -DFREERTOS_USED -DSUPPORT_USB=1 -DUSB_PRODUCT=\"RepRapFirmware\" -DVECT_TAB_OFFSET=0xC000 # 48Kb Bootloader
开始构建稳定固件
在Git Bash终端运行任务:build robin nano f4 firmware,等待构建完成就会生成firmware_robin_nano_f4.bin文件。
修改SD卡配置文件
使用在线网页配置生成器online tool选择Fly E3 V2进行配置(与该主板同芯片型号,便于后续修改),配置完成后将网页生成的文件解压到SD卡根目录,还需要手动修改以下2个文件:
- boards.txt
1 | |
- config.g
1 | |
正常运行RRF固件

特别鸣谢
Building RepRapFirmware
RepRapFirmware-for-MKS-Boards
[FR] Robin Nano v3 support?