如何通过USB读取swd输出?

时间:2013-11-03 13:46:49

标签: arm stm32 libusb-1.0 stm32f4discovery cortex-m

我正在尝试编写类似于stmicro STM-STUDIO的应用程序,该应用程序通过USB从设备(STM32Fx Discovery)上运行的嵌入式应用程序中读取变量。我如何阅读来自电路板的输出(变量),最好是使用C#应用程序的应用程序?

2 个答案:

答案 0 :(得分:1)

您应该四处搜索并查看是否存在可用于与SWD调试器通信的某种API或库。或者也许他们有一个可以从你的程序运行的命令行界面。您可以尝试联系制造商(ST)。

如果他们不支持你,那么是时候加上逆向工程帽了。我会得到一个USB协议分析仪。 Total Phase卖得很好,而且我已经用他们的400美元来调试我的USB设备很长一段时间了。您的操作系统可能还具有一些内置的USB调试功能。然后只需运行STM STUDIO,看看单击各种按钮时会发生什么。希望你能搞清楚。

您可能需要深入了解SWD协议,以便找出您在分析仪上看到的USB流量。

答案 1 :(得分:0)

如果您使用OpenOCD(如果您正在使用OpenStm32通过USB连接的ST-Link进行开发和调试,则可能就是这样),那么您可以通过 telnet连接到OpenOCD on port 4444 并发出读写内存的命令。您可以使用交互式telnet会话尝试此操作。在telnet会话中,读取32位变量的OpenOCD commandmdw <hexAddress>。例如,要读取地址为0x20000024的RAM中的变量,请使用命令mdw 0x20000024并期望响应0x20000242: 89ABCDEF,其中89ABCDEF表示十六进制值。在C#中转换十六进制值可以使用类似UInt32 myUInt32 = UInt32.Parse(myHexString, System.Globalization.NumberStyles.HexNumber);

的表达式来完成

有一个教程.pdf here,描述了如何使用telnet连接到OpenOCD。

那么问题是......应该使用哪些内存地址?有两种方法可以获取地址:从链接器.map文件中获取它(以编程方式或手动方式)或使用库来解析&amp;从.elf文件中提取调试信息。

我还没有找到一个自包含的DLL或dot.net包装器,可以在一个包中完成所有这些。

与STM-St​​udio类似的另一个工具是T.I。GUI Composer,它适用于T.I。的ARM处理器,并通过JTAG或SWD进行通信。我还没有尝试过使用带有STM处理器的GUI Composer,但概念类似,即使用调试接口作为GUI的一种通信协处理器而不修改FW。