基于SWD协议的ISP技术研究与应用*

2021-08-06 09:19刘浪华
通信技术 2021年7期
关键词:固件寄存器调试

王 宇,刘浪华

(中国电子科技集团公司第三十研究所,四川 成都 610041)

0 引 言

目前嵌入式领域的主流产品在研发阶段主要通过仿真器对微处理器进行程序的仿真验证,生产阶段通过专用联合测试工作组(Joint Test Action Group,JTAG)烧录器完成芯片固件烧录,基本不涉及后期固件的升级维护。一旦固件程序在应用上存在漏洞,只能将设备返厂维修,导致产品后期维护费用居高不下。通过结合串行调试(Serial Wire Debug,SWD)串行调试技术和在线系统编程(In-System Programming,ISP)技术,能够解决设备后期维护不便的问题。

SWD技术支持所有可通过JTAG接口进行调试的ARM Cortex A/R/M系列处理器和具有CoreSight调试架构的ARM芯片[1],包括德州仪器(Texas Instrument,TI)、 恩 智 浦(NXP Semiconductors)、Atmel、Samsung等厂家的芯片,以及意法半导体(STMicroelectronics,STM)公司STM32系列微处理器等。

1 SWD协议原理研究

SWD串行调试由一个双向数据线和单向时钟线组成实现数据的同步传输,可替代JTAG调试。时钟频率为50 MHz时数据传输速率可达4 MB/s,较少的印制电路板(Printed Circuit Board,PCB)布局布线资源便可实现低功耗低成本应用[2]。SWD协议实现芯片资源的交互流程如图1所示。

1.1 SWD接口协议

SWD操作流程主要分为3个阶段:数据请求包REQ、应答数据包ACK与数据读写传输包[3]。表1列举了SWD接口交互流程的主要关键字信息。

表1 SWD协议关键词

SWD的写操作由1 byte请求包、3 bit应答包与33 bit的写数据组成,一次完整的写操作如图2所示。

SWD的读操作由1 byte的请求包、3 bit的应答包与33 bit的读数据组成,应答包与读数据包间无Turn周期,一次完整的读操作如图3所示。

SWD中DP寄存器组成见表2,其中ID标识寄存器用于验证SWD操作时序,获取ARM调试接口信息等,低12位固定为0×477,主要构成如图4所示。

表2 SW-DP寄存器

SELECT寄存器控制AP选择特定的地址,其最低位为CTRLSEL,其组成见图5。[31:24]位APSEL值确定当前AP地址的高8 bit;每个AP具有 16个 Bank,[7:4]位 APBANKSEL值(0-F) 用来选择当前AP的Bank号;每个Bank有4个32 bit寄存器,由数据请求包REQ中的A[3:2]位来确定。

图6列举了每组MEM-AP寄存器的信息,其中Bank 0x0中的CSW寄存器、TAR寄存器与DRW寄存器对设备ARM核的数据传递起着关键作用[4]。

1.2 SWD实现处理器资源传递

SWD的数据传递通过分级传递的方式:第一级通过DP接口选择进入AP寄存器,然后通过AP接口选择目的寄存器进行访问;第二级配置CSW寄存器进行软件控制与地址模式的选择,最后通过TAR寄存器与DRW寄存器对处理器目标地址进行读写。整个交互流程如图7所示。

以下是实现的主要函数。

(1)Func0:单32 bit数据写入,经历①②③④⑥这5个阶段,参数为其③阶段的目的地址与④阶段的数据,⑥阶段仅需执行读操作。

(2)Func1:连续32 bit数据写入,SWD协议中支持连续写入,目的地址会在写入完成后自加1,大致流程与Func0一致,经历①②③④…④(n个④)⑥阶段,其中④阶段的个数n由写入数据数量来确定。

(3)Func2:单32 bit数据读取,经历①②③⑤⑥这5个阶段,参数为其③阶段的目的地址与接收⑥阶段的数据缓存。

(4)Func3:连续32 bit数据读取,SWD协议中目的地址会在读取完成后自加1,大致流程Func2一致,经历①②③⑤⑥…⑥(n个⑥)阶段,其中⑥阶段的个数n由读取数据数量来确定。

2 STM32F103核心资源

为了利用SWD接口完成对ARM-Cortex M3/M4等芯片固件的擦除与烧写,实现固件的更新。本节以ST公司的STM32F103x系列芯片作为说明,对芯片内部资源架构进行基本介绍[5]。

如图8所示,STM32F103x采用ARM Cortex-M3核,采用32位RISC精简指令集,时钟频率最高72 MHz。Flash容量最大512 kB、SRAM最大64 kB,STM32F103x芯片内部存储资源如图8所示,其中Flash区存储了芯片的BootLoader与主程序。DAP烧录器、J-link编程器进行芯片固件烧录也是在该区域完成。

