OPENOCD入门使用FT2232H适配器进行SWD调试

本文介绍了如何使用开源工具OpenOCD和FT2232H适配器通过SWD接口对基于ARM的MCU进行编程和调试。内容涵盖了JTAG与SWD的区别,OpenOCD的功能和配置,以及FT2232H模块的工作原理。此外,还提供了设置和使用OpenOCD的步骤,包括适配器的配置、连接目标芯片和故障排除的提示。
摘要由CSDN通过智能技术生成

原文链接

Yahya Tawil

通过使用带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接口。

SWD接口信号

OpenOCD概述

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

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

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

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-LinkULINK芯片供应商将默认调试器嵌入到评估板(如STM32,EFM32和其他MCU系列)中总而言之,如果您没有足够的预算,时间或耐心,使用FT2232H的OpenOCD将是您的最佳选择。

要求

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

FT2232H分线板带有OpenOCD工作副本的Windows或Linux操作系统目标芯片闪存让我们分别讨论每件作品。

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

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

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都可以工作。

我的EFM32G200F32分线板

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”的配置文件,其中包含一个接线图:

FT2232H与目标接线

该文件包括一个注释:

“通过合适的串联电阻(220-470欧姆左右,根据目标和适配器的驱动能力将TDI连接到SWDIO)将TDO直接连接到SWDIO。”如果不以这种方式连接此电阻,将无法建立连接。

FT2232H引脚排列

把它放在一起

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

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

将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

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自动安装驱动程序:

然后删除默认的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”。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值