基于jtag仿真器的调试是目前arm开发中采用最多的一种方式。大多数arm设计采用了片上jtag接口,并将其作为测试、调试方法的重要组成。
jtag仿真器通过arm芯片的jtag边界扫描口与arm cpu核通信,实现了完全非插入式调试,不使用片上资源,不需要目标存储器,不占用目标系统的任何端口。由于jtag调试的目标程序是在目标板上执行,使得仿真更加接近于目标硬件[1]。
目前针对嵌入式系统开发的调试工具品种繁多,如arm公司的axd debugger软件与mutil-ice仿真器等。但是大部分嵌入式调试工具价格过高,因此设计实现一种速度快、性能稳定、价格低廉、易于实现的arm调试工具是十分必要的。
1 arm jtag调试原理
arm典型的调试系统结构如图1所示。调试系统包括调试主机、仿真器和调试目标。
调试主机是一台运行调试软件(例如ads)的计算机。调试主机可以发出高层的调试命令,例如设置断点、访问内存等[2]。
仿真器用来将调试主机发出的高层调试命令转换为底层的arm jtag调试命令。因为目标机无法识别调试主机发送来的高级命令,因此就需要仿真器将调试主机发出的高层调试命令转换为底层的arm jtag调试命令[3]。在整个调试系统中起到重要的作用,其性能也决定了整个调试系统性能。
2 方案设计
本文提出了一种采用philips公司的arm7芯片lpc2148设计,具有usb2.0通信方式、高速稳定的arm仿真器实现方案,如图2所示。
守护进程接收从ide集成开发环境发送来的调试命令,将其通过usb总线转发到arm仿真器,arm仿真器再将调试命令转换成jtag格式的信号并发送到i/o口,从而控制调试目标执行特定的操作,达到调试的目的。同理,从调试目标返回的数据,先经过arm仿真器的译码,再经过守护进程返回到ide开发环境,从而形成一个完整的调试系统。
3 硬件电路设计
本设计的最大特点是采用了lpc2148作为主控芯片。该芯片内部集成了arm7tdmi-s微控制器和完全兼容usb2.0的设备控制器,支持32个物理(16个逻辑)端点;支持控制、批量、中断和同步端点;所有端点都有一个双向的dma通道。因为芯片内部集成了usb控制器,大大降低了电路板的设计难度和开发成本。其硬件电路框图如图3所示。
(1)本机jtag调试电路
为了便于调试和烧写程序,将芯片lpc2148的jtag接口接到一个20引脚的标准jtag插口。本设计中使用引脚p0.8、p0.9、p0.10、p0.12、p0.14作为外部jtag接口,尽量不用有其他接口功能的引脚,如p0.11、p0.14接口与i2c接口scl1、sda1功能复用,以便于将来的硬件升级。为了增强带负载能力,使用一片74hc244芯片,同时为了尽量兼容大部分arm开发板上的不同jtag插口,本设计提供了一个20引脚的jtag插口和一个14引脚的jtag插口。
(2)usb电路(包括供电电路)
usb接口电路如图4所示。为了使lpc2148的软件可以更灵活地控制usb设备与主机之间的连接,本接口电路使用p0.31(只能使用该引脚)来实现softconnect特性。当p0.31输出低电平时,d+线通过电阻上拉到vdd3.3,通知usb主机:usb设备与其建立连接;当p0.31输出高电平时,d+线断开与vdd3.3的连接,通知usb主机:usb设备已经断开与usb主机的连接。
q1选用的是p沟道mos管,而不选用普通的pnp三极管,因为mos管是电压驱动型,驱动电流几乎为0;而普通的pnp三极管是电流驱动,需要一定的驱动电流。导通时,p0.31_p17有可能被拉低,lpc2148要求该引脚在复位引脚为低电平期间不能被拉低,否则jtag口将被禁止,因此必须选用p沟道的mos管。lpc2148的p0.23引脚为usb设备控制器,用于检测usb总线是否插入检测引脚[4]。
4 仿真器固件程序设计
仿真器lpc2148芯片中的固件程序实现的功能包括:通过usb与上位机软件进行通信,并将上位机发送过来的、经过封装的usb数据流转换为jtag信号,并最终送到相应的引脚或者将相应引脚的数据经过封装后,通过usb传送到pc机中。图5为应用程序的流程图。
主函数首先将作为jtag接口使用的5个引脚设置成相应属性,并完成usb设备初始化,配置中断向量、开中断,然后进入无限循环函数。
无限循环函数首先处理usb事件,如usb控制传输、usb总线复位等。然后判断标志位是否收到数据,如果未收到则继续执行无限循环;如果收到了数据,则将数据从端点缓冲区读出,再交给数据处理函数处理。数据处理函数按照上位机程序对数据封装方式进行解析,根据解析的命令(读取tdi、写tms或tdo等),通过分支处理跳到相应的处理函数。在这个过程中如果上位机要读取调试目标数据,可将相应的值按同样格式进行封装,然后通过usb发送到上位机。数据封装格式如图6所示。
c语言定义的命令码如下:
#define unkown_command 0x00//未知指令
#define port_direction 0x01 //设置端口方向为输入或输出
#define port_set 0x02 //将jtag端口的引脚都设为高电平
#define port_get 0x03 //读jtag端口的引脚数据
#define port_setbit 0x04 //设置jtag端口的某一位为1,由data[0]中数据决定设置的具体位数
#define port_getbit 0x05//读取jtag端口的某一位为1,由data[0]中数据决定读取的具体位数
#define write_tdi 0x06//写tdi信号命令
#define read_tdo 0x07 //读tdo信号命令
#define write_and_read 0x08//读写指令,对tdi写一位,对tdo一位
#define write_tms 0x09 //写tms信号命令
#define write_tms_chain 0x0a //写tms扫描链命令
本仿真器经实际测试下载速度稳定在30 kb/s左右,具有单步、全速、设置断点(两个硬断点和无数软断点)等功能。本文提出了一种具有硬件电路设计简单、价格低廉、调试速度快的arm仿真器设计方案,是取代传统并口方式arm仿真器的一种确实可行的方案。
参考文献
[1] 田泽.嵌入式系统开发与应用[m].北京:北京航空航天大学出版社,2004.
[2] 邓春梅.嵌入式系统软件仿真技术的研究与实现[d].成都:电子科技大学,2004.
[3] 杨晶箐.usb接口的边界扫描测试控制器的设计与实现[d].成都:成都电子科技大学,2006.
[4] 周立功,张华.深入浅出arm7-lpc213x/214x[m].北京:北京航空航天大学出版社,2005.
基于模糊逻辑的指纹图像对比度增强算法
三种不同类型消弧线圈的原理
明年氢燃料电池重卡市场将有大突破
你知道关于嵌入式闪存还有哪些错误观念吗?
连接器分类有哪几种?有什么用?
基于ARM开发的JTAG仿真器的调试设计
电源的小型化轻量化设计方案
日亚化学夺冠!2015年中国市场排行前10的LED封装厂商
新世代的智能家居应该是什么样的?
揭秘贴片功率电感封装尺寸越大越好吗
直流DC电源端口浪涌保护方案
移动App热潮起 高度个性化移动医疗看俏
电子变压器的工作原理是怎样的
华为“通信方法与通信装置”专利公布
基于深度学习的IRS辅助MIMO通信系统的CSI压缩及恢复研究
一种配网终端电池智能检测存储装置的探索与研究
5G手机市场竞争趋于白热化
AI智能音箱高性价比出好音质的功放芯片
M1332C型外圆磨床电气控制电路原理详解
自动驾驶算力是不是越高越好?