王 宇,劉浪華
(中國(guó)電子科技集團(tuán)公司第三十研究所,四川 成都 610041)
目前嵌入式領(lǐng)域的主流產(chǎn)品在研發(fā)階段主要通過(guò)仿真器對(duì)微處理器進(jìn)行程序的仿真驗(yàn)證,生產(chǎn)階段通過(guò)專(zhuān)用聯(lián)合測(cè)試工作組(Joint Test Action Group,JTAG)燒錄器完成芯片固件燒錄,基本不涉及后期固件的升級(jí)維護(hù)。一旦固件程序在應(yīng)用上存在漏洞,只能將設(shè)備返廠(chǎng)維修,導(dǎo)致產(chǎn)品后期維護(hù)費(fèi)用居高不下。通過(guò)結(jié)合串行調(diào)試(Serial Wire Debug,SWD)串行調(diào)試技術(shù)和在線(xiàn)系統(tǒng)編程(In-System Programming,ISP)技術(shù),能夠解決設(shè)備后期維護(hù)不便的問(wèn)題。
SWD技術(shù)支持所有可通過(guò)JTAG接口進(jìn)行調(diào)試的ARM Cortex A/R/M系列處理器和具有CoreSight調(diào)試架構(gòu)的ARM芯片[1],包括德州儀器(Texas Instrument,TI)、 恩 智 浦(NXP Semiconductors)、Atmel、Samsung等廠(chǎng)家的芯片,以及意法半導(dǎo)體(STMicroelectronics,STM)公司STM32系列微處理器等。
SWD串行調(diào)試由一個(gè)雙向數(shù)據(jù)線(xiàn)和單向時(shí)鐘線(xiàn)組成實(shí)現(xiàn)數(shù)據(jù)的同步傳輸,可替代JTAG調(diào)試。時(shí)鐘頻率為50 MHz時(shí)數(shù)據(jù)傳輸速率可達(dá)4 MB/s,較少的印制電路板(Printed Circuit Board,PCB)布局布線(xiàn)資源便可實(shí)現(xiàn)低功耗低成本應(yīng)用[2]。SWD協(xié)議實(shí)現(xiàn)芯片資源的交互流程如圖1所示。
SWD操作流程主要分為3個(gè)階段:數(shù)據(jù)請(qǐng)求包REQ、應(yīng)答數(shù)據(jù)包ACK與數(shù)據(jù)讀寫(xiě)傳輸包[3]。表1列舉了SWD接口交互流程的主要關(guān)鍵字信息。
表1 SWD協(xié)議關(guān)鍵詞
SWD的寫(xiě)操作由1 byte請(qǐng)求包、3 bit應(yīng)答包與33 bit的寫(xiě)數(shù)據(jù)組成,一次完整的寫(xiě)操作如圖2所示。
SWD的讀操作由1 byte的請(qǐng)求包、3 bit的應(yīng)答包與33 bit的讀數(shù)據(jù)組成,應(yīng)答包與讀數(shù)據(jù)包間無(wú)Turn周期,一次完整的讀操作如圖3所示。
SWD中DP寄存器組成見(jiàn)表2,其中ID標(biāo)識(shí)寄存器用于驗(yàn)證SWD操作時(shí)序,獲取ARM調(diào)試接口信息等,低12位固定為0×477,主要構(gòu)成如圖4所示。
表2 SW-DP寄存器
SELECT寄存器控制AP選擇特定的地址,其最低位為CTRLSEL,其組成見(jiàn)圖5。[31:24]位APSEL值確定當(dāng)前AP地址的高8 bit;每個(gè)AP具有 16個(gè) Bank,[7:4]位 APBANKSEL值(0-F) 用來(lái)選擇當(dāng)前AP的Bank號(hào);每個(gè)Bank有4個(gè)32 bit寄存器,由數(shù)據(jù)請(qǐng)求包REQ中的A[3:2]位來(lái)確定。
圖6列舉了每組MEM-AP寄存器的信息,其中Bank 0x0中的CSW寄存器、TAR寄存器與DRW寄存器對(duì)設(shè)備ARM核的數(shù)據(jù)傳遞起著關(guān)鍵作用[4]。
SWD的數(shù)據(jù)傳遞通過(guò)分級(jí)傳遞的方式:第一級(jí)通過(guò)DP接口選擇進(jìn)入AP寄存器,然后通過(guò)AP接口選擇目的寄存器進(jìn)行訪(fǎng)問(wèn);第二級(jí)配置CSW寄存器進(jìn)行軟件控制與地址模式的選擇,最后通過(guò)TAR寄存器與DRW寄存器對(duì)處理器目標(biāo)地址進(jìn)行讀寫(xiě)。整個(gè)交互流程如圖7所示。
以下是實(shí)現(xiàn)的主要函數(shù)。
(1)Func0:?jiǎn)?2 bit數(shù)據(jù)寫(xiě)入,經(jīng)歷①②③④⑥這5個(gè)階段,參數(shù)為其③階段的目的地址與④階段的數(shù)據(jù),⑥階段僅需執(zhí)行讀操作。
(2)Func1:連續(xù)32 bit數(shù)據(jù)寫(xiě)入,SWD協(xié)議中支持連續(xù)寫(xiě)入,目的地址會(huì)在寫(xiě)入完成后自加1,大致流程與Func0一致,經(jīng)歷①②③④…④(n個(gè)④)⑥階段,其中④階段的個(gè)數(shù)n由寫(xiě)入數(shù)據(jù)數(shù)量來(lái)確定。
(3)Func2:?jiǎn)?2 bit數(shù)據(jù)讀取,經(jīng)歷①②③⑤⑥這5個(gè)階段,參數(shù)為其③階段的目的地址與接收⑥階段的數(shù)據(jù)緩存。
(4)Func3:連續(xù)32 bit數(shù)據(jù)讀取,SWD協(xié)議中目的地址會(huì)在讀取完成后自加1,大致流程Func2一致,經(jīng)歷①②③⑤⑥…⑥(n個(gè)⑥)階段,其中⑥階段的個(gè)數(shù)n由讀取數(shù)據(jù)數(shù)量來(lái)確定。
為了利用SWD接口完成對(duì)ARM-Cortex M3/M4等芯片固件的擦除與燒寫(xiě),實(shí)現(xiàn)固件的更新。本節(jié)以ST公司的STM32F103x系列芯片作為說(shuō)明,對(duì)芯片內(nèi)部資源架構(gòu)進(jìn)行基本介紹[5]。
如圖8所示,STM32F103x采用ARM Cortex-M3核,采用32位RISC精簡(jiǎn)指令集,時(shí)鐘頻率最高72 MHz。Flash容量最大512 kB、SRAM最大64 kB,STM32F103x芯片內(nèi)部存儲(chǔ)資源如圖8所示,其中Flash區(qū)存儲(chǔ)了芯片的BootLoader與主程序。DAP燒錄器、J-link編程器進(jìn)行芯片固件燒錄也是在該區(qū)域完成。
通過(guò)SWD接口可實(shí)現(xiàn)STM32F103x芯片SRAM區(qū)域存取訪(fǎng)問(wèn),控制Cortex-M3內(nèi)部資源中調(diào)試寄存器,讀取Flash區(qū)的數(shù)據(jù)。Flash區(qū)不能直接進(jìn)行數(shù)據(jù)擦寫(xiě),必須通過(guò)特定方法,本文研究的主要目的就是通過(guò)SWD與芯片F(xiàn)lash算法文件FLM相結(jié)合的方式實(shí)現(xiàn)芯片固件更新。
Cortex-M3/M4的ARM核調(diào)試寄存器地址完全相同,寄存器相關(guān)描述如表3所示。DFSR寄存器用來(lái)獲取ARM核運(yùn)行錯(cuò)誤狀態(tài),DHCSR與DEMCR可以控制ARM核的運(yùn)轉(zhuǎn)狀態(tài),操作SRAM區(qū)域或者Flash資源時(shí)都應(yīng)將ARM核掛起,以免影響數(shù)據(jù)正確性。DCRSR寄存器用來(lái)選擇ARM核心寄存器,DCRDR寄存器用來(lái)管理ARM核心寄存器值[6]。
表3 Cortex-M3/M4調(diào)試寄存器說(shuō)明
ARM核心寄存器組成如表4所示,其中R0~R12為32位通用目的寄存器,R13可對(duì)堆??臻g進(jìn)行存取操作,R14鏈接寄存器用于存儲(chǔ)子程序或者函數(shù)調(diào)用的返回地址,R15程序計(jì)數(shù)器讀操作返回當(dāng)前正在執(zhí)行的指令加上4,寫(xiě)入R15會(huì)導(dǎo)致程序跳轉(zhuǎn)執(zhí)行。XPSR程序狀態(tài)寄存器作為特殊功能寄存器用來(lái)判斷ARM核心寄存器執(zhí)行狀態(tài)是否正常。
表4 ARM核心寄存器
匯編可執(zhí)行程序就是在A(yíng)RM核心寄存器上進(jìn)行變量的計(jì)算與處理。通過(guò)調(diào)用Func0、Func2流程可以控制Cortex-M3/M4的所有調(diào)試寄存器,經(jīng)由DCRSR與DCRDR寄存器實(shí)現(xiàn)ARM核心寄存器讀取,獲取到ARM核的執(zhí)行控制權(quán)限。
通用Flash芯片編程流程包括:初始化、擦除與燒寫(xiě)。SWD協(xié)議調(diào)用FLM文件中可執(zhí)行二進(jìn)制文件的方式實(shí)現(xiàn)Flash的ISP編程。FLM文件從芯片廠(chǎng)家獲取,由Flash擦寫(xiě)相關(guān)函數(shù)及變量等組成的通用標(biāo)準(zhǔn)文件格式可執(zhí)行文件編碼。本文以STM32F103芯片的STM32F10x_128.FLM文件為樣本進(jìn)行研究與應(yīng)用,可推廣至所有支持SWD協(xié)議芯片進(jìn)行應(yīng)用。
STM32F10x_128.FLM文件可通過(guò)elfparser等軟件解析,也可在Linux Ubuntu操作系統(tǒng)下輸入以下命令查看解析文件信息readelf -a STM32F10x_128.FLM。
截取的部分重要信息如圖9所示,其中Prgcode程序代碼段包括Flash的若干函數(shù)執(zhí)行碼,PrgData程序數(shù)據(jù)段為全局變量/靜態(tài)變量區(qū)間。SWD所需的核心內(nèi)容(Prgcode+PrgData)數(shù)據(jù)段可由地址Addr、偏移Offset與大小Size從FLM件中獲得。
圖10由示波器獲得,下方波形為SWD時(shí)鐘,上方波形為SWD數(shù)據(jù)。以數(shù)據(jù)線(xiàn)的第一個(gè)高電平為Start起始位,對(duì)比SWD讀操作原理圖,最終獲取的內(nèi)容為0x2ba01477。參照1.1節(jié)DP寄存器中有關(guān)IDCODE的描述,能夠驗(yàn)證獲取到內(nèi)容確實(shí)為IDCODE的值,進(jìn)而確認(rèn)已成功實(shí)現(xiàn)對(duì)SWD接口控制。
通過(guò)SWD接口實(shí)現(xiàn)ARM核Flash資源燒寫(xiě)共分為3個(gè)步驟:
(1)通過(guò)調(diào)試寄存器掛起ARM核,停止ARM核的運(yùn)行,將FLM算法文件提出的可執(zhí)行數(shù)據(jù)寫(xiě)入SRAM的起始地址;
(2)將芯片固件STM32F10x_128.Bin寫(xiě)入SRAM未用空間,待Flash編程時(shí)使用;
(3)將執(zhí)行函數(shù)包括程序入口參數(shù)等信息通過(guò)調(diào)試寄存器寫(xiě)入ARM核心寄存器,依次調(diào)用Flash初始化、片擦除、編程函數(shù),完成ARM核內(nèi)部Flash的燒錄。整個(gè)流程執(zhí)行如圖11所示。
Flash固件燒寫(xiě)測(cè)試程序由C語(yǔ)言實(shí)現(xiàn),涵蓋了Flash初始化、片擦除、程序燒寫(xiě)、數(shù)據(jù)回讀校驗(yàn)及退出操作,頂層實(shí)現(xiàn)代碼如下文所述:
在主設(shè)備上執(zhí)行Flash固件燒寫(xiě)測(cè)試程序swdprogram,穩(wěn)定地實(shí)現(xiàn)了芯片固件ISP更新,程序運(yùn)行結(jié)果如圖12所示。
通過(guò)SWD接口協(xié)議控制芯片ARM核的運(yùn)行,結(jié)合芯片F(xiàn)LM文件解析并在A(yíng)RM核中實(shí)現(xiàn)Flash相關(guān)函數(shù)資源的恢復(fù)與調(diào)用,完成了芯片固件的ISP在線(xiàn)編程。針對(duì)其它支持SWD接口協(xié)議的ARM芯片,除內(nèi)部資源地址空間與FLM算法文件不同外,ARM核的調(diào)試與控制操作完全相同,很容易推廣并應(yīng)用于主從模式下的微處理器芯片。通過(guò)SWD接口實(shí)現(xiàn)的ISP在線(xiàn)編程,能夠極大地提高設(shè)備的維護(hù)性,對(duì)于實(shí)現(xiàn)設(shè)備程序升級(jí)與功能更新有較高的應(yīng)用價(jià)值。