【项目实例】通过Jlink读取芯片ID

1. 项目背景

公司有一款产品需要在生产时通过读取它的芯片ID来生成一个二维码,用于后续问题追踪。

2. 环境

  • Windows
  • Jlink.exe
  • Jlink连接器
  • 开发板 AMA3B2KK-KBR

接下来我们会通过两种方式读取芯片ID,使用Jlink Comander工具和通过BAT脚本读取。

3. Jlink Comander使用

Jlink Comander是jlink的命令行工具,可以直接在里面输入命令。
打开Jlink Comander的第一个界面是这样的:
在这里插入图片描述
打开会去自动识别Jlink,如果识别成功的话,可以显示出它的序列号,如上图的S/N: 59602747。

根据提示,输入“connect”可建立连接,输入“?”查看帮助。

3.1 建立连接

输入connect,识别到了芯片的类型"AMA3B2KK-KBR"。接着选择连接方式 J S T,最后选择通讯速度。
在这里插入图片描述

3.2 查看帮助

输入“?”,可以看到支持哪些命令。

J-Link>?

Available commands are:
----------------------
f          Firmware info
h          halt
IsHalted   Returns the current CPU state (halted / running)
WaitHalt   Waits until the CPU is halted or the given timeout is exceeded.
             Syntax: WaitHalt <TimeoutMs>  Default timeout is 1000 ms
g          go
Sleep      Waits the given time (in milliseconds). Syntax: Sleep <delay>
s          Single step the target chip
             Syntax: s [<NumSteps (dec)>]
st         Show hardware status
hwinfo     Show hardware info
mem        Read memory. Syntax: mem  [<Zone>:]<Addr>, <NumBytes> (hex)
mem8       Read  8-bit items. Syntax: mem8  [<Zone>:]<Addr>, <NumBytes> (hex)
mem16      Read 16-bit items. Syntax: mem16 [<Zone>:]<Addr>, <NumItems> (hex)
mem32      Read 32-bit items. Syntax: mem32 [<Zone>:]<Addr>, <NumItems> (hex)
w1         Write  8-bit items. Syntax: w1 [<Zone>:]<Addr>, <Data> (hex)
w2         Write 16-bit items. Syntax: w2 [<Zone>:]<Addr>, <Data> (hex)
w4         Write 32-bit items. Syntax: w4 [<Zone>:]<Addr>, <Data> (hex)
erase      Erase internal flash of selected device. Syntax: Erase
wm         Write test words. Syntax: wm <NumWords>
is         Identify length of scan chain select register
ms         Measure length of scan chain. Syntax: ms <Scan chain>
mr         Measure RTCK react time. Syntax: mr
q          Quit
qc         Close JLink connection and quit
eoe        Exit on error
             Syntax: eoe <1/0>
r          Reset target         (RESET)
rx         Reset target         (RESET). Syntax: rx <DelayAfterReset>
RSetType   Set the current reset type. Syntax: RSetType <type>
Regs       Display contents of registers
wreg       Write register.   Syntax: wreg <RegName>, <Value>
moe        Shows mode-of-entry, meaning: Reason why CPU is halted
SetBP      Set breakpoint.   Syntax: SetBP <addr> [A/T] [S/H]
SetWP      Set Watchpoint. Syntax: <Addr> [R/W] [<Data> [<D-Mask>] [A-Mask]]
ClrBP      Clear breakpoint. Syntax: ClrBP  <BP_Handle>
ClrWP      Clear watchpoint. Syntax: ClrWP  <WP_Handle>
VCatch     Write vector catch. Syntax: VCatch <Value>
loadfile   Load data file into target memory.
             Syntax: loadfile <filename>, [<addr>]
             Supported extensions: *.bin, *.mot, *.hex, *.srec
             <addr> is needed for bin files only.
loadbin    Load *.bin file into target memory.
             Syntax: loadbin <filename>, <addr>
savebin    Saves target memory into binary file.
             Syntax: savebin <filename>, <addr>, <NumBytes>
verifybin  Verfies if the specified binary is already in the target memory at the specified address.
             Syntax: verifybin <filename>, <addr>
SetPC      Set the PC to specified value. Syntax: SetPC <Addr>
le         Change to little endian mode
be         Change to big endian mode
log        Enables log to file.  Syntax: log <filename>
unlock     Unlocks a device. Syntax: unlock <DeviceName>
           Type unlock without <DeviceName> to get a list
           of supported device names.
           nRESET has to be connected
