【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

通过使用带FT2232H适配器的OpenOCD调试器,了解如何轻松刷新基于ARM的MCU。

 

来自ATMEL和MICROCHIP等供应商的旧MCU,如PIC16F和Atmega系列,往往有一个特殊的编程接口来编程内部闪存。例如,Atmega使用SPI引脚(MISO,MOSI,SCK),PIC使用两个引脚(PGC,PGD) - 一个作为时钟,另一个作为双向数据线。

 

新的MCU,尤其是ARM内核,使用JTAG / SWD作为编程/调试接口。

 

联合测试行动小组(JTAG)和串行线路调试(SWD)有什么区别?答案是创建SWD作为JTAG的替代方案,以节省MCU封装中的引脚:SWD将5引脚JTAG接口替换为只有2引脚的引脚。 

 

为了与目标芯片通信,我们需要主机和硬件上的程序作为主机和芯片之间的桥梁。在本教程中,我们将使用OpenOCD作为主机上的程序来发送命令并使用SWD进行通信。我们将使用FT2232H作为桥接器,将信号从USB端口转换为SWD接口。

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

SWD接口信号

 

OpenOCD概述

 

Open On-Chip Debugger(OpenOCD)是一个免费的开源项目,旨在使用调试适配器提供调试,系统内编程和边界扫描。适配器是一个硬件模块,为目标提供正确的信号以便理解。

 

OpenOCD调试器支持许多调试适配器,可以在OpenOCD网站上查看。

 

要使OpenOCD正常工作,您应该使用命令或使用配置文件进行配置。配置完成并建立与目标的连接后,OpenOCD将开始作为守护程序运行。守护进程是一个后台进程,可以回答服务请求。OpenOCD现在将等待来自GDB,Telnet或任何其他通道和进程给定命令的连接。

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

OpenOCD框图

 

FT2232H概述

 

FT2232H是双通道高速USB转多功能UART / FIFO IC。这意味着它是具有双端口的单芯片USB。

 

每个端口都配备了一个称为多协议同步串行引擎(MPSSE)的引擎,以简化同步串行协议(USB到JTAG,I2C,SPI或bit-bang)设计。这允许用户使用所需协议配置通道。MPSSE在通道A和通道B上可用,并且可以配置为允许任何同步串行协议。

 

在选择OpenOCD之前要意识到

 

选择OpenOCD作为调试工具,使用FT2232H等适配器是一个非常好的选择,当您没有足够的预算可用时。

 

除了免费和开源之外,OpenOCD还拥有良好的支持社区。但是,与任何其他开源工具一样,您可能面临自己可能需要修复的错误。

 

我花了一些时间来了解如何使OpenOCD工作并刷新我的MCU,我希望本教程将是一个很好的完整参考。

 

另外,我建议任何搜索调试工具的人都要明智地选择。例如,如果您需要一个简单的工具,我认为OpenOCD可能不是您的最佳选择!

 

其他好的替代调试工具是:

 

•Segger J-Link

 

•ULINK

 

•芯片供应商将默认调试器嵌入到评估板(如STM32,EFM32和其他MCU系列)中

 

总而言之,如果您没有足够的预算,时间或耐心,使用FT2232H的OpenOCD将是您的最佳选择。

 

要求

 

以下是完成本教程所需的内容:

 

•FT2232H分线板

 

•带有OpenOCD工作副本的Windows或Linux操作系统

 

•目标芯片闪存

 

让我们分别讨论每件作品。

 

•FT2232H分线板:

 

您可以从淘宝,阿里巴巴和AliExpress等中国供应商那里买到便宜的。我从淘宝订购了约14美元。

 

您也可以订购官方FTDI模块  FT2232H迷你模块。

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

FT2232H分线板

 

•带有OpenOCD工作副本的Windows或Linux操作系统:

 

Windows:您可以从非官方二进制包中获取OpenOCD的可执行版本。

 

Linux:您可以从Linux发行版的软件包池中获取它,例如debian软件包。

 

或者你可以从源代码构建它,艰难的方式!这是我个人选择去的路线。您可以找到有关如何执行此操作的有用指南,例如Dangerous Prototypes(适用于Windows)或eLinux  (适用于Linux)中的指南。您还可以从OpenOCD源代码(README.Windows  和  README)中读取编译指令。

 

注意: 前一段时间,OpenOCD开发团队决定不再提供任何官方二进制文件。他们只提供源代码,期望JTAG硬件的供应商构建二进制文件。确保您使用的二进制文件支持JTAG硬件。

 

•目标芯片闪存:

 

