因?yàn)橛泻芏嘈』锇槭菑?a href="http://m.qingdxww.cn/keyword/單片機(jī)" target="_blank" class="relatedlink">單片機(jī)轉(zhuǎn)過(guò)來(lái)的,對(duì)JTAG非常熟悉。想用JTAG來(lái)調(diào)試裸機(jī)代碼,而且一直用卡拷貝經(jīng)常會(huì)出現(xiàn)虛擬機(jī)連接不上TF卡的情況。 I.MX6ULL本身是支持JTAG的,但是由于關(guān)于這個(gè)資料真的是太少了,而且還都是英文的,新手很難搞定。所以我們專門調(diào)試并整理了這方面的資料來(lái)供大家參考學(xué)習(xí)。 接下來(lái),我先簡(jiǎn)單介紹下怎么使用JTAG來(lái)調(diào)試,后面會(huì)把詳細(xì)的步驟加到使用手冊(cè)中去。 1.1 調(diào)試需要的硬件環(huán)境 1、i.MX6ULL終結(jié)者開發(fā)板一塊 2、JLNK V9下載器一個(gè) 3、JLINK V9轉(zhuǎn)換板一個(gè)(2.54mm轉(zhuǎn)2.0mm) 1.2 搭建開發(fā)環(huán)境 1.2.1 安裝JLINK V9驅(qū)動(dòng) 首先我們需要安裝JLNK V9的驅(qū)動(dòng),驅(qū)動(dòng)程序大家可以去網(wǎng)上下載,為了方便大家使用我們已經(jīng)下載好,并保存到光盤目錄的“i.MX6UL終結(jié)者光盤資料\02_開發(fā)所需軟件\JLINK V9驅(qū)動(dòng)”目錄下了(我們使用的版本是V6.34)。下面我們開始安裝驅(qū)動(dòng)程序。 首先我們鼠標(biāo)雙擊“JLink V6.34.exe”安裝程序,如下圖所示: ![]() 然后彈出安裝向?qū)В缦聢D所示: ![]() 然后我們點(diǎn)擊“Next”按鈕繼續(xù)安裝,會(huì)彈出license版本許可對(duì)話框,我們點(diǎn)擊“I Agree”按鈕,如下圖所示: ![]() 然后彈出是否需要?jiǎng)?chuàng)建桌面快捷方式的對(duì)話框,我們選擇創(chuàng)建,然后點(diǎn)擊“Next”按鈕,繼續(xù)下一步,如下圖所示: ![]() 然后彈出安裝位置選擇對(duì)話框,我們使用默認(rèn)的安裝目錄(如果需要安裝到其它目錄,可以自己選擇),然后點(diǎn)擊“Install”按鈕,如下圖所示: ![]() 然后開始安裝,如下圖所示: ![]() 最后彈出安裝完成對(duì)話框,我們點(diǎn)擊“Finish”按鈕。至此,JLINK V9的驅(qū)動(dòng)安裝完成了。然后我們通過(guò)USB數(shù)據(jù)線鏈接JLINK V9下載器到PC電腦上,我們?cè)谠O(shè)備管理器可以看到Winsows系統(tǒng)識(shí)別到了JLNK下載器,如下圖所示: ![]() NXP官方提供了i.MX6ULL的SDK開發(fā)包, 這個(gè)SDK包提供了Windows和Linux兩個(gè)版本,分別針對(duì)Windows系統(tǒng)和Linux系統(tǒng)。本章節(jié)我們使用Windows版本的SDK。Windows版本的SDK里面的例程提供了IAR的工程版,這些工程是基于IAR開發(fā)環(huán)境來(lái)編譯的。I.MX6ULL的SDK開發(fā)包我們可以去NXP官網(wǎng)上下載,為了大家使用方便,我們已經(jīng)下載好,并保存在了光盤資料的“i.MX6UL終結(jié)者光盤資料\01_開發(fā)及燒寫工具\(yùn)4.i.MX6ULL SDK包”目錄下。下面我們先來(lái)安裝下SDK開發(fā)包。 首先我們雙擊“SDK_2.2_MCIM6ULL_RFP_Win.exe”安裝程序,會(huì)彈出安裝界面,我們點(diǎn)擊“Next”按鈕,如下圖所示: ![]() 然后我們一路點(diǎn)擊next,SDK安裝就完成了。 1.2.3 安裝IAR開發(fā)工具在上面安裝SDK的章節(jié)我們介紹了,SDK里面提供了IAR的工程,所以我們需要在Windows系統(tǒng)下安裝IAR開發(fā)工具。大家需要注意SDK提供的IAR工程需要使用IAR 8以下的版本(筆者開始的時(shí)候安裝了IAR 8.2,結(jié)果在編譯的時(shí)候會(huì)報(bào)錯(cuò)誤,后來(lái)更改成了IAR 7.8,編譯通過(guò))。大家可以去網(wǎng)上下載IAR安裝程序,為了大家使用方便,我們已經(jīng)下載好,并保存在了光盤資料的“i.MX6UL終結(jié)者光盤資料\02_開發(fā)所需軟件\IAR7.8安裝程序”目錄下。IAR的安裝在這里就不給大家演示了,詳細(xì)的步驟會(huì)在使用手冊(cè)中添加,不然推文的篇幅就太長(zhǎng)了。 1.3 IAR JLNK調(diào)試SDK程序 在1.2.2章節(jié)我們安裝了SDK程序(安裝位置:G:\nxp),在1.2.3章節(jié)我們安裝了IAR開發(fā)工具,接下來(lái)我們打開IAR開發(fā)工具,如下圖所示: ![]() 在本章節(jié)我們主要是講解如何通過(guò)IAR+JLINK調(diào)試i.MX6ULL的IAR工程,關(guān)于IAR工具的具體使用,大家可以網(wǎng)上查找相關(guān)的文檔。然后我們點(diǎn)擊“file->open->workspace”,如下圖所示: ![]() 然后會(huì)打開“Open Workspace”對(duì)話框,我們這里以sdk里面的hello_world工程為例,來(lái)學(xué)習(xí)一下通過(guò)JLINK來(lái)調(diào)試i.MX6ULL的程序。該工程的目錄在sdk安裝位置的“boards\evkmcimx6ull\demo_apps\hello_world\iar”目錄下面,因?yàn)槲覀兊膕dk安裝到了G盤的nxp文件夾下,所以hello_world工程的絕對(duì)路徑是“G:\nxp\boards\evkmcimx6ull\demo_apps\hello_world\iar”(大家可以根據(jù)自己sdk安裝的位置,選擇對(duì)應(yīng)的目錄)。我們?cè)凇癘pen Workspace”對(duì)話框里選擇hello_world工程的目錄,最終在該目錄下選擇“hello_world.eww”(IAR工程文件的后綴名是eww),然后點(diǎn)擊“打開”按鈕,如下圖所示 ![]() Hello_world工程打開后的界面如下圖所示: ![]() 我們可以看到該工程提供了四種編譯方式,如下圖所示: ![]() 我們這里使用默認(rèn)的“ddr_debug”方式編譯該工程。我們可以點(diǎn)擊工具欄上的“Make”按鈕,編譯該工程,如下圖所示: ![]() 從上圖的編譯結(jié)果輸出信息,我們可以看到編譯成功。然后我們連接JLNIK V9下載器到i.MX6ULL終結(jié)者開發(fā)板的JTAG接口,如下圖所示: ![]() 由于i.MX6ULL芯片的JTAG接口和SAI(聲卡)是復(fù)用的,所以我們使用JTAG接口的時(shí)候需要修改下開發(fā)板(V1.0的底板需要去掉底上的電阻R183;V1.1的底板需要去掉聲卡芯片旁邊的跳線帽(J50))。然后我們連接開發(fā)板的調(diào)試串口到PC電腦上,并在電腦上打開串口終端,串口終端的波特率設(shè)置成115200,8位數(shù)據(jù)位,無(wú)奇偶校驗(yàn),1位停止位,不選擇流控,如下圖所示: ![]() 然后我們給開發(fā)板上電,接著我們?cè)贗AR工程界面的菜單欄點(diǎn)擊“Debug without Loading”圖標(biāo),如下圖所示: ![]() 如果JLINK和開發(fā)板的JTAG接口連接正確的話,會(huì)進(jìn)入到調(diào)試界面,如下圖所示: ![]() 從上圖我們可以看到hello_world的程序已經(jīng)開始運(yùn)行,程序的指針在main函數(shù)入口處停止,等待我們執(zhí)行調(diào)試。IAR進(jìn)入調(diào)試模式以后,在菜單欄上調(diào)試相關(guān)的快捷圖標(biāo)會(huì)變成有效狀態(tài)(鼠標(biāo)可以點(diǎn)擊),與調(diào)試相關(guān)的幾個(gè)快捷圖標(biāo)如下圖所示: ![]() 從上圖,我們可以看到一共有7個(gè)快捷圖標(biāo),他們分別是: Step Over:?jiǎn)尾綀?zhí)行(沒(méi)點(diǎn)擊一次,程序相應(yīng)的運(yùn)行一行) Step Into:如果程序指針當(dāng)前指向的是一個(gè)函數(shù)調(diào)用,如果點(diǎn)擊此圖標(biāo),則會(huì)進(jìn)入到當(dāng)前指向的這個(gè)函數(shù)內(nèi)部 Step Out:與Step Into想對(duì)應(yīng),如果我們通過(guò)Step Into進(jìn)入到某個(gè)函數(shù)內(nèi)部去執(zhí)行了,此時(shí)想返回到之前的函數(shù),并繼續(xù)執(zhí)行此前函數(shù)的嚇一跳命令,我們可以點(diǎn)擊此圖標(biāo) Next Statement:右擊某一行選“Set Next Statement”,可以不執(zhí)行中間程序,執(zhí)行點(diǎn)直接到此行,用于不執(zhí)行某些代碼 Run to Cursor:程序調(diào)試的時(shí)候運(yùn)行到光標(biāo)處(我們可以在任意一行程序鼠標(biāo)單擊一下,使光標(biāo)定位到該行,然后點(diǎn)擊“Run to Cursor”,程序就會(huì)運(yùn)行到光標(biāo)所在的行,并停住) Go:執(zhí)行程序,程序遇到斷點(diǎn)會(huì)停止,如果沒(méi)有設(shè)置斷點(diǎn),程序就會(huì)一直繼續(xù)執(zhí)行 Stop Debugging:結(jié)束調(diào)試模式 從上圖我們可以看到“Go”快捷圖標(biāo)的功能是程序繼續(xù)運(yùn)行,如果遇到斷點(diǎn),就停止,否則一直往下執(zhí)行。上圖中的程序最后進(jìn)入while(1)主循環(huán),在while(1)主循環(huán)里面主要實(shí)現(xiàn)接收串口數(shù)據(jù),并把接收到的串口數(shù)據(jù)通過(guò)串口再次發(fā)送出去。為了驗(yàn)證“Go”快捷圖標(biāo)在沒(méi)有遇到斷點(diǎn)的情況下會(huì)一直執(zhí)行,我們繼續(xù)點(diǎn)擊“Go”快捷圖標(biāo),繼續(xù)運(yùn)行程序,我們可以看到串口終端打印輸出了“hello world.”字符串,如下圖所示: ![]() |