term       Test command to visualize printf output from the target device,
           using DCC (SEGGER DCC handler running on target)
ReadAP     Reads a CoreSight AP register.
           Note: First read returns the data of the previous read.
           An additional read of DP reg 3 is necessary to get the data.
ReadDP     Reads a CoreSight DP register.
           Note: For SWD data is returned immediately.
           For JTAG the data of the previous read is returned.
           An additional read of DP reg 3 is necessary to get the data.
WriteAP    Writes a CoreSight AP register.
WriteDP    Writes a CoreSight DP register.
SWDSelect  Selects SWD as interface and outputs
           the JTAG -> SWD switching sequence.
SWDReadAP  Reads a CoreSight AP register via SWD.
           Note: First read returns the data of the previous read.
           An additional read of DP reg 3 is necessary to get the data.
SWDReadDP  Reads a CoreSight DP register via SWD.
           Note: Correct data is returned immediately.
SWDWriteAP Writes a CoreSight AP register via SWD.
SWDWriteDP Writes a CoreSight DP register via SWD.
Device     Selects a specific device J-Link shall connect to
           and performs a reconnect.
           In most cases explicit selection of the device is not necessary.
           Selecting a device enables the user to make use of the J-Link
           flash programming functionality as well as using unlimited
           breakpoints in flash memory.
           For some devices explicit device selection is mandatory in order
           to allow the DLL to perform special handling needed by the device.
ExpDevList Exports the device names from the DLL internal
           device list to a text file
             Syntax: ExpDevList <Filename>
ExpDevListXML Exports the device names from the DLL internal
           device list to a text file in XML format
             Syntax: ExpDevListXML <Filename>
PowerTrace Perform power trace (not supported by all models)
Syntax: PowerTrace <LogFile> [<ChannelMask> <RefCountSel>]
<LogFile>: File to store power trace data to
<ChannelMask>: 32-bit mask to specify what channels shall be enabled
<SampleFreq>: Sampling frequency in Hz (0 == max)
<RefCountSel>:       0: No reference count
                     1: Number of bytes transmitted on SWO
---- CP15 ------------
rce        Read CP15.  Syntax: rce <Op1>, <CRn>, <CRm>, <Op2>
wce        Write CP15. Syntax: wce <Op1>, <CRn>, <CRm>, <Op2>, <Data>
---- ICE -------------
Ice        Show state of the embedded ice macrocell (ICE breaker)
ri         Read Ice reg.  Syntax: ri <RegIndex>(hex)
wi         Write Ice reg. Syntax: wi <RegIndex>, <Data>(hex)
---- TRACE -----------
TClear     TRACE - Clear buffer
TSetSize   TRACE - Set Size of trace buffer
TSetFormat TRACE - SetFormat
TSR        TRACE - Show Regions (and analyze trace buffer)
TStart     TRACE - Start
TStop      TRACE - Stop
---- SWO -------------
SWOSpeed   SWO - Show supported speeds
SWOStart   SWO - Start
SWOStop    SWO - Stop
SWOStat    SWO - Display SWO status
SWORead    SWO - Read and display SWO data
SWOShow    SWO - Read and analyze SWO data
SWOFlush   SWO - Flush data
SWOView    SWO - View terminal data
---- PERIODIC --------
PERConf    PERIODIC - Configure
PERStart   PERIODIC - Start
PERStop    PERIODIC - Stop
PERStat    PERIODIC - Display status
PERRead    PERIODIC - Read and display data
PERShow    PERIODIC - Read and analyze data
---- File I/O --------
fwrite     Write file to emulator
fread      Read file from emulator
fshow      Read and display file from emulator
fdelete    Delete file on emulator
fsize      Display size of file on emulator
flist      List directory on emulator
SecureArea Creates/Removes secure area on probe
---- Test ------------
TestHaltGo   Run go/halt 1000 times
TestStep     Run step 1000 times
TestCSpeed   Measure CPU speed.
             Parameters: [<RAMAddr>]
TestWSpeed   Measure download speed into target memory.
             Parameters:  [<Addr> [<Size>]]
TestRSpeed   Measure upload speed from target memory.
             Parameters: [<Addr> [<Size>] [<NumBlocks>]]
TestNWSpeed  Measure network download speed.
             Parameters: [<NumBytes> [<NumReps>]]
TestNRSpeed  Measure network upload speed.
             Parameters: [<NumBytes> [<NumReps>]]
