如何使用 JTAG 链接调试两个或多个微控制器?

Posted

技术标签:

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

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

设置

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

目标

现在我想升级一点。

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

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

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

对于一个 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 的板配置示例?

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

【问题讨论】:

【参考方案1】:

    我能够弄清楚如何使用 Openocd 对两个微控制器进行编程

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

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

    由于两个 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```
    
    

    用于启动openocd的命令如下: sudo openocd -d2 -f interface/ftdi/dp_busblaster_kt-link.cfg -f board/stm32trail.cfg -c init -c scan_chain -c targets

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

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

      目标 stm32master.cpu 停止 目标 stm32slave.cpu 停止 闪存擦除扇区 0 0 7 flash write_image 擦除 /home/nikhil/Downloads/Red_Led_C13.hex verify_image /home/nikhil/Downloads/Red_Led_C13.hex 重置 目标 stm32master.cpu 停止 闪存擦除扇区 0 0 7 flash write_image 擦除 /home/nikhil/Downloads/Red_Led_C13.hex verify_image /home/nikhil/Downloads/Red_Led_C13.hex 重置 我能够成功地对两个 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 链接,我将很快发布我的解决方案。

以上是关于如何使用 JTAG 链接调试两个或多个微控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将pdf数据发送到微控制器

通过 OpenOCD 的 STM32 读出保护

ST-LINK是干啥用的是否跟J-LINK一样

如何在微控制器中创建 UART Pass through

将部分拆分为多个内存区域

如何在 STM32 微控制器上的两个程序之间共享单段闪存