我选择了基于ARM Cortex-M3的微控制器(MCU)EFM32G200F32的突破,但任何其他支持的MCU都可以工作。

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

我的EFM32G200F32分线板

 

 【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

EFM32G200F32引脚排列

 

如何组织OpenOCD

 

要使OpenOCD运行,您只需要提供给OpenOCD的正确配置文件(.cfg)。此配置文件具有Jim-Tcl扩展的命令。Jim-Tcl是一种编程语言,提供简单且可扩展的命令解释器。

 

OpenOCD目录文件有一个名为“scripts”的文件夹。在此文件夹中,您将看

 

到“interface”,“board”和“target”文件夹。这些几乎是您需要的唯一文件夹。

 

•接口:硬件适配器的配置文件,例如“minimodule.cfg”。

 

•Board:常见开发板的配置文件,如“atmel_sam4s_xplained_pro.cfg” - “olimex_stm32_h107.cfg” - “stm32f4discovery.cfg”等。您可以看到这些文件重用了接口和目标的配置文件。

 

•目标: MCU芯片的配置文件。

 

但是,您可以编写自己的配置文件,我们将在本教程中进行操作。

 

当我们运行OpenOCD时,我们可以根据需要为其提供尽可能多的配置文件:

openocd -f config1.cfg -f config2.cfg -f config3.cfg

 

了解适配器配置的基础知识

 

首先,我们需要通过使用interface命令告诉OpenOCD 它将使用的  适配器的类型  。

 

要查看您的OpenOCD版本支持的完整接口列表,请使用以下命令:

 

> openocd -c interface_list

 

在我们的教程中,我们将使用带有FT2232H芯片的适配器,因此我们将使用FTDI接口驱动程序:

 

interface ftdi

 

您还必须告诉OpenOCD有关适配器(接口)的更多信息。例如,您需要指定用于FT2232H的VID / PID,序列号或通道编号,因为它有两个通道。

 

ftdi_vid_pid 0x0403 0x6010

ftdi_channel 1

ftdi_serial“FTZ7O8O0”

 

适配器可以支持多个传输协议,因此OpenOCD允许您选择传输协议:

 

运输选择swd

 

您还应该通过ftdi_layout_init命令告诉OpenOCD FTDI GPIO数据和方向寄存器的初始值  。您应该首先将通道的16个引脚的初始值,然后是方向。知道“1”用于选择方向作为输出,“0”用于输入,ft2232H中的每个通道有16个引脚。

 

ftdi_layout_init 0x0018 0x05fb

 

这意味着:

 

低输出数据= 0x18 // 0001 1000

低方向= 0xfb // 1111 1011

高方向= 0x05 // 0000 0101

 

要查看有关适配器配置的更多信息,可以参考OpenOCD手册。

 

用适配器连接目标

 

有一个名为“swd-resistor-hack.cfg”的配置文件,其中包含一个接线图:

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

FT2232H与目标接线

 

该文件包括一个注释:

 

“通过合适的串联电阻(220-470欧姆左右,根据目标和适配器的驱动能力将TDI连接到SWDIO)将TDO直接连接到SWDIO。” 

 

如果不以这种方式连接此电阻,将无法建立连接。

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

FT2232H引脚排列

 

把它放在一起

 

现在让我们尝试使用OpenOCD在适配器和目标之间建立连接。

 

第1部分:进行所需的有线连接

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

将FT2232H与目标连接

 

第2部分:运行OpenOCD

 

首先,为我们的适配器创建一个特殊的配置文件。创建一个新的txt文件(ANYNAME.cfg)。请记住编辑VID / PID和串行以匹配您的芯片:

 

                    #This configuration file is created for a tutorial: 

#”Getting Started with OPENOCD Using FT2232H Adapter for SWD Debugging”

#Written by:Yahya Tawil - yahya.tawil_at_gmail.com 

#Pulished on: http://www.allaboutcircuits.com 

#Version of OpenOCD:0.9.0

interface ftdi

transport select swd

ftdi_vid_pid 0x0403 0x6010

#ftdi_device_desc "USB Serial Converter A"

#ftdi_device_desc "FT2232H 开发板"

ftdi_serial "FTZ7O8O0"

#adapter_khz 8

ftdi_layout_init 0x0018 0x05fb

ftdi_layout_signal SWD_EN -data 0

ftdi_layout_signal nSRST -data 0x0010

                  

注意:  定义SWD_EN信号对于使OpenOCD工作很重要,即使我们没有物理连接它。如果我们不这样做,将出现错误:

 

