PDLINK 基本使用

3 分钟阅读

Windows系统常见依赖

Libusb - 必选

产品所有的功能基于USB接口,也依赖于libusb

libusb直接从官网下载.

libusb的库安装到系统,目录libusb\VS2019\MS64\dll下面的文件copy到下面的路径中即可

  • c:\windows\system32
  • Python.exe 所在的路径,如不使用python相关应用,本步骤可以省略

如上两个最好都安装下,不同的程序和配置可能使用的路径不同

libusb的应用程序安装到系统,目录libusb\examples\bin64下的exe文件copy到系统可执行路径

powershell或者cmd窗口就可以执行类似lsusb的命令行

listdevs.exe -h
0451:8340 (bus 1, device 1) path: 22
045e:077f (bus 1, device 11) path: 6.2.5
0451:82ff (bus 1, device 7) path: 6.5
04f2:b604 (bus 1, device 3) path: 8
1a40:0201 (bus 1, device 6) path: 6.2
06cb:009a (bus 1, device 4) path: 9
045e:082e (bus 1, device 8) path: 6.2.2
1209:c550 (bus 1, device 28) path: 6.2.4
0451:8342 (bus 1, device 2) path: 6
8086:a36d (bus 1, device 0)
8087:0aaa (bus 1, device 5) path: 14
045e:082c (bus 1, device 9) path: 6.2.3
Using libusb v1.0.24.11584

Opening device 040D:0002...

Device properties:
        bus number: 1
         port path: 6->2->4 (from root hub)
             speed: 12 Mbit/s (USB FullSpeed)

Reading device descriptor:
            length: 18
      device class: 239
               S/N: 1
           VID:PID: 040D:0002
         bcdDevice: 0101
   iMan:iProd:iSer: 2:3:1
          nb confs: 1

Reading BOS descriptor: 2 caps
    USB 2.0 extension:
      attributes             : 00
    Unknown BOS device capability 05:

Reading first configuration descriptor:
             nb interfaces: 3
              interface[0]: id = 0
interface[0].altsetting[0]: num endpoints = 2
   Class.SubClass.Protocol: FF.00.00
       endpoint[0].address: 01
           max packet size: 0040
          polling interval: 00
       endpoint[1].address: 81
           max packet size: 0040
          polling interval: 00
              interface[1]: id = 1
interface[1].altsetting[0]: num endpoints = 2
   Class.SubClass.Protocol: 0A.00.00
       endpoint[0].address: 02
           max packet size: 0040
          polling interval: 00
       endpoint[1].address: 82
           max packet size: 0040
          polling interval: 00
              interface[2]: id = 2
interface[2].altsetting[0]: num endpoints = 1
   Class.SubClass.Protocol: 02.02.01
       endpoint[0].address: 84
           max packet size: 0008
          polling interval: FF

Claiming interface 0...

Claiming interface 1...
   Failed.

Claiming interface 2...
   Failed.

Reading string descriptors:
   String (0x02): "PdboLt"
   String (0x03): "PDBOLT CMSIS-DAP"
   String (0x01): "6713BDFF"

Releasing interface 0...
Releasing interface 1...
Releasing interface 2...
Closing device...

验证Python是否可以正常使用Libusb - 可选

运行下面的Python代码,代码应该可以打印出libusb的路径 并且没有错误输出。

import os
print("System32 exists: %s" % os.path.exists("C:\\Windows\\System32"))
print("libusb-1.0.dll exists: %s" % os.path.exists("C:\\Windows\\System32\\libusb-1.0.dll"))

from ctypes.util import find_library
print("find_library: %s" % find_library("libusb-1.0"))

import os
os.environ['PYUSB_DEBUG'] = 'debug'
import usb.core
# No error repot. Can print libusb dll path
# Example output
# System32 exists: True
# libusb-1.0.dll exists: True
# find_library: C:\WINDOWS\system32\libusb-1.0.dll
# 2021-02-26 10:56:25,040 DEBUG:usb.backend.libusb1:_LibUSB.__init__(<WinDLL 'C:\WINDOWS\system32\libusb-1.0.dll', handle 7fff2da50000 at 0x2a533fa1f98>)
# 2021-02-26 10:56:25,045 INFO:usb.core:find(): using backend "usb.backend.libusb1"
# 2021-02-26 10:56:25,045 DEBUG:usb.backend.libusb1:_LibUSB.enumerate_devices()
# 2021-02-26 10:56:25,070 DEBUG:usb.backend.libusb1:_LibUSB.get_device_descriptor(<usb.backend.libusb1._Device object at 0x000002A533DDAD68>)
# 2021-02-26 10:56:25,071 DEBUG:usb.backend.libusb1:_LibUSB._finalize_object()

