OPENOCD入门使用FT2232H适配器进行SWD调试
这是我个人选择去的路线。错误:libusb_open()因LIBUSB_ERROR_ACCESS失败错误:未找到设备错误:无法使用vid 0403,pid 6010,描述'*'和串行'FTZ7O8O0'打开ftdi设备在未经许可的情况下在Linux中运行OpenOCD时,将弹出类似的错误消息。Segger J-LinkULINK芯片供应商将默认调试器嵌入到评估板(如STM32,EFM32和其他MC
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)