错误:SWD模式处于活动状态,但未定义SWD_EN信号

 

视窗:

 

按照我们之前的描述下载OpenOCD副本后,运行CMD控制台,然后转到OpenOCD所在的目录。例如:

 

cd Desktop \ openocd-0.9.0 \ bin

 

记住:我们有一个配置文件(我将其命名为SWD_FT.cfg),目标是EFM32芯片之一。

 

然后,在CMD中键入:

 

openocd -f interface / ftdi / SWD_FT.cfg -f target / efm32.cfg

 

Linux的:

 

在终端中,键入:

 

Sudo openocd -f interface / ftdi / SWD_FT.cfg -f target / efm32.cfg

 

你现在应该得到类似的东西:

 

信息:启用FTDI SWD模式

 

适配器速度:1000 kHz

 

cortex_m reset_config sysresetreq

 

信息:时钟速度1000 kHz

 

信息:SWD IDCODE 0x2ba01477

 

信息:efm32.cpu:硬件有6个断点,4个观察点

 

如果您有任何问题,请查看故障排除部分 - 可能是Windows用户的布线错误或驱动程序问题。

 

第4部分:打开Telnet连接

 

打开另一个CMD窗口并键入:

 

telnet localhost 4444

 

第5部分:与目标沟通

 

记得在任何调试操作之前暂停目标:

 

>重置停止

 

你会得到类似的东西:

 

目标状态:停止

 

目标因调试请求而暂停,当前模式:线程

 

xPSR:0x01000000 pc:0x00000bbc msp:0x20002000

 

要从我们的芯片读取内部寄存器,请键入:

 

> REG

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

reg命令的响应

 

要将图像闪存到内部闪存,我们需要定义内部闪存库。它可能是像我们目前的目标一样的银行,“efm32.cfg”为我们做了。要确保,请键入以下内容:

 

> flash信息0

 

要么

 

> flash列表

 

>闪存银行

 

它将返回以下内容:

 

#0:efm32.flash(efm32)位于0x00000000,大小为0x00008000,总线宽度为0,芯片宽度为0

 

现在,要刷新我们的程序,请使用flash write_image命令。

 

此命令接受bin(二进制),ihex(Intel hex),elf(ELF文件),s19(Motorola s19),mem或builder格式。

 

> flash write_image erase“Desktop / FirstApp.hex”

 

你应该得到类似的东西:

 

自动擦除已启用

 

从文件Desktop / FirstApp.hex写入1536字节,0.124740s(12.025 KiB / s)

 

现在使用此命令再次运行目标:

 

>重置运行

 

要退出Telnet连接,只需键入:

 

>退出

 

阅读OpenOCD手册,了解有关使用OpenOCD闪存的更多信息。

 

故障排除

 

示例错误1:

 

•错误:无法打开ftdi设备:usb_open()失败

 

在新版本的OpenOCD使用WinUSB驱动程序时,在Windows中使用libusb驱动程序可能会导致此错误。

 

首先,确保停止Windows自动安装驱动程序:

 

【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试

 

然后删除默认的FTDI驱动程序。您可以使用FTDI中名为CDM Uninstaller xx的工具- Windows设备驱动程序卸载程序:只需输入您的VID和PID即可。

 

请注意,默认FTDI供应商ID为0x0403。默认产品ID如下:

 

•单通道器件(R芯片):0x6001

 

•双通道器件(2232C / D / H芯片):0x6010

 

•四通道器件(4232H芯片):0x6011

 

在这里阅读更多。

 

最后,使用Zadig Tool安装WinUSB驱动程序。  

 

示例错误2:

 

•信息: 程序'ocd_bouncer' 

 

中程序'init'的时钟速度为1000 kHz

 

如上所述,这个错误是由于错误的接线或在“swd-resistor-hack.cfg”中丢失TDI和TDO之间的电阻引起的。

 

它也可能是由配置文件中缺少ftdi_layout_init命令之类的错误配置引起的:

 

ftdi_layout_init 0x0018 0x05fb

 

示例错误3:

 

•错误:libusb_open()因LIBUSB_ERROR_ACCESS失败

 

错误:未找到设备

 

错误:无法使用vid 0403,pid 6010,描述'*'和串行'FTZ7O8O0'打开ftdi设备

 

在未经许可的情况下在Linux中运行OpenOCD时,将弹出类似的错误消息。确保使用sudo运行OpenOCD,“sudo opeocd”。

  • 【技术专辑】OPENOCD入门使用FT2232H适配器进行SWD调试已关闭评论
    A+
发布日期:2019年03月04日  所属分类:参考设计