usb.core.find()

Openocd - 按需

Openocd可以方便的调试、下载程序,可以从其官网下载

把资源包中的 openocd-20201228\OpenOCD-20201228-0.10.0\bin中的

  • openocd.bat
  • pdlink-stm32.cfg

拷贝到对应的openocd目录下

注意openocd的cfg需要对应的执行路径,如不想探究其细节,直接在openocd的bin目录下执行openocd命令即可

.\openocd.exe -f .\pdlinkj-stm32.cfg
Open On-Chip Debugger 0.10.0 (2020-12-28) [https://github.com/sysprogs/openocd]
Licensed under GNU GPL v2
libusb1 09e75e98b4d9ea7909e8837b7a3f00dda4589dc3
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "swd". To override use 'transport select <transport>'.
Warn : Transport "swd" was already selected
Info : CMSIS-DAP: SWD  Supported
Info : CMSIS-DAP: FW Version = 1.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 100 kHz
Info : SWD DPIDR 0x1ba01477
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Error: stm32f1x.cpu -- clearing lockup after double fault
Polling target stm32f1x.cpu failed, trying to reexamine
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread

Pyocd - 按需

目前pyocd尚无法正常烧录

pip安装pyocd

在资源包的pyocd目录里面执行pyocd.bat list等命令

注意,因未详细调试reset管脚的状态,需要先通过跳线将stm32的boot管脚设置为升级模式并重新启动

pyocd list
  #   Probe                     Unique ID
-------------------------------------------
  0   PdboLt PDBOLT CMSIS-DAP   7733BDFF

❯ .\pyocd.bat cmd -v -t stm32f103c8
0001445:WARNING:cmsis_pack:Overlapping memory regions in file <zipfile.ZipFile filename='./packs/Keil.STM32F7xx_DFP.2.12.0-small.pack' mode='r'>, deleting outer region. Further warnings will be suppressed for this file.
0001562:WARNING:cmsis_pack:Overlapping memory regions in file <zipfile.ZipFile filename='./packs/Keil.STM32L4xx_DFP.2.3.0-small.pack' mode='r'>, deleting outer region. Further warnings will be suppressed for this file.
0001624:INFO:board:Target type is stm32f103c8
0001878:INFO:dap:DP IDR = 0x1ba01477 (v1 rev1)
0001887:INFO:ap:AHB-AP#0 IDR = 0x14770011 (AHB-AP var1 rev1)
0001902:INFO:rom_table:AHB-AP#0 Class 0x1 ROM table #0 @ 0xe00ff000 (designer=020 part=410)
0001911:INFO:rom_table:[0]<e000e000:SCS-M3 class=14 designer=43b part=000>
0001917:INFO:rom_table:[1]<e0001000:DWT class=14 designer=43b part=002>
0001924:INFO:rom_table:[2]<e0002000:FPB class=14 designer=43b part=003>
0001930:INFO:rom_table:[3]<e0000000:ITM class=14 designer=43b part=001>
0001936:INFO:rom_table:[4]<e0040000:TPIU-M3 class=9 designer=43b part=923 devtype=11 archid=0000 devid=ca0:0:0>
0001938:INFO:cortex_m:CPU core #0 is Cortex-M3 r1p1
0001945:INFO:dwt:4 hardware watchpoints
0001949:INFO:fpb:6 hardware breakpoints, 4 literal comparators
Connected to STM32F103C8 [Running]: 773FBDFF

Usb 工具

抓包

安装USBPcap

安装后需要重启

cd C:\Program Files\USBPcap
USBPcapCMD.exe
1

这个命令行会弹出窗口显示可用的抓包,新笔记本往往是一个root hub出来的,因此这里只有一个1可选 选择对应的端口后,输入报文存储的文件,如test.pcap

此时,插拔USB设备即可

这种方式可以抓到部分包

Linux抓包

modprobe usbmon
tcpdump -D 

tcpdump 能显示usbmon借口即可

killall tcpdump 
tcpdump -i usbmon1 -w test.pcap &
lsusb -v -d 040D:0002

killall tcpdump 查看test.pcap即可

Saleae Logic 16抓包

  • 飞线 DP/DM到CH0、CH1
  • Disable all 2-15 Channel
  • 信号触发选择低电平方波触发
  • 选100M
  • Start Simulation
  • Analyzers 选择USB FS/LS

此时可以导出各种形式的信息,用于分析

信息查看

  • usbtreeview
  • usbview