通过SWD接口可实现STM32F103x芯片SRAM区域存取访问,控制Cortex-M3内部资源中调试寄存器,读取Flash区的数据。Flash区不能直接进行数据擦写,必须通过特定方法,本文研究的主要目的就是通过SWD与芯片Flash算法文件FLM相结合的方式实现芯片固件更新。

Cortex-M3/M4的ARM核调试寄存器地址完全相同,寄存器相关描述如表3所示。DFSR寄存器用来获取ARM核运行错误状态,DHCSR与DEMCR可以控制ARM核的运转状态,操作SRAM区域或者Flash资源时都应将ARM核挂起,以免影响数据正确性。DCRSR寄存器用来选择ARM核心寄存器,DCRDR寄存器用来管理ARM核心寄存器值[6]。

表3 Cortex-M3/M4调试寄存器说明

ARM核心寄存器组成如表4所示,其中R0~R12为32位通用目的寄存器,R13可对堆栈空间进行存取操作,R14链接寄存器用于存储子程序或者函数调用的返回地址,R15程序计数器读操作返回当前正在执行的指令加上4,写入R15会导致程序跳转执行。XPSR程序状态寄存器作为特殊功能寄存器用来判断ARM核心寄存器执行状态是否正常。

表4 ARM核心寄存器

汇编可执行程序就是在ARM核心寄存器上进行变量的计算与处理。通过调用Func0、Func2流程可以控制Cortex-M3/M4的所有调试寄存器,经由DCRSR与DCRDR寄存器实现ARM核心寄存器读取,获取到ARM核的执行控制权限。

3 SWD实现芯片固件ISP在线编程

通用Flash芯片编程流程包括:初始化、擦除与烧写。SWD协议调用FLM文件中可执行二进制文件的方式实现Flash的ISP编程。FLM文件从芯片厂家获取,由Flash擦写相关函数及变量等组成的通用标准文件格式可执行文件编码。本文以STM32F103芯片的STM32F10x_128.FLM文件为样本进行研究与应用,可推广至所有支持SWD协议芯片进行应用。

3.1 STM32F10x_128算法文件解析

STM32F10x_128.FLM文件可通过elfparser等软件解析,也可在Linux Ubuntu操作系统下输入以下命令查看解析文件信息readelf -a STM32F10x_128.FLM。

截取的部分重要信息如图9所示,其中Prgcode程序代码段包括Flash的若干函数执行码,PrgData程序数据段为全局变量/静态变量区间。SWD所需的核心内容(Prgcode+PrgData)数据段可由地址Addr、偏移Offset与大小Size从FLM件中获得。

3.2 STM32F10x_128读取IDCODE

图10由示波器获得,下方波形为SWD时钟,上方波形为SWD数据。以数据线的第一个高电平为Start起始位,对比SWD读操作原理图,最终获取的内容为0x2ba01477。参照1.1节DP寄存器中有关IDCODE的描述,能够验证获取到内容确实为IDCODE的值,进而确认已成功实现对SWD接口控制。

3.3 芯片Flash固件烧写

通过SWD接口实现ARM核Flash资源烧写共分为3个步骤:

(1)通过调试寄存器挂起ARM核,停止ARM核的运行,将FLM算法文件提出的可执行数据写入SRAM的起始地址;

(2)将芯片固件STM32F10x_128.Bin写入SRAM未用空间,待Flash编程时使用;

(3)将执行函数包括程序入口参数等信息通过调试寄存器写入ARM核心寄存器,依次调用Flash初始化、片擦除、编程函数,完成ARM核内部Flash的烧录。整个流程执行如图11所示。

Flash固件烧写测试程序由C语言实现,涵盖了Flash初始化、片擦除、程序烧写、数据回读校验及退出操作,顶层实现代码如下文所述:

在主设备上执行Flash固件烧写测试程序swdprogram,稳定地实现了芯片固件ISP更新,程序运行结果如图12所示。

4 结 语

通过SWD接口协议控制芯片ARM核的运行,结合芯片FLM文件解析并在ARM核中实现Flash相关函数资源的恢复与调用,完成了芯片固件的ISP在线编程。针对其它支持SWD接口协议的ARM芯片,除内部资源地址空间与FLM算法文件不同外,ARM核的调试与控制操作完全相同,很容易推广并应用于主从模式下的微处理器芯片。通过SWD接口实现的ISP在线编程,能够极大地提高设备的维护性,对于实现设备程序升级与功能更新有较高的应用价值。

猜你喜欢
固件寄存器调试
尼康旗舰Z9升级新固件延长高速连拍时间
基于国产化IT 基础设施的通用固件安全模型研究
高温气冷堆示范工程TSI系统安装及调试
电气仪表自动化安装与调试分析
调试新设备
Lite寄存器模型的设计与实现
调试机械臂
常用电子测速法在某数字信号处理器中的应用*
移位寄存器及算术运算应用
英特尔发布免费固件引擎