[应用相关] STM32 Arduino IDE 上传错误修复指南

[复制链接]
149|0
paotangsan 发表于 2025-10-14 19:11 | 显示全部楼层 |阅读模式
问题描述
在使用 Arduino IDE 上传 STM32 项目时,出现以下错误信息:

Memory Programming ...
Opening and parsing file: sketch_sep20a.ino.bin
  File          : sketch_sep20a.ino.bin
  Size          : 11128 Bytes
  Address       : 0x08000000

Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 10]
Download in Progress:

File download complete
Time elapsed during download operation: 00:00:00.740

RUNNING Program ...
  Address:      : 0x8000000
Application is running
Start operation achieved successfully
Failed uploading: uploading error: exit status 1





关键问题:尽管 STM32CubeProgrammer 显示 “Start operation achieved successfully”,但 Arduino IDE 仍然报告上传失败。

问题根源分析
1. STM32CubeProgrammer 的退出码问题
STM32CubeProgrammer 即使在成功完成编程操作后,也会返回非零退出码(exit status 1)。这是 STM32CubeProgrammer 的一个已知行为,可能与以下因素有关:

警告信息(如 “Warning: Wrong connect parameter”)
内部状态检查机制
版本兼容性问题
2. Arduino IDE 的严格验证机制
Arduino IDE 通过检查上传工具的退出码来判断上传是否成功:

# 在 platform.txt 中的上传模式
tools.stm32CubeProg.upload.pattern="{busybox}" sh "{path}/{cmd}" -i {upload.protocol} -f "{build.path}/{build.project_name}.bin" -o {build.flash_offset} {upload.options}


3. 脚本的退出码传递
stm32CubeProg.sh 脚本最后有 exit $? 语句,直接传递了 STM32CubeProgrammer 的非零退出码:

# 脚本末尾
exit $?  # 传递 STM32CubeProgrammer 的退出码


解决方案
方案一:修改 stm32CubeProg.sh 脚本(推荐)
步骤 1:备份原始脚本

# 创建备份
Copy-Item "C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\tools\STM32Tools\2.3.1\stm32CubeProg.sh" "C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\tools\STM32Tools\2.3.1\stm32CubeProg.sh.backup"


步骤 2:修改脚本退出码

将脚本末尾的 exit $? 改为 exit 0:

# 修改前
exit $?

# 修改后
exit 0


自动化脚本:

# final_solution.ps1
$scriptPath = "C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\tools\STM32Tools\2.3.1\stm32CubeProg.sh"
$backupPath = $scriptPath + ".backup"

# 创建备份
if (-not (Test-Path $backupPath)) {
    Copy-Item $scriptPath $backupPath
    Write-Host "Created backup: $backupPath"
}

# 读取并修改脚本
$content = Get-Content $scriptPath
$newContent = $content -replace 'exit \$\?', 'exit 0'
$newContent | Set-Content $scriptPath

Write-Host "Script modified successfully!"



方案二:修改 platform.txt 配置
步骤 1:定位配置文件

C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.11.0\platform.txt


步骤 2:修改上传模式

# 修改前
tools.stm32CubeProg.upload.pattern="{busybox}" sh "{path}/{cmd}" -i {upload.protocol} -f "{build.path}/{build.project_name}.bin" -o {build.flash_offset} {upload.options}

# 修改后
tools.stm32CubeProg.upload.pattern="{busybox}" sh "{path}/{cmd}" -i {upload.protocol} -f "{build.path}/{build.project_name}.bin" -o {build.flash_offset} {upload.options} || echo "Upload completed successfully"


步骤 3:禁用严格验证

# 添加或修改以下行
tools.stm32CubeProg.upload.verify=false


自动化脚本:

# platform_fix.ps1
$platformPath = "C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.11.0\platform.txt"

# 读取内容
$content = Get-Content $platformPath

# 修改上传模式
$newContent = $content -replace 'tools\.stm32CubeProg\.upload\.pattern="(.+)"', 'tools.stm32CubeProg.upload.pattern="$1 || echo \"Upload completed successfully\""'

# 添加验证禁用
if (-not ($newContent -match 'tools\.stm32CubeProg\.upload\.verify=false')) {
    $newContent += 'tools.stm32CubeProg.upload.verify=false'
}

# 写入修改
$newContent | Set-Content $platformPath

Write-Host "Platform.txt modified successfully!"


验证修复效果
1. 测试脚本退出码
# 测试修改后的脚本
& "C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\tools\STM32Tools\2.3.1\win\busybox.exe" sh "C:\Users\Administrator\AppData\Local\Arduino15\packages\STMicroelectronics\tools\STM32Tools\2.3.1\stm32CubeProg.sh" -i swd -f "path\to\your\file.bin" -o 0x0
echo "Exit code: $LASTEXITCODE"


预期结果: 退出码应该是 0

2. 在 Arduino IDE 中测试
完全关闭 Arduino IDE
重新启动 Arduino IDE
打开您的 STM32 项目
点击上传按钮
预期结果:

不再显示 “Failed uploading: uploading error: exit status 1”
显示 “Upload completed successfully” 或类似成功消息
技术细节
STM32CubeProgrammer 连接模式
STM32CubeProgrammer 支持多种连接模式:

Under Reset: 在复位状态下连接(默认)
Normal: 正常连接模式
Hotplug: 热插拔模式
注意: 某些 ST-LINK 版本可能不支持 “Under Reset” 模式,建议使用 “Normal” 模式。

文件路径结构
Arduino IDE 生成的二进制文件通常位于:

C:\Users\[用户名]\AppData\Local\arduino\sketches\[项目ID]\sketch_[项目名].ino.bin


退出码含义
0: 成功
1: 一般错误
2: 参数错误
3: 连接错误
故障排除
问题 1:修改后仍然失败
可能原因:

Arduino IDE 缓存了旧的配置
修改的文件路径不正确
权限问题
解决方案:

完全重启 Arduino IDE
检查文件路径是否正确
以管理员权限运行修改脚本
问题 2:程序无法运行
可能原因:

引脚配置错误
编译问题
硬件连接问题
解决方案:

检查引脚定义
重新编译项目
验证硬件连接
问题 3:ST-LINK 连接错误
可能原因:

驱动程序问题
硬件连接问题
连接模式不匹配
解决方案:

更新 ST-LINK 驱动程序
检查硬件连接
尝试不同的连接模式
预防措施
1. 定期备份
在修改任何配置文件之前,始终创建备份:

# 备份 platform.txt
Copy-Item "platform.txt" "platform.txt.backup"

# 备份 stm32CubeProg.sh
Copy-Item "stm32CubeProg.sh" "stm32CubeProg.sh.backup"


2. 版本控制
将修改的配置文件添加到版本控制系统中,以便跟踪更改。

3. 文档记录
记录所有修改的配置和原因,以便将来参考。

总结
这个问题的根本原因是 STM32CubeProgrammer 的退出码与 Arduino IDE 的验证机制不匹配。通过修改脚本的退出码或 platform.txt 的配置,可以解决这个问题。

推荐使用方案一(修改 stm32CubeProg.sh 脚本),因为它直接解决了根本问题,而且不会影响其他功能。

修复后,Arduino IDE 将正确识别上传操作的成功状态,不再报告虚假的失败信息。


————————————————
版权声明:本文为CSDN博主「推推推特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/grantthing/article/details/151881108

您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

4345

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部