Jlink下载固件到RAM区


环境: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_name
    exit /b 1
)

set FIND_EXE_NAME=%~1

echo 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=%%i
   goto :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=%%i
   goto :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=%%i
	  goto :found
   )
)

:found
echo Found %FIND_EXE_NAME% at %FIND_EXE_NAME_PATH%
goto :eof

读取bin数据解析

read_bin.py

import struct
import sys

def 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 None
        return 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_address
    exit /b 1
)

if "%~2"=="" (
    echo Usage: %SCRIPT_NAME% path_to_bin_file load_address
    exit /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.txt

REM 获取 Python 脚本的输出
for /f "delims=" %%i in (result.txt) do (
    set PC_VALUE=%%i
)

REM 删除临时文件
del result.txt

echo 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

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

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值