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

Jlink下载固件到RAM区

Jlink下载固件到RAM区

  • 准备批处理
    • 搜索exe批处理
    • 读取bin数据解析
    • 调用jlink批处理
    • 准备jlink脚本
  • 调用执行

环境:J-Flash V7.96g
平台:arm cortex-m3

准备批处理

搜索exe批处理

find_file.bat

@echo off:: 自动识别脚本名和路径
set "SCRIPT_DIR=%~dp0"
set "SCRIPT_NAME=%~nx0":: 检查是否提供了正确的参数
if "%~1"=="" (echo Usage: %SCRIPT_NAME% file_nameexit /b 1
)set FIND_EXE_NAME=%~1echo Using common paths "C:\Program Files (x86)" to search for %FIND_EXE_NAME%...
for /f "tokens=*" %%i in ('dir /a/b/s/on "C:\Program Files (x86)\*%FIND_EXE_NAME%"') do (echo result: "%%i"SET FIND_EXE_NAME_PATH=%%igoto :found
)echo Using common paths "C:\Program Files" to search for %FIND_EXE_NAME%...
for /f "tokens=*" %%i in ('dir /a/b/s/on "C:\Program Files\*%FIND_EXE_NAME%"') do (echo result:  "%%i"SET FIND_EXE_NAME_PATH=%%igoto :found
)rem 搜索其他盘
for /F "Skip=2" %%d in ('Wmic Logicaldisk Where "DriveType=3" Get Name') do (echo Using common paths %%d to search for %FIND_EXE_NAME%for /f "tokens=*" %%i in ('dir /a/b/s/on "%%d\*%FIND_EXE_NAME%"') do (echo result: "%%i"SET FIND_EXE_NAME_PATH=%%igoto :found)
):found
echo Found %FIND_EXE_NAME% at %FIND_EXE_NAME_PATH%
goto :eof

读取bin数据解析

read_bin.py

import struct
import sysdef read_u32_from_bin(file_path, offset):with open(file_path, "rb") as f:f.seek(offset)data = f.read(4)if len(data) < 4:print("文件数据不足。")return Nonereturn struct.unpack("<I", data)[0]  # "<I"表示以小端序读取无符号32位整数if __name__ == "__main__":if len(sys.argv) != 2:print("用法: python read_bin.py <文件路径>")sys.exit(1)file_path = sys.argv[1]u32_value = read_u32_from_bin(file_path, 4) # 跳过前4个字节,读取接下来的4个字节if u32_value is not None:hex_value = hex(u32_value)print(f"{hex_value}")

调用jlink批处理

autodownload.bat

@echo off
setlocal enabledelayedexpansion:: 自动识别脚本名和路径
set "SCRIPT_DIR=%~dp0"
set "SCRIPT_NAME=%~nx0":: 检查是否提供了正确的参数
if "%~1"=="" (echo Usage: %SCRIPT_NAME% path_to_bin_file load_addressexit /b 1
)if "%~2"=="" (echo Usage: %SCRIPT_NAME% path_to_bin_file load_addressexit /b 1
):: 设置一个标志,看看可选的目录
::set "JLINK_PATH=C:\Program Files\SEGGER\JLink\JLink.exe"
set "JLINK_PATH=":: 检查用户是否提供了可选的路径
if not "%~3"=="" (if exist "%~3\JLink.exe" (set "JLINK_PATH=%~3\JLink.exe")
):: 常用文件夹搜索路径
if "%JLINK_PATH%"=="" (:: 调用搜索JLink.exe的模块call find_file.bat JLink.exe:: 检查JLINK_PATH环境变量是否已设置if not defined FIND_EXE_NAME_PATH (echo ==not found==goto :found) else (SET JLINK_PATH=!FIND_EXE_NAME_PATH!goto :found)
):found
if "%JLINK_PATH%"=="" (echo JLink.exe not found. Please make sure JLink is installed and the executable is in your PATH.exit /b 1
)
echo Using JLink.exe at: %JLINK_PATH%REM 调用 Python 脚本读取二进制文件中的 u32 值
python read_bin.py %~1 > result.txtREM 获取 Python 脚本的输出
for /f "delims=" %%i in (result.txt) do (set PC_VALUE=%%i
)REM 删除临时文件
del result.txtecho PC_VALUE = !PC_VALUE!:: 复制flash_ram.jlink模板并替换占位符
set "JLINK_SCRIPT=%SCRIPT_DIR%flash_ram_temp.jlink"
copy /Y "%SCRIPT_DIR%flash_ram.jlink" "%JLINK_SCRIPT%"
powershell -Command "(Get-Content '%JLINK_SCRIPT%') -replace 'BIN_FILE_PATH', '%~1' -replace 'LOAD_ADDRESS', '%~2' -replace 'PC_VALUE', '!PC_VALUE!'| Set-Content -Path '%JLINK_SCRIPT%'":: 运行JLink命令脚本
"%JLINK_PATH%" -CommanderScript "%JLINK_SCRIPT%":: 删除临时脚本
del "%JLINK_SCRIPT%":: 运行JLink命令脚本
::"%JLINK_PATH%" -CommanderScript "%SCRIPT_DIR%flash_ram.jlink" "%~1" "%~2"::禁用延迟扩展
endlocal

