我正在尝试编写一个类似于 stmicro STM-STUDIO的应用程序,它通过 USB从设备( STM32Fx Discovery )上运行的嵌入式应用程序读取变量。如何读取来自开发板的输出(变量),最好是使用 C# 应用程序的应用程序?
2 回答
您应该四处搜索,看看是否有某种 API 或库可用于与 SWD 调试器对话。或者,也许他们有一个命令行界面,您可以从您的程序中运行。您可以尝试联系制造商 (ST)。
如果他们不支持你,那么是时候戴上逆向工程的帽子了。我会得到一个USB协议分析仪。 Total Phase卖的不错,我用他们 400 美元的一个来调试我的 USB 设备已经很长时间了。您的操作系统可能还具有一些内置的 USB 调试功能。然后只需运行 STM STUDIO 并查看单击各种按钮时会发生什么。希望你能弄清楚。
您可能需要深入了解 SWD 协议才能确定您在分析仪上看到的 USB 流量。
如果您使用 OpenOCD(如果您使用OpenStm32通过 USB 连接的 ST-Link 进行开发和调试,您可能就是这样),那么您可以通过端口4444上的telnet连接到 OpenOCD并发出命令来读取和写入内存。您可以通过交互式 telnet 会话尝试此操作。在 telnet 会话中,读取 32 位变量的OpenOCD 命令是. 例如,要读取 RAM 中地址 0x20000024 的变量,请使用命令并期待响应,例如89ABCDEF 表示十六进制值。在 C# 中转换十六进制值可以使用如下表达式完成mdw <hexAddress>
mdw 0x20000024
0x20000242: 89ABCDEF
UInt32 myUInt32 = UInt32.Parse(myHexString, System.Globalization.NumberStyles.HexNumber);
这里有一个教程 .pdf ,描述了如何使用 telnet 连接到 OpenOCD。
那么问题是......应该使用哪些内存地址?有两种获取地址的方法:从链接器 .map 文件(以编程方式或手动方式)获取地址,或使用库从 .elf 文件中解析和提取调试信息。
我还没有找到一个独立的 DLL 或 dot.net 包装器,它可以在一个包中完成所有这些工作。
另一个类似于 STM-Studio 的工具是 TI 的GUI Composer,它适用于 TI 的 ARM 处理器并通过 JTAG 或 SWD 进行通信。我没有尝试将 GUI Composer 与 STM 处理器一起使用,但概念相似,即使用调试接口作为 GUI 的一种通信协处理器,无需修改固件。