当前位置: 首页 > news >正文

【IDE】Linux下使用openocd烧录bin文件

  STM32Fxx的IDE已经在Linux下部署了,理论上来说,ARMv7、ARMv8...的开发环境都已经统一了。有一个问题:Windows下IDE可以在线刷写bin文件,Linux下可不可以呢?答案是肯定的,只不过我们需要在控制台通过相对复杂的指令来完成,为了简化控制台操作,我们直接通过脚本来实现。

  给出脚本前要强调一点:当我们为STM32Fxxx等基于ARMv7的SOC开发程序的时候,我们使用arm-none-eabi-gdb实现elf文件的在线下载与仿真,如果要刷写bin文件的时候,直接使用openocd来完成。下面的脚本是刷写bin文件使用的。脚本可以完成bootloader、app_a与app_b刷写。

#!/bin/bash
# flash_all_openocd.sh# 默认配置
BOOTLOADER_NAME="Bootloader/Build/Application/stm32f407_bl.bin"
BOOTLOADER_ADDR="0x08000000"
APP_NAME="Bootloader/Build/Application/stm32_app.bin"
APP_A_ADDR="0x08010000"
APP_B_ADDR="0x08090000"
OPENOCD_CFG="-f interface/stlink.cfg -f target/stm32f4x.cfg"# 显示帮助信息
show_help() {echo "=== OpenOCD 串行烧录脚本 ==="echo "用法: $0 [选项]"echo ""echo "选项:"echo "  -b, --bootloader <文件>    设置 bootloader 文件路径"echo "  -a, --app <文件>           设置应用程序文件路径"echo "  --bl-addr <地址>           设置 bootloader 烧写地址 (默认: $BOOTLOADER_ADDR)"echo "  --app-a-addr <地址>        设置应用程序 A 分区烧写地址 (默认: $APP_A_ADDR)"echo "  --app-b-addr <地址>        设置应用程序 B 分区烧写地址 (默认: $APP_B_ADDR)"echo "  -c, --config <配置>        设置 OpenOCD 配置"echo "  -h, --help                 显示此帮助信息"echo ""echo "示例:"echo "  $0 -b bootloader.bin -a app.bin"echo "  $0 --bootloader bl.bin --app app.bin --bl-addr 0x08000000"echo ""echo "当前默认配置:"echo "  Bootloader: $BOOTLOADER_NAME -> $BOOTLOADER_ADDR"echo "  App A:      $APP_NAME -> $APP_A_ADDR"echo "  App B:      $APP_NAME -> $APP_B_ADDR"
}# 解析命令行参数
while [[ $# -gt 0 ]]; docase $1 in-b|--bootloader)BOOTLOADER_NAME="$2"shift 2;;-a|--app)APP_NAME="$2"shift 2;;--bl-addr)# 确保地址格式正确,移除可能的前导减号BOOTLOADER_ADDR="${2#-}"shift 2;;--app-a-addr)APP_A_ADDR="${2#-}"shift 2;;--app-b-addr)APP_B_ADDR="${2#-}"shift 2;;-c|--config)OPENOCD_CFG="$2"shift 2;;-h|--help)show_helpexit 0;;*)echo "错误: 未知选项 $1"echo "使用 $0 --help 查看帮助信息"exit 1;;esac
done# 检查文件是否存在
check_file_exists() {if [[ ! -f "$1" ]]; thenecho "错误: 文件不存在: $1"exit 1fi
}# 获取文件大小
get_file_size() {if [[ -f "$1" ]]; thenstat -c%s "$1" 2>/dev/null || stat -f%z "$1" 2>/dev/nullelseecho "0"fi
}# 清理地址格式(移除可能的前导减号)
clean_address() {local addr="$1"echo "${addr#-}"
}# 显示旋转进度
show_spinner() {local pid=$1local delay=0.1local spinstr='|/-\'while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; dolocal temp=${spinstr#?}printf " [%c] " "$spinstr"local spinstr=$temp${spinstr%"$temp"}sleep $delayprintf "\b\b\b\b\b"doneprintf "    \b\b\b\b"
}# 烧录函数(带进度显示)
flash_image() {local name="$1"local file="$2"local addr="$3"# 清理地址格式local clean_addr=$(clean_address "$addr")local file_size=$(get_file_size "$file")local file_kb=$((file_size / 1024))echo "=== 烧录 $name ==="echo "文件: $file"echo "大小: ${file_kb} KB"echo "地址: $clean_addr"echo ""# 显示烧录状态echo -n "烧录中..."# 创建临时文件记录输出local temp_log=$(mktemp)# 启动烧录进程openocd $OPENOCD_CFG \-c "init; reset halt; flash write_image erase $file $clean_addr; reset run; shutdown" > "$temp_log" 2>&1 &local openocd_pid=$!# 显示旋转进度show_spinner $openocd_pid &local spinner_pid=$!# 等待烧录完成wait $openocd_pidlocal result=$?# 停止旋转进度kill $spinner_pid 2>/dev/nullwait $spinner_pid 2>/dev/null# 检查结果if [ $result -eq 0 ] && ! grep -q "Error\|error\|failed" "$temp_log"; thenecho " 完成!"echo "✅ $name 烧录成功!"# 显示烧录统计信息if grep -q "wrote [0-9]\+ bytes" "$temp_log"; thenlocal written_bytes=$(grep -o "wrote [0-9]\+ bytes" "$temp_log" | head -1 | awk '{print $2}')echo "   写入: $written_bytes 字节 ($((written_bytes / 1024)) KB)"fiif grep -q "erased" "$temp_log"; thenecho "   擦除: 完成"firm -f "$temp_log"return 0elseecho " 失败!"echo "❌ $name 烧录失败!"echo ""echo "错误信息:"cat "$temp_log"rm -f "$temp_log"return 1fi
}# 清理默认地址格式
BOOTLOADER_ADDR=$(clean_address "$BOOTLOADER_ADDR")
APP_A_ADDR=$(clean_address "$APP_A_ADDR")
APP_B_ADDR=$(clean_address "$APP_B_ADDR")echo "=== OpenOCD 串行烧录 ==="
echo "配置信息:"
echo "  Bootloader: $BOOTLOADER_NAME -> $BOOTLOADER_ADDR"
echo "  App A:      $APP_NAME -> $APP_A_ADDR"
echo "  App B:      $APP_NAME -> $APP_B_ADDR"
echo "  OpenOCD配置: $OPENOCD_CFG"
echo ""# 检查文件是否存在
check_file_exists "$BOOTLOADER_NAME"
check_file_exists "$APP_NAME"# 显示文件信息
echo "文件信息:"
echo "  Bootloader: $BOOTLOADER_NAME ($(( $(get_file_size "$BOOTLOADER_NAME") / 1024 )) KB)"
echo "  App:        $APP_NAME ($(( $(get_file_size "$APP_NAME") / 1024 )) KB)"
echo ""# 开始烧录过程
echo "开始烧录..."
echo "=========================================="# 烧录 Bootloader
if ! flash_image "Bootloader" "$BOOTLOADER_NAME" "$BOOTLOADER_ADDR"; thenecho "❌ Bootloader 烧录失败,退出!"exit 1
fiecho ""
echo "------------------------------------------"# 烧录分区 A
if ! flash_image "分区 A" "$APP_NAME" "$APP_A_ADDR"; thenecho "❌ 分区 A 烧录失败,退出!"exit 1
fiecho ""
echo "------------------------------------------"# 烧录分区 B
if ! flash_image "分区 B" "$APP_NAME" "$APP_B_ADDR"; thenecho "❌ 分区 B 烧录失败,退出!"exit 1
fiecho ""
echo "=========================================="
echo "=== 所有固件烧录完成 ==="

脚本测试ok

http://www.dtcms.com/a/449384.html

相关文章:

  • 【剑斩OFFER】算法的暴力美学——将 x 减到零的最小操作数
  • Docker(四)—— 使用 Docker 搭建 Nginx 并实现 HTTPS 访问
  • 浏览器中的隐藏IDE: Elements (元素) 面板
  • 【JVM】实战篇(一)
  • 住房城市建设部门户网站一件代发48个货源网站
  • 宣武深圳网站建设公司下关网站建设
  • 电商的网站有几个如何做高校的网站版面设计
  • 蚁群算法解决TSP问题
  • 数据库丢失但没备份过?救星:二进制日志
  • 【C++实战(74)】深入C++安全编程:密码学实战之旅
  • inbound 概念及题目
  • UNet改进(43):SaFA-MS-UNet如何提升图像分割精度?
  • 网站建设中的智能元素凡科建站代理商登录
  • Elasticsearch 之分页查询
  • apache hop 不能处理clickhouse 数组格式怎么办?
  • 网站建设 网站设计php语言网站开发公司北京
  • 代码审计
  • 制作网站需要钱吗天津网址
  • cursor使用之没有正常的编辑器中的运行箭头
  • 建设网站优化创意网站建设价格多少
  • soular入门到实战(3) - 如何实现TikLab工具链统一登录认证
  • Python图形界面——海龟绘图
  • 《强化学习数学原理》学习笔记9——值迭代算法
  • 网站建设 统一标准体系什么是网络销售
  • 网站开发语言有哪几种临沂专业网站制作
  • 花店网站建设方案网站木马文件删除
  • Bash 的基本语法总结
  • 网站怎么进行优化网站开发 英文文章
  • 自动驾驶决策规划算法(开幕式)
  • 从零起步学习Redis || 第八章:过期删除策略与内存淘汰策略详解及实战使用(LRU和LFU算法详解)