自行构建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
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
testbuild.sh

├─ 设置变量 (BUILD=Debug, NETWORK=COMBINED, VARIANT=STM32F4, ...)

└─ make -j8 firmware ...

└─ 根目录 makefile

└─ include RepRapFirmware/makefiles/STM32F4/makefile

├─ include Core.mk → 定义 CORE_OBJS, CORE_INCLUDES
├─ include FreeRTOS.mk → 定义 RRFLIBC_OBJS
├─ include RRFLibraries.mk → 定义 RRFLIBRARIES_OBJS, ...
├─ include CANLib.mk → 定义 CANLIB_OBJS, ...
├─ include RepRapFirmware.mk→ 定义 RRF_OBJS, ...

├─ 编译所有对象文件 (.o) 到 build/ 下
│ ├─ RepRapFirmware/src/*.cpp
│ ├─ RRFLibraries/*.cpp
│ ├─ CoreN2G/*.cpp
│ ├─ CANlib/*.cpp
│ ├─ FreeRTOS/*.c
│ └─ 汇编文件

├─ 打包静态库 (libSTMCore.a, libRRFLibraries.a)

└─ 链接 → build/base_stm32f4.elf → build/base_stm32f4.bin

└─ staticMemStats.sh (内存统计)

└─ make 返回,testbuild.sh 继续

├─ cp build/base_stm32f4.bin build/firmware_octopuspro1_0_f4.bin

└─ CrcAppender.exe build/firmware_octopuspro1_0_f4.bin boards/btt/octopuspro1_0_f4
└─ 输出带 CRC 的固件到 boards/btt/octopuspro1_0_f4/

观察并打开各流程的文件进行查看,暂时不要修改任何文件,直接在Git Bash终端运行任务build octopus pro f4 firmware进行初次构建,留意构建日志信息。

构建日志

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
41
正在执行任务: bash ./testbuild.sh Debug STM32 STM32F4 STM32F4 COMBINED btt octopuspro1_0_f4

Debug STM32 STM32F4 STM32F4 COMBINED btt octopuspro1_0_f4
Debug STM32 STM32F4 STM32F4 COMBINED btt octopuspro1_0_f4
Building RepRapFirmware for STM32F4 based boards:
- MAKE_DIR: RepRapFirmware/makefiles/STM32F4
- Build: Debug
- Linker Script used: ./RepRapFirmware/src/Hardware/STM32/variants/STM32F407/ldscript.ld
- Networking: WIFI + SBC
- Smart Drivers: TMC22XX
- Smart Drivers: TMC51XX
- Output name: base_stm32f4

...

\nBuilt STMCore\n
\nBuilt RRF Libraries\n
\nCreating base_stm32f4.bin
text○ data○ bss○ dec○ hex○filename 719988○ 644○ 56804○ 777436○ bdcdc○./build/base_stm32f4.elf
----------Flash Memory Usage----------
Start End Size
Bootloader 8000000 8007fff 8000 (32Kb)
Vectors 8008000 800bfff 4000 (16Kb)
Reset data 800c000 800ffff 4000 (16Kb)
Text 8010000 809e744 8e744 (569Kb)
ROData 809e744 80bfbbc 21478 (133Kb)
Total Flash 8000000 80bfbbc bfbbc (766Kb)

------------ROData Detail-------------
Size
Strings 296e6 (165Kb)
ARM.exidx 19b0 (6Kb)
ARM.extab 15cc (5Kb)
Fill b15 (2Kb)
Const aa96 (42Kb)
Firmware binary: H:\RepRapFirmware\RRFBuild\build\firmware_octopuspro1_0_f4.bin
FS root directory: H:\RepRapFirmware\RRFBuild\boards\btt\octopuspro1_0_f4
Embedding file H:\RepRapFirmware\RRFBuild\boards\btt\octopuspro1_0_f4\rrfboot.txt (846 bytes @ 64)
Embedding file H:\RepRapFirmware\RRFBuild\boards\btt\octopuspro1_0_f4\rrfpins.txt (790 bytes @ 912)
CRC32 = 0x5C81400A
* 终端将被任务重用,按任意键关闭。

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
    31
    board=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诊断指示灯引脚的逻辑电平,默认值为true
      leds.activity:CAN-FD指示灯引脚
      leds.activityOn:配置CAN-FD指示灯引脚的逻辑电平,默认值为true

    • Pin 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,即频率为25MHz

    • External SDCard

      sdCard.external.csPin:外部SD卡Cs引脚,默认值为NoPin
      sdCard.external.cardDetectPin:外部SD卡检测引脚,默认值为NoPin
      sdCard.external.spiFrequencyHz:外部SD卡SPI通道频率,默认值为4000000,即频率为4MHz
      sdCard.external.spiChannel:外部SD卡使用的SPI通道组,可以配置为SPI Channel中的SPI通道组,也可配置为以下默认选项,默认值为SSPNONE

      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
      //以下内容来自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.pins
      SPI1.pins
      SPI2.pins
      SPI3.pins
      SPI4.pins
      SPI5.pins
      SPI6.pins
      SPI7.pins
      SPI8.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:电机驱动电源使能引脚,没有则填写NoPin
      stepper.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,默认值为SSPNONE

      stepper.csDelay:电机驱动SPI通道Cs延迟时间
      stepper.TmcDiagPins:TMC驱动Diag引脚组

    • ATX Power

      atx.powerPin:ATX电源引脚,没有则填写NoPin
      atx.powerPinInverted:配置ATX电源引脚的逻辑电平,默认值为false
      atx.initialPowerOn:ATX电源初始化时开启引脚,默认值为true

    • Power

      power.VInDetectPin:电源电压监测引脚,没有就填写NoPin
      power.voltage:电源电压,默认值为24

    • SBC Cofig

      sbc.TfrReadyPin:SBC模式传输就绪引脚
      sbc.csPin:SBC模式Cs引脚,默认值为PB12(SD_SPI2_A CS)
      sbc.spiChannel:SBC模式使用的SPI通道组,详细配置说明请查看External SDCard -> sdCard.external.spiChannel,默认值为SSP2

      sbc.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为开启

    • WIFI Cofig

      wifi.espDataReadyPin8266wifi.espDataReadyPin:ESP模块数据就绪引脚,一般是指ESP模块上的IO0
      wifi.TfrReadyPin8266wifi.TfrReadyPin:ESP模块传输就绪引脚,一般是指ESP模块上的IO1或者IO4
      wifi.espResetPin8266wifi.espResetPin:ESP模块复位引脚,一般是指ESP模块上的RST
      wifi.csPin8266wifi.csPin:ESP模块SPI Cs引脚,默认为PB12(SD_SPI2_A CS)
      wifi.serialRxTxPins8266wifi.serialRxTxPins:ESP模块Rx、Tx引脚,严格遵循以下定义顺序:RX, TX
      wifi.spiChannel8266wifi.spiChannel:ESP模块使用的SPI通道组,详细配置说明请查看External SDCard -> sdCard.external.spiChannel,默认值为SSP2

      wifi.clockReg:可配置WIFI时钟速度,仅适用于ESP32模块
      wifi.moduleType8266wifi.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,默认值为255

      heat.thermistorSeriesResistor:普通热敏上拉电阻阻值,默认值为4700.0,即上拉电阻为4.7KΩ

    • MINI12864

      lcd.lcdCSPin:LCD芯片Cs引脚
      lcd.lcdBeepPin:LCD蜂鸣器引脚
      lcd.encoderPinA:LCD编码器引脚A
      lcd.encoderPinB:LCD编码器引脚B
      lcd.encoderPinSw:LCD编码器按钮引脚
      lcd.lcdDCPin:LCD数据/指令引脚
      lcd.panelButtonPin:LCD面板按钮引脚
      lcd.spiChannel:LCD使用的SPI通道组,详细配置说明请查看External SDCard -> sdCard.external.spiChannel,默认值为SSPNONE

    • Serial

      serial.aux.rxTxPins:扩展接口串口组,严格遵循以下定义顺序:RX, TX,默认值为PA10、PA9
      serial.aux2.rxTxPins:扩展接口2串口组,严格遵循以下定义顺序:RX, TX

    • RGB

      led.neopixelPin:RGB信号引脚

    • accelerometer

      accelerometer.spiChannel:加速度计使用的SPI通道组,详细配置说明请查看External SDCard -> sdCard.external.spiChannel,默认值为SSPNONE

    • CAN Bus

      can.spiChannelSPI2CANFD模块使用的SPI通道组,详细配置说明请查看External SDCard -> sdCard.external.spiChannel

      can.csPinSPI2CANFD模块的Cs引脚
      can.spiFrequencyHzSPI2CANFD模块SPI通道频率,默认值为15000000,即频率为15MHz
      can.readPinSPI2CANFD模块的CAN_TX引脚,仅STM32H7系列芯片支持,默认值为PB8
      can.writePinSPI2CANFD模块的CAN_RX引脚,仅STM32H7系列芯片支持,默认值为PB9
      can.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
    41
    C.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
    3
    VECTOR (rx) : ORIGIN = 0x8008000, LENGTH = 16K
    RESETDATA (rx) : ORIGIN = 0x800C000, LENGTH = 16K // 32Kb Bootloader
    FLASH (rx) : ORIGIN = 0x8010000, LENGTH = 1024K - 64K

    修改为:

    1
    2
    3
    VECTOR (rx) : ORIGIN = 0x800C000, LENGTH = 16K
    RESETDATA (rx) : ORIGIN = 0x8010000, LENGTH = 64K // 48Kb Bootloader
    FLASH (rx) : ORIGIN = 0x8020000, LENGTH = 1024K - 128K
  • RepRapFirmware\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 Flash
  • RepRapFirmware\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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Board Hardware configuration file for Fly-E3-v2
// generated by RepRapFirmware Configuration Tool (LPC Version) v3.6.0-STM32+1
// on Tue May 26 2026 21:52:09 GMT+0800 (中国标准时间)

//Note: Each line should be less than 120 characters.
// : Unwanted options can be commented out or set to NoPin. Lines commented out will get default values
// : for pins the default is NoPin.
// : Values for Arrays need to be contained within { and }
// : Comments can be defined with // or # (comments are not supported inside arrays)
// : Each config entry must be all on a single line.

wifi.moduleType = esp8266

stepper.DriverType = {TMC2209,TMC2209,TMC2209,TMC2209,TMC2209}

  • config.g
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
; Configuration file for Fly-E3-v2 (firmware version 3.5)
; executed by the firmware on start-up
;
; generated by RepRapFirmware Configuration Tool v3.6.0-STM32+1 on Tue May 26 2026 21:52:10 GMT+0800 (中国标准时间)

; General preferences
G90 ; send absolute coordinates...
M83 ; ...but relative extruder moves
M550 P"My Printer" ; set printer name

; Network
M552 S1 ; enable network
M586 P0 S1 ; enable HTTP
M586 P1 S0 ; disable FTP

; Drives
M569 P0 S1 ; physical drive 0 goes forwards using default driver timings
M569 P1 S1 ; physical drive 1 goes forwards using default driver timings
M569 P2 S1 ; physical drive 2 goes forwards using default driver timings
M569 P3 S1 ; physical drive 3 goes forwards using default driver timings
M584 X0 Y1 Z2 E3 ; set drive mapping
M350 X16 Y16 Z16 E16 I1 ; configure microstepping with interpolation
M92 X80.00 Y80.00 Z400.00 E420.00 ; set steps per mm
M566 X900.00 Y900.00 Z60.00 E120.00 ; set maximum instantaneous speed changes (mm/min)
M203 X6000.00 Y6000.00 Z180.00 E1200.00 ; set maximum speeds (mm/min)
M201 X500.00 Y500.00 Z20.00 E250.00 ; set accelerations (mm/s^2)
M906 X800 Y800 Z800 E800 I30 ; set motor currents (mA) and motor idle factor in per cent
M84 S300 ; Set idle timeout

; Axis Limits
M208 X0 Y0 Z0 S1 ; set axis minima
M208 X230 Y210 Z200 S0 ; set axis maxima

; Endstops
M574 X1 S1 P"xstop" ; configure switch-type (e.g. microswitch) endstop for low end on X via pin xstop
M574 Y1 S1 P"ystop" ; configure switch-type (e.g. microswitch) endstop for low end on Y via pin ystop

; Z-Probe
M558 P5 C"^probe" H5 F120 T6000 ; set Z probe type to switch and the dive height + speeds
G31 P500 X0 Y0 Z2.5 ; set Z probe trigger value, offset and trigger height
M557 X15:215 Y15:195 S20 ; define mesh grid

; Heaters
M308 S0 P"bedtemp" Y"thermistor" T100000 B3950 ; configure sensor 0 as thermistor on pin bedtemp
M950 H0 C"bed" T0 ; create bed heater output on bed and map it to sensor 0
M307 H0 B0 S1.00 ; disable bang-bang mode for the bed heater and set PWM limit
M140 H0 ; map heated bed to heater 0
M143 H0 S120 ; set temperature limit for heater 0 to 120C
M143 H0 S120 ; set temperature limit for heater 0 to 120C
M308 S1 P"e1temp" Y"thermistor" T100000 B3950 ; configure sensor 1 as thermistor on pin e0temp
M950 H1 C"e0heat" T1 ; create nozzle heater output on e0heat and map it to sensor 1
M307 H1 B0 S1.00 ; disable bang-bang mode for heater and set PWM limit
M143 H1 S280 ; set temperature limit for heater 1 to 280C

; Fans
M950 F0 C"fan1" Q500 ; create fan 0 on pin fan0 and set its frequency
M106 P0 S0 H0 T45 ; set fan 0 value. Thermostatic control is turned on
M950 F1 C"fan2" Q500 ; create fan 1 on pin fan1 and set its frequency
M106 P1 S0 H-1 ; set fan 1 value. Thermostatic control is turned off

; Tools
M563 P0 D0 H1 F0 ; define tool 0
G10 P0 X0 Y0 Z0 ; set tool 0 axis offsets
G10 P0 R0 S0 ; set initial tool 0 active and standby temperatures to 0C

; Custom settings are not defined

正常运行RRF固件

恭喜你,成功啦!

特别鸣谢

Building RepRapFirmware
RepRapFirmware-for-MKS-Boards
[FR] Robin Nano v3 support?


自行构建RepRapFirmware固件
https://dongxunz.github.io/2026/02/06/3D打印/自行构建RepRapFirmware固件/
作者
dongxunz
发布于
2026年2月6日
许可协议