固件刷写
RAMN 共有四个 ECU,每个 ECU 需要不同的固件文件(ECUA.hex、ECUB.hex、ECUC.hex 和 ECUD.hex)。RAMN 所采用的 STM32 微控制器内置了 USB/CAN 启动加载程序,因此您无需特殊工具即可为全新(未编程)的板卡进行固件刷写。具体操作说明请参阅“刷写脚本”部分。
接口
固件文件可通过以下三种接口之一进行刷写:
- STM32 内置启动加载程序接口(USB):RAMN ECU 所使用的 STM32L5 微控制器具备两种启动模式:应用模式和启动加载程序模式。在启动加载程序模式下,微控制器可通过 USB 和 CAN-FD 接受多种刷写命令。该接口对所有 ECU 均可通过 USB 访问,即使是在全新的(未编程的)RAMN 板卡上也是如此。
- 硬件接口(JTAG):此接口适用于所有 STM32 微控制器。它可以与诸如 ST-LINK/V2 之类的 JTAG 调试器配合使用,也可用于尚未编程的全新电路板。
- UDS 接口(USB、CAN):该接口仅在具备有效固件且拥有两个存储器分区的 ECU 上可用(微控制器型号后缀为“CET6”)。
UDS 接口的具体使用方法详见 UDS 用户指南。其他接口的说明请参阅本页面。
重要知识
- ECU A 负责控制 ECU B、C 和 D 的电源及启动模式。必须首先对 ECU A 进行刷写,否则 ECU B、C 和 D 将无法供电。
- ECU B 配备了一个方向盘电位计,该电位计可能是“线性”或“算法型”,具体取决于部件的可用性。如果方向盘居中时 LCD 屏幕未显示“STEER 0%”,则表示您必须用“ECUB_LINEAR.hex”替换“ECUB.hex”(只需删除 ECUB.hex,并将 ECUB_LINEAR.hex 重命名为 ECUB.hex)。
- 当您通过 UDS 接口对 ECU 进行重新编程时,新固件实际上会被写入到不同的存储器分区,并且微控制器的选项字节会被设置为使该存储器分区成为新的应用固件(存储器分区切换)。某些工具,包括 ST 官方工具,可能无法识别这种存储器切换,从而导致错误。如果出现这种情况,请通过 UDS 对 ECU 进行重新刷写,以恢复到另一个“默认”存储器分区 [ 1 ]。
- ECU A 与 ECU B、C 和 D 的选项字节不同。如果您不小心使用了 ECU A 的固件文件对 ECU B、C 或 D 进行刷写,它们将不再接受进入引导加载程序模式 [ 2 ]。
- 您可以按照“控制功能测试”中的说明,验证您的电路板是否完全正常工作。
- 如果遇到问题,请务必检查预期的选项字节(故障排除),并排查常见问题(参见“USB 不稳定”)。
STM32 嵌入式引导加载程序接口
工作原理
设计
STMicroelectronics 的 AN2606 文档详细说明了 STM32 微控制器的启动方式。RAMN 使用的是 STM32L5 微控制器。默认情况下,STM32L5 在启动时如果 BOOT0 引脚为高电平,则会进入引导加载程序模式。这种行为可以通过编程 STM32L5 的选项字节来覆盖,从而使用存储器中写入的值,而非 BOOT0 引脚的状态。
ECU A 的 BOOT0 引脚在硬件上被设置为高电平。因此,全新未编程的板子将始终以引导加载程序模式启动,并通过 USB 监听引导加载程序命令,包括内存刷写命令(即 AN3156 中详细描述的 DFU 命令)。
ECU A 的固件配置为设置其自身的选项字节,以便在后续所有启动中忽略 BOOT0 引脚。因此,只要 ECU A 至少执行过一次有效固件,无论其 BOOT0 引脚的状态如何,都将进入应用程序模式启动。
ECU A 的设置可通过特定的 USB 或 UDS 命令重置,相关命令已列在命令列表中。当执行该命令时,ECU A 会恢复其选项字节并自行复位,强制进入引导加载程序模式。
ECU B、C 和 D 的 BOOT0 引脚及电源由 ECU A 控制。ECU B、C 和 D 始终根据 BOOT0 引脚的状态进行启动。因此,ECU A 可以隔离特定的 ECU,并强制其进入引导加载程序模式,从而允许用户通过 CAN-FD 发送 STM32 引导加载程序命令(参见 AN5405)。
刷写流程
您只需通过 USB 连接即可为所有 ECU 进行刷写。刷写流程如下:
- 将 ECU A 的选项字节复位,以强制 ECU A 进入引导加载程序模式(新板可跳过此步骤)。
- 使用 DFU 工具通过 USB 为 ECU A 刷写固件。
- 使用 ECU A 借助“canboot.py”Python 工具为 ECU B、C 和 D 刷写固件。该工具可将 USB 命令转换为 CAN-FD 命令。
刷写脚本
Github 仓库中包含多种用于刷写 RAMN 的 ECU 的脚本。您首先需要在 Linux 或 Windows 系统上准备好您的环境。
Windows 环境
-
安装 STM32CubeProgrammer。这需要您在意法半导体注册一个免费账户。如果后续遇到问题,可尝试安装位于“Program Files/STMicroelectronics/STM32Cube/STM32CubeProgrammer/Drivers”中的驱动程序(说明请见此处)。
-
安装适用于 Windows 的最新 Python 版本。请务必勾选“将 Python 添加到环境变量”。
-
将 RAMN 仓库下载到您的计算机上(选择“代码”>“下载 ZIP 文件”)。
-
在 RAMN/scripts 文件夹中打开命令提示符(您可以通过文件资源管理器打开 RAMN/scripts 文件夹,然后在顶部地址栏输入“cmd”来实现),并输入:
1python -m pip install -r requirements.txt
-
(如需)编辑 scripts/STbootloader/windows/ProgramECU_A.bat 脚本,并将 STM32PROG_PATH 修改为与您的安装路径相匹配。
Linux 环境
-
安装 dfu-util:
1sudo apt-get update && sudo apt-get install dfu-util
-
克隆 RAMN 的仓库:
1git clone https://github.com/ToyotaInfoTech/RAMN
-
安装 requirements.txt 中的模块:
1pip install -r requirements.txt
警告
在较新的发行版中,您可能会遇到 error: externally-managed-environment 的错误。您可以执行以下命令以防止该错误再次发生:
1python3 -m venv .venv
2source .venv/bin/activate
3python3 -m pip install -r requirements.txt
您可以在此处找到更多详细信息。
请注意,如果您使用虚拟机,RAMN 串口和 RAMN DFU 端口将被视为不同;您需要将两者都转发到您的虚拟机。
脚本
STM32 嵌入式引导加载程序接口需要更改 CAN 波特率。如果存在,您必须断开可能干扰它的外部 CAN 工具。请确保您使用的是 USB 数据线,而不是仅用于供电的 USB 数据线。然后,请按照以下说明操作:
- 打开文件夹 scripts/STbootloader/windows 或 scripts/STbootloader/linux。
- 如果板子未处于 DFU 模式(例如,并非全新板子),请运行 ECUA_OptionBytes_Reset.bat(在 Linux 上为 ECUA_OptionBytes_Reset.sh)。
- 运行 ProgramECU_A.bat(在 Linux 上为 ProgramECU_A.sh)以烧录 ECU A。此过程大约需要 5 秒钟。
- 运行 ProgramECU_BCD.bat(在 Linux 上为 ProgramECU_BCD.sh)以烧录 ECU B、C 和 D。此过程大约需要 30 秒钟。
警告
截至 2024 年,意法半导体提供的 DFU 工具在某些计算机上表现不佳。您可能需要连续多次运行脚本,直到成功为止。尝试更换计算机上的不同 USB 端口或使用 USB 集线器可能会有所帮助。程序成功时应以绿色显示“Start operation achieved successfully”。如果遇到过多问题,可尝试改用 Linux 下的 dfu-util 工具。若编程失败,请勿手动更新 Option Bytes。
JTAG 硬件接口
您还可以使用 ST-LINK/V2 工具对 ECU 进行重新编程和调试。理论上,您应该能够使用其他兼容 STM32 的硬件或软件对 ECU 进行重新编程和调试;不过,我们尚未对此进行过测试。
通过 JTAG 接口,您一次只能为一个 ECU 刷写固件,因此需要针对每个 ECU 重复固件刷写步骤。务必确保先对 ECU A 进行编程,否则可能导致其他 ECU 无法正常供电。
准备您的环境
- 获取一个 ST-LINK/V2。请注意市面上存在一些克隆产品,这些产品可能不受 ST 官方支持。
- 获取一个 RAMN 调试器扩展模块,或者准备跳线,以便手动连接到 RAMN ECU。
- 安装STM32CubeProgrammer。
连接您的调试器
如果您拥有一款带有 JTAG 接口的 RAMN 调试器扩展板,只需将其插入您希望重新编程的 ECU 的扩展端口即可。扩展板的正确方向应确保其不会覆盖主 RAMN 板(插入扩展板后,您仍应能够看到 ECU 微控制器)。
如果您没有 RAMN 调试器扩展板,请使用跳线将 ST-LINK/V2 的引脚连接到您希望重新编程的 ECU 的扩展端口:
- 将 ST-LINK/V2 的第 1 和第 2 引脚(VCC)连接至扩展端口的第 1 引脚(3V3_ECU)。
- (可选)将 ST-LINK/V2 的引脚 3(TRST)连接至扩展端口的引脚 26(SYS_JTRST)。
- 将 ST-LINK/V2 的引脚 4(GND)连接至扩展端口的引脚 4(GND)。
- 将 ST-LINK/V2 的引脚 5(TDI)连接至扩展端口的引脚 23(SYS_JTDI)。
- 将 ST-LINK/V2 的引脚 7(TMS_SWDIO)连接至扩展端口的引脚 22(SYS_JTMS-SWDIO)。
- 将 ST-LINK/V2 的引脚 9(TCK_SWCLK)连接至扩展端口的引脚 24(SYS_JTCK-SWCLK)。
- 将 ST-LINK/V2 的引脚 13(TDO_SWO)连接至扩展端口的引脚 25(SYS_JTDO-SWO)。
- 将 ST-LINK/V2 的引脚 15(NRST)连接至扩展端口的引脚 21(nRST)。
有关连接的详细信息,请参阅 ST-LINK/V2 手册及扩展端口的引脚分配图。
使用STM32CubeProgrammer
连接
在STM32CubeProgrammer中启动,从右上角菜单中选择“ST-LINK”,然后点击“连接”。您可能会首先收到调试器固件更新的提示。如果连接失败,请尝试使用与下方截图中相同的设置。此外,还可以先将“共享:启用”设置为启用状态,然后再点击串口下拉框旁边的刷新(🔁)按钮。

