硬件环境
- 树莓派4一个,本例程使用Raspberry Pi OS 64位系统,其他任何树莓派操作系统都可以
- 主机win10,安装openocd,gdb(本例程是在mingw64中安装的openocd和gdb-multiarch,linux下亦可)
- JLink ARM仿真器一个,杜邦线8条
使能树莓派JTAG管脚
编辑树莓派镜像根目录下的config.txt,添加enable_jtag_gpio=1
树莓派与JLink连线
JTAG-20 pin | JTAG signal | GPIO pin | ALT mode | P1 pin |
---|
1 | VREF | N/A | N/A | 1 | 3 | nTRST | GPIO22 | ALT4 | 15 | 4 | GND | N/A | N/A | 9 | 5 | TDI | GPIO4 | ALT5 | 7 | 7 | TMS | GPIO27 | ALT4 | 13 | 9 | TCK | GPIO25 | ALT4 | 22 | 11 | RTCK | GPIO23 | ALT4 | 16 | 13 | TDO | GPIO24 | ALT4 | 18 |
安装JLink驱动
需要注意的是,openocd并没有使用JLink原有的驱动,它只是将JLink作为一个普通的usb设备,因此需要借助zadig工具给JLink重新安装USB驱动
启动openocd
编辑保存raspberry4.cfg
adapter driver jlink
set _CHIPNAME bcm2711
set _DAP_TAPID 0x4ba00477
adapter speed 1000
transport select jtag
reset_config trst_and_srst
telnet_port 4444
# create tap
jtag newtap auto0 tap -irlen 4 -expected-id $_DAP_TAPID
# create dap
dap create auto0.dap -chain-position auto0.tap
set CTIBASE {0x80420000 0x80520000 0x80620000 0x80720000}
set DBGBASE {0x80410000 0x80510000 0x80610000 0x80710000}
set _cores 4
set _TARGETNAME $_CHIPNAME.a72
set _CTINAME $_CHIPNAME.cti
set _smp_command ""
for {set _core 0} {$_core < $_cores} { incr _core} {
cti create $_CTINAME.$_core -dap auto0.dap -ap-num 0 -ctibase [lindex $CTIBASE $_core]
set _command "target create ${_TARGETNAME}.$_core aarch64 \
-dap auto0.dap -dbgbase [lindex $DBGBASE $_core] \
-coreid $_core -cti $_CTINAME.$_core"
if {$_core != 0} {
set _smp_command "$_smp_command $_TARGETNAME.$_core"
} else {
set _smp_command "target smp $_TARGETNAME.$_core"
}
eval $_command
}
eval $_smp_command
targets $_TARGETNAME.0
启动openocd
openocd.exe -f raspberry4.cfg
openocd默认在3333端口启动gdbserver服务,在4444端口启动telnet服务
启动gdb
gdb-multiarch顾名思义就是支持多种体系结构的gdb
gdb-multiarch.exe (gdb) tar extended-remote 127.0.0.1:3333 ??# 连接gdbserver (gdb) info all-register ??# 显示所有寄存器的值 (gdb) stepi ??# 单步执行一条指令
|