ARM板的JTAG口被关闭了,ULINK调试时提示“can't stop ARM device”,该怎么解决啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM板的JTAG口被关闭了,ULINK调试时提示“can't stop ARM device”,该怎么解决啊?相关的知识,希望对你有一定的参考价值。

一、问题
本人在使用MDK和Ulink2的期间,发现有些情况下使用Ulink2调试会出现一些问题。比如在调试开始时弹出对话框“Could not stop ARM device!,please check the JTAG cable!”。根本无法进入调试阶段。
二、原因及对应的解决方法
核心原因主要有两种:第一种是ULINK JTAG设置频率高于目标板芯片运行频率;第二种是在JTAG获得控制权之前,芯片上执行某些指令将JTAG口禁用掉。其中以后一种原因居多。原因虽只有两种,但具体的解决方法依据不同的硬件特点各有不同。下面给出一些典型的解决方案,对于示例中没出现过的板子,读者可灵活应用之。
1、ULINK JTAG频率设置过高,有些芯片频率达不到所设置的频率,自然会出现问题,这时需要在ULINK设置中将频率降低。例如:
在调试LPC2378的过程中,进行修改其系统时钟频率得的测试,本来在12M的情况下是没有问题的,我将频率改成72M其最高是72M,结果Download失败,提示“Could not stop ARM device!,please check the JTAG cable!”。后来发现是时钟频率设置问题,将频率降低解决了这一问题。

2、对于第二种情况,首先应该尝试在调置ULINK JTAG中勾上USE Reset at Startup。不行的话,重启一下试试。另外有两种原因导致JTAG被禁用掉,一种原因是重启系统时由于没有正确的引导代码,CPU可能执行一些随机指令,这些指令可能将JTAG禁用,例如:在STR71x中出现过这种情况,解决方法是将启用boot loader,
BOOTEN = 1 打开启动引脚
BOOT1 = 0, BOOT0 = 1 打开 boot loader
这样CPU在重启之后会执行正确的指令,而不会禁用JTAG。

另外还有一种原因,就是在重启时执行的程序可能会误将JTAG禁用掉。在这种情况下,需要将Flash中的程序擦除掉。例如对于PHILIPS LPC2000。程序中的语句“PINSEL2 = 0x8”会禁用JTAG。此时可以下载通过串口擦写的工具将Flash擦除。即可解决这一问题。
再比如对于STR9[size=10.5pt],我们可以用以下步骤来擦除[size=10.5pt]Flash解决这一问题[size=10.5pt]:

[size=10.5pt]A、将STR9[size=10.5pt]设备的电源关掉。

[size=10.5pt]B、一直按住[size=10.5pt]Reset按键,并打开电源。

[size=10.5pt]C、打开一个[size=10.5pt]矿ision STR9的工程。并添加[size=10.5pt]Flash算法,执行[size=10.5pt]Flash菜单中的[size=10.5pt]Erase命令。

[size=10.5pt]D、等待[size=10.5pt]0.5秒左右[size=10.5pt],不能大于[size=10.5pt]1.5秒。

[size=10.5pt]E、松开[size=10.5pt]Restet键。

这样[size=10.5pt]Flash将被擦除,[size=10.5pt]JTAG可以正常使用了。
参考技术A 我的遇到 这个问题,后来检查是JTAG调试被禁用,
// __HAL_AFIO_REMAP_SWJ_DISABLE();
调用这个__HAL_AFIO_REMAP_SWJ_ENABLE()就可以了,
参考技术B 修改uboot的配置选项~

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

【中文标题】如何使用 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 链接,我将很快发布我的解决方案。

以上是关于ARM板的JTAG口被关闭了,ULINK调试时提示“can't stop ARM device”,该怎么解决啊?的主要内容,如果未能解决你的问题,请参考以下文章

单片机程序接口是啥?

jtag调试ls1012a linux-5.3内核

jtag调试ls1012a linux-5.3内核

Jtag与Jlink有啥区别

豹哥嵌入式讲堂:ARM Cortex-M调试过程探析- 4线接口标准(JTAG)

如何搭建BigBlueButton开发环境