准备jlink脚本

flash_ram.jlink

// 连接设置
device Cortex-M3
si 1
speed 4000// 重置并停止目标设备
r
h// 下载二进制文件到RAM,路径和地址根据实际情况替换
loadbin BIN_FILE_PATH LOAD_ADDRESS// 设置中断向量表地址(假设中断向量表地址为0x10000000)
w4 0xE000ED08, 0x10000000// 读取中断向量表的第一个条目(初始堆栈指针值)
mem32 0x10000000, 1// 读取中断向量表的第二个条目(复位)
mem32 0x10000004, 1// 设置PC寄存器为读取的第二个32位值
setPC PC_VALUE// 执行程序
g// 等待程序执行
//wait 1000// 停止设备
//halt// 读取并输出当前的PC寄存器值
//regs// 退出J-Link
q

以下设置信息都可在map文件找到
设置SP
在这里插入图片描述

在这里插入图片描述
设置中断向量表
在这里插入图片描述

在这里插入图片描述

设置PC = Reset_Handler地址
在这里插入图片描述

调用执行

# 脚本名 bin文件地址 需烧录RAM区域起始地址
.\autodownload.bat "C:\Users\gs\Desktop\xxx.bin" 0x10000000

在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/379739.html

相关文章:

  • Kotlin基础——Typeclass
  • DC-DC 高压降压、非隔离AC-DC、提供强大的动力,选择优质电源芯片-(昱灿)
  • GPT-4o的视觉识别能力,将绕过所有登陆的图形验证码
  • 【LinuxC语言】进程间的通信——管道
  • CompletableFuture 基本用法
  • 网页如何发布到服务器上
  • Jenkins简要说明
  • C# 比较基础知识:最佳实践和技巧
  • Ansible 自动化运维实践
  • 红队攻防渗透技术实战流程:中间件安全:IISNGINXAPACHETOMCAT
  • 如何卸载宝塔面板?
  • python入门基础知识(错误和异常)
  • 迈巴赫S480升级增强现实AR抬头显示hud比普通抬头显示HUD更好用吗
  • vivado、vitis2022安装及其注意事项(省时、省空间)
  • 【自动驾驶】ROS小车系统
  • mysql学习——多表查询
  • 【Gradio】如何设置 Gradio 数据框的样式
  • 【ThreeJS】Threejs +Vue3 开发基础
  • cocos 如何使用九宫格图片,以及在微信小程序上失效。
  • Spring企业开发核心框架
  • Scrum团队在迭代中如何处理计划外的工作
  • 桌面识别技术革新交互,展厅互动体验步入新时代!
  • 书生·浦语大模型LagentAgentLego智能体应用搭建 第二期
  • 具有 Hudi、MinIO 和 HMS 的现代数据湖
  • 32.基于分隔符解决黏包和半包
  • 2024-6-19(沉默springboot)
  • three.js 第八节 - gltf加载器、解码器
  • Aquila-Med LLM:开创性的全流程开源医疗语言模型
  • 快速排序总结
  • 探索Linux的奇妙世界:第二关---Linux的基本指令1