---- JTAG ------------
JTAGConf   Set number of IR/DR bits before ARM device.
             Syntax: Config <IRpre>, <DRpre>
speed      Set target interface speed. Syntax: speed <freq>|auto|adaptive, e.g. speed 2000, speed a
i          Read JTAG Id (Host CPU)
wjc        Write JTAG command (IR). Syntax: wjc <Data>(hex)
wjd        Write JTAG data (DR). Syntax: wjd <Data64>(hex), <NumBits>(dec)
RTAP       Reset TAP Controller using state machine (111110)
wjraw      Write Raw JTAG data. Syntax: wjraw <NumBits(dec)>, <tms>, <tdi>
rt         Reset TAP Controller (nTRST)
---- JTAG-Hardware ---
c00        Create clock with TDI = TMS = 0
c          Clock
tck0       Clear TCK
tck1       Set   TCK
0          Clear TDI
1          Set   TDI
t0         Clear TMS
t1         Set   TMS
trst0      Clear TRST
trst1      Set   TRST
r0         Clear RESET
r1         Set   RESET
---- Connection ------
usb        Connect to J-Link via USB.  Syntax: usb <port>, where port is 0..3
ip         Connect to J-Link ARM Pro or J-Link TCP/IP Server via TCP/IP.
           Syntax: ip <ip_addr>
---- Configuration ---
si         Select target interface. Syntax: si <Interface>,
           where <Interface> can be any supported target interface (e.g SWD, JTAG, ICSP, FINE, ...
power      Switch power supply for target. Syntax: power <State> [perm],
           where State is either On or Off. Example: power on perm
wconf      Write configuration byte. Syntax: wconf <offset>, <data>
rconf      Read configuration bytes. Syntax: rconf
license    Shows a list of all available license commands
ipaddr     Show/Assign IP address and subnetmask of/to the connected J-Link.
gwaddr     Show/Assign network gateway address of/to the connected J-Link.
dnsaddr    Show/Assign network DNS server address of/to the connected J-Link.
conf       Show configuration of the connected J-Link.
calibrate  Calibrate the target current measurement.
selemu     Select a emulator to communicate with,
           from a list of all emulators which are connected to the host
           The interfaces to search on, can be specified
             Syntax: selemu [<Interface0> <Interface1> ...]
ShowEmuList Shows a list of all emulators which are connected to the host.
            The interfaces to search on, can be specified.
             Syntax: ShowEmuList [<Interface0> <Interface1> ...]
VCOM        enable/disable VCOM. Takes effect after power cycle of the J-Link
             Syntax: VCOM <enable|disable>
VTREF       Sets a fixed value for VTref on J-Link.
              Syntax: VTREF <ValuemV>
----------------------

4. 通过Jlink Comander读取芯片ID

从帮助里面可以看出,mem 是读取内存的命令。AMA3B2KK-KBR的芯片ID的寄存器地址是0x40020004。
在这里插入图片描述
以上命令成功读取到的芯片ID,其中0x40020004代表起始地址,8代表读取的长度,单位是字节。

5. 通过BAT脚本读取

Jlink命令需要放在一个*.jlink文件里面,所以我们在实践中是在一个批处理文件里面去调用它。读取到的芯片ID存储到chip_id.txt中。
在这里插入图片描述
话不多说,直接上代码。

5.1 jlink文件

si SWD
Device AMA3B2KK-KBR
speed 4000

mem 0x40020004 8

q

5.2 bat 文件

@echo off
SET ids=59602747

:LOOP
pause
echo ==== 读取CHIP ID ====

C:\Keil_v5\ARM\Segger\JLink.exe usb %ids% Read_chipid.jlink > temp.txt

findstr "40020004" temp.txt > chip_id.txt
type chip_id.txt
::equ ==   neq !=
::0 ok else error
if %errorlevel% neq 0 (
color 04
echo 读取失败!
)

::del chip_id.txt
del temp.txt
ping 127.0.0.1 -n 3 >nul
cls

goto LOOP

5.3 结果文件 chip_id.txt

40020004 = 02 61 FA 33 29 F3 D5 09 

5.4 运行界面

在这里插入图片描述

6. 写在最后

Jlink的功能很强大,大家可多试试帮助里面的命令。本文通过读取ID来介绍,希望能起到以小见大的作用。

如对以上内容有疑问请在评论区留言,我们会尽快回复。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

强人电子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值