问题描述
在使用 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
|
|