(可选)验证选项字节
如果您不确定 ECU 的状态,尤其是因为曾与 UDS 重新编程或内存保护功能进行过交互,建议您验证选项字节的状态。在左侧窗格中选择“OB”图标,并确认以下内容:
- 读出保护 > RDP 显示为“AA”。
- 用户配置 > SWAP_BANK 未被勾选。
- (针对 ECU A)用户配置 > nSWBOOT0 未勾选,nBOOT0 已勾选。
- (针对 ECU B、C 和 D)用户配置 > nSWBOOT0 已勾选(此处 nBOOT0 无关紧要)。
有关正确配置的截图,请参阅故障排除部分。如果这些选项字节中有任何一项不正确,请予以修正并点击“应用”按钮。此命令失败的情况并不少见,因此您可能需要多次重试。请务必谨慎操作“RDP”选项字节,因为如果应用了非“AA”的值,可能会导致您的 ECU 永久锁定。
重新刷写
- 单击左侧窗格中的“擦除与编程图标”(从顶部数第二个图标)。
- (可选)单击“全芯片擦除”(窗口右上角),以完全擦除内存(包括内部 EEPROM,其中包含 VIN 和 DTC)。
- 单击“浏览”,选择固件文件(适用于您 ECU 的.hex 文件),勾选“验证编程”和“编程后运行”,然后单击“开始编程”。
- 等待刷写过程完成。
对您想要重新编程的每个 ECU 重复上述步骤。
脚注
[ 1 ]:
RAMN 自定义的 UDS 常规控制 0x0211 可用于强制进行内存分区交换,但请务必在清楚自身操作的情况下再使用。
[ 2 ]:
您可以通过 JTAG 调试器修复选项字节。您可以使用 UDS 常规控制 0x0210 来重置 BOOT0 选项字节。此 UDS 命令会强制 ECU A 进入引导加载程序模式,因此您需要对其进行重新编程。