问题标签 [jtag]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 尝试刷 K64F,CPU 无法停止
我正在尝试对放置在定制板上的 Cortex M4 进行编程。处理器是 MK64FN1M0VLL12。我使用 FRDM-K64F 开发板编写代码,它使用 OpenSDA 通过 USB 加载 bin。代码是用 mbed 编写的,据我所知,它不支持将程序加载到处理器。对于生产板,我计划通过 J-Link 编程器加载程序,因为我没有包含 OpenSDA 接口。
使用 J-Link Commander 工具,我发现我必须按住板上的重置按钮才能获得任何类型的响应。当我不按住重置时,我得到以下信息:
当我尝试加载 bin 时,我收到有关 CPU 未停止的消息。无论我是否仍然按住重置,我都会得到这个:
OK 消息有点误导。我尝试上传一个只有闪烁 LED 的程序,但 LED 不闪烁。
我不知道从这里去哪里。几天的谷歌搜索并没有让我有任何收获。
gdb - 如何使用 GDB(Gnu 调试器)和 OpenOCD 进行微控制器调试 - 从终端?
对 ARM 微控制器进行编程的标准(低成本)方法是使用 Eclipse,并在其中插入一个复杂的工具链。Eclipse 肯定有它的优点,但我想感觉独立于这个 IDE。我想了解当我构建(编译-链接-刷新)我的软件以及运行调试会话时幕后发生了什么。要获得如此深入的了解,最好从命令行运行整个过程。
注意:我使用的是 64 位 Windows 10。但这里解释的大多数内容也适用于 Linux 系统。请以管理员权限打开所有命令终端。这可以为您节省很多问题。
1. 构建软件
第一个“任务”完成了。我现在可以通过命令行将我的软件编译并链接成二进制文件.bin
和图像。.elf
成功的关键是找出 Eclipse 将其生成文件放在特定项目的位置。一旦你知道它们在哪里,你所要做的就是打开一个命令终端,然后输入GNU make
命令。
您不再需要 Eclipse!特别是如果您可以阅读(并理解)makefile 并在项目进展时根据您的需要对其进行调整。
请注意,在安装 SW4STM32(STM32 的系统工作台)后,我在以下文件夹中找到了 GNU 工具(编译器、链接器、make 实用程序、GDB...):
接下来,我在硬盘上创建了一个新文件夹,并将所有这些 GNU 工具复制到其中:
我将这些条目添加到“环境路径变量”中:
Huray,现在我已经在我的系统上启动并运行了所有 GNU 工具!我将以下build.bat
文件放在与以下文件相同的文件夹中makefile
:
运行这个 bat 文件应该可以完成这项工作!如果一切顺利,您将得到一个.bin
和一个.elf
二进制文件作为编译的结果。
2.刷机调试固件
接下来的自然步骤是将固件刷新到芯片并启动调试会话。在 Eclipse 中,它只是一个“单击按钮”——至少如果 Eclipse 为您的微控制器正确配置的话。但是幕后发生了什么?我已阅读(部分)来自 OpenOCD 开发人员 Dominic Rath 的硕士论文。你可以在这里找到它:http: //openocd.net/。这是我学到的:
当您单击“调试”图标时,Eclipse 会启动 OpenOCD 软件。Eclipse 还为 OpenOCD 提供了一些配置文件——这样 OpenOCD 就知道如何连接到您的微控制器。“如何连接”不是一件小事。OpenOCD 需要找到合适的 USB 驱动程序来连接到 JTAG 适配器(例如 STLink)。JTAG 适配器及其 USB 驱动程序通常由您的芯片制造商(例如 STMicroelectronics)提供。Eclipse 还将描述微控制器规格的配置文件交给 OpenOCD。一旦 OpenOCD 知道所有这些事情,它就可以与目标设备建立可靠的 JTAG 连接。
OpenOCD 启动两个服务器。第一个是 TCP 端口 4444 上的 Telnet 服务器。它可以访问 OpenOCD CLI(命令行界面)。Telnet 客户端可以连接并向 OpenOCD 发送命令。这些命令可以是简单的“停止”、“运行”、“设置断点”……
这样的命令可能足以调试您的微控制器,但许多人已经熟悉 Gnu 调试器 (GDB)。这就是为什么 OpenOCD 还在 TCP 端口 3333 上启动 GDB 服务器的原因。GDB 客户端可以连接到该端口,并开始调试微控制器!
Gnu Debugger 是一个命令行软件。许多人更喜欢可视化界面。这正是 Eclipse 所做的。Eclipse 启动了一个连接到 OpenOCD 的 GDB 客户端——但这对用户来说都是隐藏的。Eclipse 提供了一个图形界面,可以在后台与 GDB 客户端进行交互。
我做了一个图来解释所有这些事情:
>> 启动 OpenOCD
我设法从命令行启动了 OpenOCD。我会解释如何。
- 首先确保您的 STLink-V2 JTAG 编程器已正确安装。您可以使用 STMicroelectronics 的“STLink Utility 工具”测试安装。它有一个不错的 GUI,您只需单击连接按钮。
- 接下来从该网站下载 OpenOCD 软件可执行文件:http: //gnutoolchains.com/arm-eabi/openocd/。安装它,并将其放在硬盘上的文件夹中,例如“C:\Apps\”。
打开命令终端,然后启动 OpenOCD。您需要为 OpenOCD 提供一些配置文件,以便它知道在哪里寻找您的微控制器。通常您需要提供一个描述 JTAG 编程器的配置文件和一个定义您的微控制器的配置文件。
/li>-f
使用命令行中的参数将这些文件传递给 OpenOCD 。您还需要scripts
通过传递参数来授予 OpenOCD 对文件夹的访问权限-s
。这就是我使用命令行在我的计算机上启动 OpenOCD 的方式:如果您正确启动了 OpenOCD(使用正确的参数),它将启动并显示以下消息:
/li>请注意,您的终端窗口现在已被阻止。您不能再键入命令。但这是正常的。OpenOCD 在后台运行,它会阻塞终端。现在您有两个与 OpenOCD 交互的选项:您在另一个终端中启动 Telnet 会话,然后登录到 TCP 端口
localhost:4444
,这样您就可以向 OpenOCD 发出命令并接收反馈。或者您启动一个 GDB 客户端会话,并将其连接到 TCP 端口localhost:3333
。
>> 启动 Telnet 会话以与 OpenOCD 交互
这是您启动 Telnet 会话以与正在运行的 OpenOCD 程序交互的方式:
如果运行良好,您将在终端上收到以下消息:
你已经准备好向 OpenOCD 发送命令了!但我现在将切换到 GDB 会话,因为这是与 OpenOCD 交互的最方便的方式。
>> 启动 GDB 客户端会话以与 OpenOCD 交互
打开另一个终端窗口,然后键入以下命令:
该命令只是启动arm-none-eabi-gdb.exe
GDB 客户端。如果一切顺利,GDB 会启动并显示以下消息:
现在将此 GDB 客户端连接到 OpenOCD 中的 GDB 服务器:
现在您已连接到 OpenOCD!很高兴知道:如果您想使用本机 OpenOCD 命令(就像您在 Telnet 会话中所做的那样),只需在命令前加上关键字monitor
. 这样,OpenOCD 内部的 GDB 服务器将不会自己处理命令,而是将其传递给本地 OpenOCD 守护进程。
所以,现在是时候重置芯片、擦除它并停止它了:
芯片现在已经准备好从我们那里得到一些指令了。首先,我们将告诉芯片它的闪存部分 0 到 7(这是我的 1Mb 芯片中的所有闪存部分)不应受到保护:
接下来我再次停止芯片。只是要确定..
最后我将二进制.elf
文件交给 GDB:
现在是关键时刻。我要求 GDB 将这个二进制文件加载到芯片中。手指交叉:
可惜没有成功。我在 OpenOCD 中收到以下消息:
编辑:硬件问题已修复。
显然这是一个硬件问题。我从没想过我的芯片会有缺陷,因为使用 STLink Utility 工具将二进制文件加载到芯片上没有问题。只有 OpenOCD 抱怨并给出错误。所以我很自然地责怪 OpenOCD——而不是芯片本身。有关更多详细信息,请参阅下面的答案。
编辑:另一种优雅的闪存芯片方式 - 使用makefile!
随着问题得到解决,我现在将重点介绍另一种方法来执行芯片的闪存和调试。我相信这对社区来说真的很有趣!
您可能已经注意到我使用 Windows cmd 命令来执行所有必要的步骤。这可以在批处理文件中自动执行。但是还有一种更优雅的方法:在 makefile 中自动执行所有操作!先生/女士 Othane 为他/她的 Cortex-M 建议了以下 makefile?芯片。我想 Cortex-M7 芯片的过程非常相似:
亲爱的先生/女士。Othane,您能否解释一下如何在以下步骤中使用此生成文件:
- 从源代码构建二进制文件
- 闪存芯片
我知道一些关于makefile 的基础知识,但是你的makefile 真的很深入。您似乎使用了 GNU make 实用程序的一些功能。请给我们更多的解释,我会给你奖金;-)
------------------------------
linux-kernel - Linux Kernel out of tree 模块 JTAG 调试
我有一个树外 Linux 内核模块,我正在为 BeagleBoneBlack (am335x) 构建它,我想使用 Blackhawk USB100v2 JTAG 调试器进行调试。我正在使用 Code Composer Studio IDE,所以我也想使用那里的调试视图。关于我如何做到这一点的任何想法?问题是我不知道调试器是否能理解动态加载的模块。
embedded - SWD 编程适配器
ARM-JTAG-20-10和J-LINK 9-PIN CORTEX-M ADAPTER引脚是否兼容?为什么会有这么大的价格差异?
java - 在 Java 中调用 Jtag DLL 方法 (scan_multiple)
从 Java 中调用 Corelis Jtag USB-1149.1_1E 的 DLL 方法时遇到问题,即使我可以从 labview 中调用它。Corelis 用户指南scan_multiple
中有五个参数。但是data_in
是一个返回值,因此,我认为它不应该是一个参数/输入。scan_Multiple()
我应该如何用 Java构建我的结构?有多少论据?
文档:
代码:
arm - 在哪里可以找到 Cortex-M3 的设备特定 JTAG 指令?
我正在尝试通过 JTAG 与基于 Cortex-M3 的微控制器 (LPC1769) 进行通信。我已经拥有所需的硬件,并且已经设法让示例程序工作,但要进一步发展,我需要知道在这种情况下可用的特定于设备的 JTAG 指令。我已阅读 Cortex-M3 技术参考手册的相应部分(链接,告诉我的只是该设备使用标准的 CoreSight 调试端口。特别是,我想用 IDCODE 指令读取设备 ID。一些网站建议,该设备的 IDCODE 可能是 b0001 或 b1110,但它们似乎都不起作用。b0001 对我来说似乎更有可能,因为这是我在 TAP 重置后从 IR 读取的值。
我还考虑了这种可能性,即我使用的指令是正确的,而我只是没有正确读取设备 ID 寄存器。我正在使用带有 FT232H 芯片的 FTDI 电缆,我使用的应用程序基于 FTDI 的 AN129 示例代码(链接),使用 MPSSE 命令。我使用 0x2A 命令从 TAP 输入数据,使用 0x1B 命令将数据输出到 TAP,并使用 0x3B 命令同时执行这两项操作。如果有人可以提供一些见解,关于我做错了什么(或者我是否使用了正确的 IDCODE 指令),那将不胜感激。
*编辑:我取得了一些进展,但我仍然无法找到 IDCODE 指令。在将 TAP 控制器设置为 Test-Logic-Reset 状态(在 IR 中加载 IDCODE 指令)后,我设法读取了设备 ID。然而,我尝试了所有可能的 (16) 指令,虽然其中一些导致从 DR 读取不同,但没有一个加载设备 ID 寄存器。
这是我用来插入指令的函数,一旦 TAP 控制器处于 Shift-IR 状态:
长度参数设置为4,数据参数设置为0x0X(我尝试了X的所有可能值,都没有成功)
arm - 有没有办法从应用程序直接向 JTAG 端口发送数据?(皮质-M3)
我正在使用包含 Cortex-M3 的 NXP LPC1769。到目前为止,我只从 JTAG 接口访问它,但现在我必须反过来做。IT 例程应该读取内存的某些部分,并立即将它们发送到 JTAG 端口。有没有办法做到这一点?
*更新:经过数小时的研究,我发现了一些可能有帮助的东西:Cortex-M3 支持 ITM(仪器跟踪宏单元),它可以通过 JTAG 端口的 TDO 引脚发送数据。我现在的问题是,如何去做呢?我只找到了 ITM 的调试器特定应用程序,在我的例子中,我希望能够从正在运行的应用程序发送特定的 JTAG 消息(或写入特定的 DP/AP 寄存器)。
scripting - JTAG 脚本:我们如何在 JTAG 脚本语言中使用类似变量的结构
我正在尝试访问这样的结构的数组(C等效)
这在 Jtag 脚本语言中如何实现?
c - 用 C 语言与 STM32 芯片的内存交互
我想与 STM32 芯片的内存STM32L476进行交互,首先读取并存储其电子签名(MCU_ID),然后将数据写入其内存。我正在使用链接到 JTAG ST-LINK的STM32QFP64插座。
我在 C 方面相当出色,但真正开始嵌入式编程,所以我选择了Atollic Studio IDE,因为它看起来很完整,并且基于我之前已经使用过的 Eclipse。
我的问题是我找不到某种文档列出了我可以用来与芯片交互的函数、变量等。我搜索了 ST 网站上提供的几乎所有 PDF,阅读了 ST 的 GitHub,但由于我是初学者,我可能会错过这些信息,因为我不知道我要搜索的内容是什么样的。
下面的代码是无关紧要的,完全是想象出来的,但它可以帮助理解我正在尝试做的事情,我以某种方式将其描绘成这样:
因此,在这种情况下,甚至更一般地说:
1)我应该在哪里寻找这样的文件?
2) 这些函数和变量是否会根据我正在处理的 STM32 芯片而改变?
3)如果不在 StackExchange 上 ,我在哪里可以找到1)和2)的答案?
c - C中通过JTAG读取STM32L4闪存
我正在尝试在 Windows 7上使用JTAG ST-Link/V2从STM32L476芯片读取 MCU_ID(设备电子签名)。芯片内无需上传代码,程序只需在我的电脑上启动并读取此信息从闪存。
我设法从ST 网站上给出的参考手册中找到并提取了以下屏幕截图:
所以我必须使用 C 程序读取存储在 adess 0x1FFF7590 闪存中的值。我正在使用 ST 本身推荐的 Atollic TrueStudio IDE,但在我看来,它包含的"stm32l476xx.h"
库甚至不包含任何可以帮助我的功能。
到目前为止我做了什么
在花了几天时间寻找一些功能或示例来做一些像读取闪存这样简单的事情之后,我在这个网站上询问了How to interact with a STM32 chip memory,这帮助我了解了一些关于我必须做什么的事情做; 尽管如此,即使在阅读了评论中建议的所有链接和文档数天后,我仍然无法找到我想要的东西。
我问了几个专业人士,他们告诉我我应该搜索一个JTAG 驱动程序来与闪存交互,但它似乎有点复杂,我还没有找到任何东西。这个网站上有人告诉我,简单地使用指针就足够了;缺乏 C 示例和互联网教程无法帮助我弄清楚如何做到这一点。
最后,我最近开始研究 STM32Cube 和 HAL,即使我想避免使用它们,因为我认为无需包含这些层就可以完成简单的读取。在尝试使用它们之前,提出这个问题是我的最后希望。
结论:
我无法显示任何代码,因为到目前为止我唯一的东西是#include "stm32l476xx.h"
一个空的 main。
关于如何用 C 语言读取 STM32L476 的闪存的提示或解决方案将是完美的。每个与 STM32 芯片内存交互的 C(或任何低级或更高级别的编程语言)程序或指令的示例都可以帮助我很多,因为在互联网上很难找到。