今天給大家介紹的是飛思卡爾 Kinetis MCU 開(kāi)發(fā)板板載 OpenSDA 調(diào)試器(上篇)。
眾所周知,嵌入式軟件開(kāi)發(fā)幾乎離不開(kāi)調(diào)試器,因?yàn)閷?xiě)一個(gè)稍有代碼規(guī)模(5K 行以上)的嵌入式應(yīng)用程序一般不可能一次性搞定,沒(méi)有任何 bug,出了 bug 并不可怕,只要我們能盡快定位 bug 并修復(fù)即可,調(diào)試器就是定位 bug 的利器,有了調(diào)試器我們便可以進(jìn)入系統(tǒng)主控芯片內(nèi)部一窺究竟,控制芯片執(zhí)行代碼的動(dòng)作,實(shí)時(shí)查看芯片內(nèi)部狀態(tài),輔以各種調(diào)試技巧讓 bug 無(wú)處藏身。
飛思卡爾 Kinetis MCU 屬于 ARM Cortex-M 系列芯片,因此本文主要介紹的 Cortex-M 系列芯片調(diào)試器,目前市面上 Cortex-M 調(diào)試器種類(lèi)(這里主要指的是硬件生產(chǎn)商)非常多,主要分為如下兩大陣營(yíng):
第三方公司出品:SEGGER 的 J-Link、IAR 的 I-jet、ARM 的 ULINK、開(kāi)源項(xiàng)目 OpenJTAG 等
半導(dǎo)體廠(chǎng)商出品:Freescale 的 OpenSDA、NXP 的 LPC-Link、ST 的 ST-LINK、TI 的 Stellaris ICDI、Nuvoton 的 Nu-Link 等。
本文要講的主角 OpenSDA 屬于陣營(yíng)里的后者,其一般不單獨(dú)存在,都是附著在飛思卡爾 Kinetis 官方開(kāi)發(fā)板上,你可以理解為 OpenSDA 調(diào)試器是專(zhuān)為 Kinetis 芯片設(shè)計(jì)的(但其實(shí)其 firmware 設(shè)計(jì)是可以做到通用于所有 Cortex-M 芯片的),今天痞子衡就為大家介紹 OpenSDA 項(xiàng)目的來(lái)龍去脈,讓大家對(duì) OpenSDA 項(xiàng)目有一個(gè)整體認(rèn)識(shí)。
一、OpenSDA 項(xiàng)目背景
OpenSDA 全稱(chēng)是 Open-standard Serial and Debug Adapter,從名字上來(lái)看,這個(gè)項(xiàng)目是要做一個(gè)開(kāi)放標(biāo)準(zhǔn)的串口與調(diào)試適配器,該項(xiàng)目主要是為了 Kinetis 芯片配套官方開(kāi)發(fā)板而設(shè)計(jì)的,直接板載在 Kinetis 官方開(kāi)發(fā)板上,用于取代傳統(tǒng)的第三方仿真器(比如 J-Link)+開(kāi)發(fā)板的開(kāi)發(fā)調(diào)試模式。
眾所周知,ARM 公司于 2010 年 2 月正式發(fā)布 Cortex-M4 內(nèi)核,飛思卡爾于 2010 年 8 月推出其第一款 ARM Cortex-M 內(nèi)核芯片 Kinetis K60,這也是業(yè)界一款 Cortex-M4 內(nèi)核的芯片。OpenSDA 項(xiàng)目并不是從 Kinetis 誕生之初便存在的,不信你可以查看最早的 Kinetis Tower 開(kāi)發(fā)板 TWR-K60D100M 原理圖(該板通用于 Kinetis K10、K20、K60 芯片),早期的 Kinetis 開(kāi)發(fā)板板載調(diào)試器為 OSBDM/OSJTAG,這是一種早已普遍應(yīng)用于飛思卡爾 HCS12、DSC、PowerPC 系列芯片開(kāi)發(fā)板上的調(diào)試器,OSBDM/OSJTAG 調(diào)試器主芯片為 MC9S08JM60CLD(S08JM 系列)。
隨著 Kinetis 芯片的不斷推出,OpenSDA 項(xiàng)目逐漸醞釀成熟,尤其是 2012 年隨著飛思卡爾 Cortex-M0+內(nèi)核 Kinetis L 系列芯片的走紅,OpenSDA 調(diào)試器開(kāi)始大面積應(yīng)用于 Kinetis L 系列芯片配套的 Freedom 開(kāi)發(fā)板上,從此取代 OSBDM/OSJTAG 成為 Kinetis 開(kāi)發(fā)板上的標(biāo)準(zhǔn)調(diào)試器,大家可以看一下下面這款經(jīng)典的 FRDM-KL25Z 原理圖,其板載調(diào)試器即為 OpenSDA 調(diào)試器(V1),OpenSDA 調(diào)試器主芯片選用的 MK20DX128VFM5(Kinetis K20 系列)。
二、OpenSDA 硬件電路
概括來(lái)說(shuō),OpenSDA 調(diào)試器主要由硬件和軟件兩部分組成,其中硬件主要分為主芯片和外圍接口電路,下面痞子衡分別為大家介紹 OpenSDA 的主芯片和外圍接口電路。
2.1 不可撼動(dòng)的男主(MK20DX128VFM5)
對(duì)于一個(gè)調(diào)試器項(xiàng)目來(lái)說(shuō),主芯片的選用至關(guān)重要,這直接決定了調(diào)試器的性能。OpenSDA 調(diào)試器主芯片選用的是 MK20DX128VFM5,這是一款 Cortex-M4 內(nèi)核,主頻 50MHz,16KB SRAM,160KB ROM(128KB Flash,32KB FlexNVM(最大 2KB EEPROM)),內(nèi)置 1 個(gè) USBFS 控制器,QFN32 封裝的芯片。
為何選擇 Kinetis 芯片作為調(diào)試器主控?當(dāng)然是為了進(jìn)一步推廣 Kinetis 系列的知名度,畢竟飛思卡爾的 Cortex-M 芯片推出較晚。那么為何選擇 Kinetis K2x 系列芯片呢?這要從下面 Kinetis K 系列的特性表里才能找到答案,從下表可以我們看出 K2x 系列是支持 USB 接口的入門(mén)芯片,而調(diào)試器主控是必須要支持 USB 接口的。
為何選擇型號(hào)為 MK20DX128VFM5 的 K2x 芯片呢?雖然這款芯片屬于 K2x 系列里最低配型號(hào)(考慮到調(diào)試器將隨著開(kāi)發(fā)板大面積推廣,成本也是一個(gè)不可忽略的因素),但是其外設(shè)(USBFS, UART, SPI)與存儲(chǔ)(16KB RAM,160KB ROM)方面是滿(mǎn)足調(diào)試器項(xiàng)目要求的。有人可能會(huì)問(wèn),50MHz 主頻會(huì)不會(huì)有點(diǎn)低,從而影響調(diào)試器性能?痞子衡可以明確地告訴你,性能是夠的,作為對(duì)比 SEGGER J-Link V7/V8 里的主控是 Atmel AT91SAM7S64(ARM7TDMI 內(nèi)核, 55MHz 主頻)。
2.2 幾經(jīng)搬遷的行宮(V1/V2/V2.1/V2.2)
確定了調(diào)試器主芯片,下一步便是設(shè)計(jì)調(diào)試器外圍接口電路,實(shí)際上外圍電路發(fā)展至今不止一個(gè)版本,我們可以在飛思卡爾官網(wǎng) OpenSDA 項(xiàng)目主頁(yè) 里的 Download – OpenSDA Bootloader and Application 下面找到如下各版本典型的開(kāi)發(fā)板:
?
?
?? ?
?? ?
不過(guò)這些版本主要都是硬件設(shè)計(jì)細(xì)節(jié)方面的小改動(dòng),而對(duì)于調(diào)試器軟件開(kāi)發(fā)而言其實(shí)并沒(méi)有變化,因?yàn)榻涌?Pinout 并沒(méi)有改變,痞子衡將上述各開(kāi)發(fā)板原理圖里的 OpenSDA 電路仔細(xì)查看對(duì)比整理出了如下通用的 OpenSDA 硬件原理簡(jiǎn)圖:
從上面原理簡(jiǎn)圖我們可以看出,OpenSDA 電路其實(shí)非常簡(jiǎn)潔,除了電源、晶振、主芯片 K20 自身的調(diào)試接口外,其他跟 OpenSDA 調(diào)試器功能相關(guān)的主要有五部分電路:
藍(lán)色 LED: 指示 OpenSDA 調(diào)試器工作狀態(tài),主要有兩種狀態(tài),一種是常亮(正常運(yùn)行模式),另一種是閃爍(自身 Firmware 更新模式)。
Boot 按鍵: 用于輔助進(jìn)入 OpenSDA 調(diào)試器自身 Firmware 更新模式(也叫 MSD Bootloader 模式),電路上電前按下 Boot 按鍵不放即可進(jìn)入 MSD Bootloader 模式(可在 PC 里看到新增名為 BOOTLOADER 的磁盤(pán)),往磁盤(pán)里拷貝相應(yīng)調(diào)試器 Firmware 文件即可完成更新。
USB 接口: 與上位機(jī) PC 連接,完成后續(xù) USB 轉(zhuǎn)串口(可到 PC 設(shè)備管理器看到新增串口設(shè)備), SWD 調(diào)試交互功能。
UART 接口: 與目標(biāo) MCU 連接。
SWD 接口: 與目標(biāo) MCU 連接。
三、OpenSDA 軟件設(shè)計(jì)
隨著 OpenSDA 項(xiàng)目的不斷迭代,目前(2018 年 9 月)OpenSDA 調(diào)試器版本已經(jīng)更新到 V2.2,飛思卡爾官網(wǎng)有 OpenSDA 項(xiàng)目主頁(yè),在主頁(yè)上我們可以看到如下 OpenSDA 項(xiàng)目版本對(duì)比:
3.1 軟件架構(gòu)
不管是哪個(gè)版本的 OpenSDA,其軟件架構(gòu)是一致的,如下圖所示,OpenSDA 軟件主要由兩部分組成:MSD Bootloader、OpenSDA Application(Firmware),其中 MSD Bootloader 占據(jù)調(diào)試器主控 K20 芯片內(nèi)部 Flash 的上半?yún)^(qū),K20 芯片上電永遠(yuǎn)先執(zhí)行 MSD Bootloader 程序,MSD Bootloader 功能比較單一,就是用來(lái)更新 OpenSDA Firmware,這樣使得調(diào)試器軟件升級(jí)比較容易。
OpenSDA Firmware 則是調(diào)試器的核心,調(diào)試器的主要功能(SWD 調(diào)試、USB 轉(zhuǎn)串口)均是這個(gè)應(yīng)用程序?qū)崿F(xiàn)的,OpenSDA Firmware 占據(jù) K20 芯片內(nèi)部 Flash 的下半?yún)^(qū),其本身不能上電自動(dòng)執(zhí)行,必須由 MSD Bootloader 引導(dǎo)執(zhí)行。
3.2 后宮佳麗有三個(gè)(軟件服務(wù)商)
說(shuō)到 OpenSDA Firmware 的供應(yīng)商,主要有三個(gè),分別是 P&EMicro、ARM Mbed、SEGGER,且聽(tīng)痞子衡一一道來(lái):
3.2.1 原配 P&E Micro
P&EMicro 公司是 OpenSDA 項(xiàng)目最早的 Firmware 軟件服務(wù)商,其 Firmware 軟件專(zhuān)為 OpenSDA 設(shè)計(jì),我們可以從下面網(wǎng)站下載到其開(kāi)發(fā)的 Firmware 和配套上位機(jī)驅(qū)動(dòng):
P&EMicro OpenSDA 主頁(yè): http://www.pemicro.com/opensda/
不過(guò)比較遺憾的是 P&EMicro 公司并不開(kāi)源其開(kāi)發(fā)的 Firmware 源碼,而在 OpenSDA 這個(gè)立志要開(kāi)源的調(diào)試器項(xiàng)目里,F(xiàn)irmware 不開(kāi)源是一件比較奇怪的事,因此 P&EMicro 版本的 Firmware 逐漸沒(méi)落。
3.2.2 新歡 ARM Mbed(DAPLink)
ARM 公司(Mbed)是 OpenSDA 項(xiàng)目第二個(gè) Firmware 軟件服務(wù)商,雖然 ARM 官方已經(jīng)設(shè)計(jì)了自己的 ULINK 調(diào)試器(ULINK 主控為 Cypress 增強(qiáng) 8051 內(nèi)核芯片 AN2131QC、ULINK2 主控為 NXP 公司 ARM7 內(nèi)核芯片 LPC2148FB064,ULINKpro 主控為 Xilinx VIRTEX FPGA),但為了 ARM 芯片的開(kāi)放生態(tài),其也同時(shí)主導(dǎo)了 DAPLink 項(xiàng)目(早期叫 CMSIS-DAP 項(xiàng)目,后來(lái)更名為 DAPLink),下面是其官網(wǎng):
ARMMbed CMSIS-DAP 主頁(yè): https://os.mbed.com/handbook/cmsis-dap-interface-firmware
ARMMbed CMSIS-DAP 源碼: https://github.com/mbedmicro/CMSIS-DAP
ARMMbed DAPLink 主頁(yè): https://os.mbed.com/handbook/DAPLink
ARMMbed DAPLink 源碼: https://github.com/ARMmbed/DAPLink
DAPLink 項(xiàng)目是完全開(kāi)源的,目前支持的主控芯片主要有 5 款:K20DX, KL26, LPC11U35, LPC4322, SAM3U2C,其中 K20DX 即是應(yīng)用于 OpenSDA 的主控,另外 4 款芯片分別用于其他類(lèi)型的調(diào)試器,此處不再展開(kāi)。DAPLink 版 Firmware 因其開(kāi)放的生態(tài)使其大受歡迎,是目前的主流。
3.2.3 野花 SEGGER(J-Link)
SEGGER 公司是 OpenSDA 項(xiàng)目第三個(gè) Firmware 軟件服務(wù)商,雖然 SEGGER 設(shè)計(jì)已久的通用型 J-Link 調(diào)試器是目前市場(chǎng)上最流行的,但 SEGGER 并沒(méi)有因此固步自封,SEGGER 看到 OpenSDA 調(diào)試器在 Kinetis 開(kāi)發(fā)板上大面積推廣,想到了一個(gè)非常聰明的策略,那便是免費(fèi)為 OpenSDA 設(shè)計(jì)一個(gè)與 J-Link 軟件兼容的 Firmware,使 OpenSDA 搖身一變成為一個(gè)簡(jiǎn)配版 J-Link。
SEGGER OpenSDA 主頁(yè): https://www.segger.com/products/debug-probes/j-link/models/other-j-links/opensda-sda-v2/
由于 SEGGER 公司是個(gè)靠軟件服務(wù)收費(fèi)的商業(yè)公司,因此 SEGGER 版 Firmware 并不開(kāi)源,并且調(diào)試功能上也受一定限制,但這并不影響 SEGGER 版 Firmware 的流行,因此 J-Link 調(diào)試器實(shí)在是太普及了,J-Link 上位機(jī)軟件功能(J-Link Commander 等)也非常強(qiáng)大。
至此,飛思卡爾 Kinetis MCU 開(kāi)發(fā)板板載 OpenSDA 調(diào)試器(上篇)痞子衡便介紹完畢了,掌聲在哪里~~~