【问题标题】:How to debug two or more microcontrollers with JTAG chaining?如何使用 JTAG 链接调试两个或多个微控制器?
【发布时间】:2021-04-16 06:59:17
【问题描述】:

我设法编程和调试了一个 STM32F4 微控制器,做了一些简单的操作并编写了一些小脚本。

设置

  • 微控制器:STM32F405RG
  • 调试探针:我使用的是 Amontec 的旧 JTAGKEY2
  • 工具链:端口 3333 上的 openOCD 和 GDB
  • 我没有使用任何 GUI 和任何特定的软件工具。

目标

现在我想升级一点。

我的项目由 PCB 上的 3 个 MCU 组成,以冗余方式工作。

我想调试两个或更多的STM32F4,并在一个 MCU中进行一些操作,而其他的暂停。这是一个例子:

    1. 使用相同的 .elf 对所有设备(我们称之为 MCU1 和 MCU2)进行编程。
    1. 运行。
    1. 在特定时间(如运行后 10 秒)停止 MCU1 和 MCU2。
    1. 仅修改 MCU1 的 r4
    1. 恢复所有目标。

对于一个 MCU,我将目标配置文件称为 smt32f4x.cfg。 对于两个 MCU,我阅读了 OpenOCD 用户指南,看来我必须创建一个 新的水龙头。 但首先,我想尝试使用相同的配置调试 MCU1 和 MCU2。 我为系统连接了总线上的 MCU,打开了一个终端并在我的项目文件夹中输入了openocd

问题

正如预期的那样,我收到了这条消息:

Info : JTAG tap: STM32F405RGTx.bs tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: auto1.tap tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477"
Warn : AUTO auto1.tap - use "jtag newtap auto1 tap -irlen 5 -expected-id 0x06413041"
Info : STM32F405RGTx.cpu: hardware has 6 breakpoints, 4 watchpoints
adapter speed: 2000 kHz
Info : JTAG tap: STM32F405RGTx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: STM32F405RGTx.bs tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: auto1.tap tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x08000910 msp: 0x20020000

然后发生的情况是只有一个 MCU 被编程。

所以我想我可以创建一个板配置文件并使用 jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477 每个 TAP 使用一个 DAP ...

由于我对自己的技能没有信心,我没有设法从头开始创建自己的配置文件。

而且我没有找到几个微控制器的配置示例,也没有在 gdb 中找到向总线上不同 MCU 提供不同命令的调试命令的示例。

问题

  • 在哪里可以找到具有多个 MCU 的板配置示例?

  • 是否可以仅向其中一个正在调试的设备发出调试命令?怎么样?

【问题讨论】:

    标签: debugging stm32 stm32f4 openocd jtag


    【解决方案1】:
    1. 我能够弄清楚如何使用 Openocd 对两个微控制器进行编程

    2. 我目前正在使用包含 FT2232 USB 到 JTAG 转换器 IC 的 USB Bus Blaster V4 开发板。

    3. 我的设置由 2 个 STM32 MCU 组成,采用菊花链配置。

    4. 由于两个 MCU 具有相同的分接头 IC,我按照第 22 页第 6.2.1 节用户指南的建议制作了板配置文件,如下所示:

      set CHIPNAME stm32master
      source [find target/stm32f4x.cfg]
      
      -# Chip #2: STM32F405 for Slave STM32, little endian
      set CHIPNAME stm32slave
      source [find target/stm32f4x.cfg]
      
      gdb_memory_map disable
      reset_config srst_only```
      
      
    5. 用于启动openocd的命令如下: sudo openocd -d2 -f interface/ftdi/dp_busblaster_kt-link.cfg -f board/stm32trail.cfg -c init -c scan_chain -c targets

    6. 我在终端执行上述命令后的输出如下:

    7. 我在telnet本地主机执行命令的顺序如下:

      1. 目标 stm32master.cpu
      2. 停止
      3. 目标 stm32slave.cpu
      4. 停止
      5. 闪存擦除扇区 0 0 7
      6. flash write_image 擦除 /home/nikhil/Downloads/Red_Led_C13.hex
      7. verify_image /home/nikhil/Downloads/Red_Led_C13.hex
      8. 重置
      9. 目标 stm32master.cpu
      10. 停止
      11. 闪存擦除扇区 0 0 7
      12. flash write_image 擦除 /home/nikhil/Downloads/Red_Led_C13.hex
      13. verify_image /home/nikhil/Downloads/Red_Led_C13.hex
      14. 重置
      15. 我能够成功地对两个 MCU 进行编程。

    【讨论】:

      【解决方案2】:

      我是使用多个 st-link 的序列号完成的。

      #To invoke without this script: openocd -s /share/openocd/scripts -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg 
      
      gdb_port 3334
      tcl_port 6667
      telnet_port 4445
      
      #To run: openocd -s /share/openocd/scripts and then telnet localhost 4445
      #To erase type into telnet: flash erase_sector 0 0 127 
      #To read device ID and Flash size type into telnet: flash probe 0
      
      source [find interface/stlink-v2-1.cfg]
      hla_serial \x56\x3F\x6E\x06\x66\x3F\x48\x55\x38\x57\x09\x67
      transport select hla_swd
      
      source stm32f1x-nores.cfg
      
      reset_config none srst_nogate
      

      查看 hla_serial 行。每个 MCU 都有自己的通过 SWD 连接的 st-link,每个 st-link 都有自己的 oocd 配置,带有序列号和自己的端口。然后为每一个启动oocd,您将获得每个MCU的GDB服务器。

      您可以在 Linux 上使用 lsusb -v 命令获取 st-link 的序列号。有些克隆没有序列号,有些需要升级。谷歌会帮助你。

      【讨论】:

      • 感谢您的帮助!其实这是一个很好的解决方法!为了使用 JTAG 链接,我将很快发布我的解决方案。
      猜你喜欢
      • 2022-01-13
      • 2014-02-05
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多