仿真操作相關(guān)問題
賽元大部分芯片是有仿真功能的,在進行仿真之前需要先安裝賽元的 keil_C 插件,賽 元的 keil_C 插件可以在賽元官網(wǎng)(www.socmcu.com)上搜索“keil_C”進行下載,安裝時 keil 插件會自動檢索 keil 編譯器安裝目錄,將插件安裝在 keil 對應(yīng)目錄下;目前賽元的仿真工具 有 SC LINK 以及 DPT52,其中 SC LINK 支持 92/93/95F 系列芯片的仿真,DPT52 支持 91/92/93F 系列芯片的仿真,需要注意查看所用型號是否支持仿真,如果芯片具有仿真功能, 在規(guī)格書中會進行說明,如果規(guī)格書中沒有說明芯片可以仿真即芯片不具有仿真功能,賽元 91F系列芯片91F736/742/743/744/842/843/844/8301/8311/8312/8322可以仿真,其他91F 系列芯片不能仿真,92F/93F/95F 系列大多數(shù)芯片可以仿真,92F735X,92F725X 芯片無法 進行硬件仿真。?
本文檔主要包含以下內(nèi)容,客戶可以根據(jù)需求自行查閱:?
一、keil 仿真設(shè)置?
二、仿真操作?
1、設(shè)置/刪除斷點?
2、進入/退出仿真?
3、全速運行至斷點(Run)?
4、單步跟蹤(Step)?
5、跨步運行(Step Over)?
6、運行至光標處(Run to Cursor Line)?
7、復(fù)位(Reset)?
三、查看和修改變量?
1、使用 Watch 窗口查看和修改變量?
2、使用 Memory 查看和修改變量?
3、查看和修改 SFR?
一、keil 仿真設(shè)置?
1) 打開 Keil 工程文件,點擊快捷圖標“Target Option”,在“Target Option”界面中選擇 “Debug”,點選“Use”,并從下列中選取“SinOne Chip Debug Driver”,同時,勾選“Run to main()”;?

2) 點擊“Utilities”,在“Use Target Driver for Flash Programming”中選擇“SinOne Chip Debug Driver”,在點擊“Settings”,進入“燒錄 Option 信息界面”,如下圖:?

3) 再點擊“Settings”,進入“燒錄 Option 信息界面”,如下圖:?

4) 燒錄 Option 信息配置:?
a) 芯片選擇:選擇預(yù)燒錄或仿真的 IC 名稱;?
b) 燒錄設(shè)置:可選擇進行的自動燒錄,包括擦除,編程,校驗;?
c) 燒錄選項:根據(jù)需要設(shè)置的 Code Option 選項;?
d) 升級:用于庫文件的升級;?
e) 幫助:版本的相關(guān)信息;?
5) 點擊 keil 軟件中的“編譯”按鈕,編譯通過后,點擊”LOAD“按鈕將程序下載到芯片中,然 后點擊“debug”按鈕,進入仿真模式,如圖:1 為編譯;2 為 LOAD 鍵;3 為進入仿真按 鈕。?

注意:如果芯片選擇中未查找到需要的 IC 型號,需要點擊升級,進行 MCU 庫升級;?

二、仿真操作?
1、設(shè)置/刪除斷點?
斷點設(shè)置:在預(yù)設(shè)斷點的源碼程序行雙擊鼠標左鍵,或者按下”F9”按鍵,或者點擊快捷圖 標”Insert/Remove breakpoint(“Debug”按鈕的右側(cè))”,當該行左側(cè)會出現(xiàn)紅色塊標記出現(xiàn) 即設(shè)置成功。?
斷點取消:在預(yù)取消的斷點前,雙擊鼠標左鍵,或者按下”F9”按鍵,或者點擊快捷圖 標”Insert/Remove breakpoint(“Debug”按鈕的右側(cè))”,當該行左側(cè)會出現(xiàn)紅色塊標記消失 即設(shè)置成功。?
要求:進入仿真前,可以預(yù)設(shè)好斷點,也可進入仿真后設(shè)置/刪除斷點,但在仿真運行過程 中不可設(shè)置/刪除斷點,需要將程序停下來之后再設(shè)置/刪除斷點。?
2、進入/退出仿真?
當程序 Downlaod 通過,點擊快捷圖標“start/stop Debug Session”按鈕,或按下快捷鍵 “Ctrl+F5”或者使用菜單“Debug>start/stop Debug Session”如下圖所示。當正確進入時, “D”按鈕為凹陷狀態(tài),表示打開;再次點擊,退出調(diào)試,“D”按鈕為平滑狀態(tài),表示關(guān)閉。 進入仿真調(diào)試狀態(tài),工具欄會增加調(diào)試相關(guān)的菜單,下圖從左向右依次是復(fù)位、運行、停 止、單步、跨步、跳出當前函數(shù)、運行至光標處、下一狀態(tài)、命令窗口、反匯編窗口、符 號窗口、系統(tǒng)寄存器窗口、調(diào)用堆棧窗口、觀察窗口、內(nèi)存窗口、串口窗口等。上述工具 欄的菜單在當前的“Debug”菜單欄中均可找到。?

3、全速運行至斷點(Run)?
由于在進入仿真狀態(tài)前,已經(jīng)預(yù)先設(shè)置好了斷點,點擊快捷圖標“Run”按鈕或者“F5”,程 序全速運行遇到斷點停止,如下圖:?

上圖中,全速運行至第一個斷點處,可以看出當程序停止到斷點位置時,斷點處左側(cè)出現(xiàn) 黃色調(diào)試箭頭,指向當前的停止行。如果打開反匯編窗口(Disassembly),同樣會出現(xiàn)黃 色調(diào)試箭頭,并指向當前程序的 PC 地址。?
當進入仿真狀態(tài)后,程序默認是停止在 0x00 地址,即 PC 指 0x00,第一次全速運行至 斷點,將從該地址一直運行至第一個斷點才停止,相比其他仿真操作,該操作的執(zhí)行速度 是最快的。?
4、單步跟蹤(Step)?
單步跟蹤是指,每次執(zhí)行一行程序,執(zhí)行完成該行程序后停止。?
①點擊快捷圖標“Step”按鈕或者按下快捷鍵“F11”,程序會單步運行一次。需要注意的是, 默認情況下,“Disassembly”窗口打開或者關(guān)閉,在 C 源程序窗口中,單步運行過程會有 差異,建議在運行 Step 的過程中,保持“Disassembly”窗口為打開狀態(tài)。?
② “Disassembly”窗口的打開/關(guān)閉。點擊快捷圖標“Disassembly Window”,凹陷狀態(tài)為 打開,此時出現(xiàn)“Disassembly”窗口,并反匯編當前的程序行;平滑狀態(tài)為關(guān)閉, “Disassembly”窗口消失?

③“Disassembly”窗口打開下運行 Step,當前程序停止在函數(shù)體 Timer0Init(),按下 F11 鍵, 執(zhí)行當前黃色箭頭指向的程序行,然后箭頭指向下一行。執(zhí)行完成的結(jié)果如下圖所示,不 斷按下 F11,程序?qū)⒅鹦袌?zhí)行下去。當“Disassembly”窗口打開時,默認是執(zhí)行反匯編行, 如果需要執(zhí)行源碼行,只需要鼠標左鍵選中一次源碼界面即可。?


5、跨步運行(Step Over)?
當程序執(zhí)行至子函數(shù)或者匯編中的 CALL/LCALL 時,該操作不進會入子函數(shù)單步執(zhí)行, 而是將子函數(shù)全速運行,停在下一指令處。?
注意:?
①當程序執(zhí)行到的位置不是子函數(shù)時,該操作與單步跟蹤結(jié)果相同;?
②當子函數(shù)內(nèi)存在斷點時,程序會優(yōu)先停在斷點處。?
點擊快捷圖標”Step Over”按鈕或快捷鍵”F10”操作即可。 仍以當前斷點停止在函數(shù)體 Timer0Init()為例,按下 F10 鍵,調(diào)試光標不進入函數(shù)內(nèi)部, 而是全速執(zhí)行完該函數(shù),然后黃色箭頭指向下一行,如下圖:


繼續(xù)按下 F10,觀察反匯編窗口,其運行結(jié)果與單步跟蹤相同,如下圖:

?
?6、運行至光標處(Run to Cursor Line)?
當斷點間仿真操作通過單步跟蹤或者跨步操作效率較低時,又希望直接運行至源程序行 時,可通過運行至光標處( Run to Cursor Line)來完成。?
該操作可通過按下快捷圖標“Run to Cursor Line”或者快捷鍵“Ctrl+F10”實現(xiàn)。?
以圖 3.2.2 的結(jié)果為例,希望程序直接停止在 Timer0Init()函數(shù)內(nèi)的最后一行,選擇使用 運行至光標操作。
?定位光標:鼠標左鍵點擊一次預(yù)定位的程序行,出現(xiàn)藍色箭頭表示該行被選中,如下圖:?
注意:預(yù)定位的程序行一定是從當前黃色箭頭開始能夠運行到的,否則運行至光標處操作 無效。?


按下 Ctrl+F10,程序全速運行至光標處停止,定位光標處變?yōu)辄S色箭頭,如下圖:?

7、復(fù)位(Reset)?
點擊”Reset”按鈕,程序重新復(fù)位,黃色箭頭指向地址 0x00,如下圖:?

三、查看和修改變量?
1、使用 Watch 窗口查看和修改變量?
在仿真調(diào)試模式下,可通過觀察窗口來查看或修改當前的變量。?
① 打開 Watch 窗口?
點擊快捷圖標”Watch Windows”出現(xiàn) 3 個可選擇窗口:Locals,Watch1,Watch2,如果這 3 個 窗口的帶淺黃色背景框,則表示選中,KEIL 界面下方會出現(xiàn)子窗口,否則,點擊選擇 Watch1 或者 Watch2 的任意一個,Watch 界面就會出現(xiàn)在 KEIL 界面的下方,如圖?

②填寫預(yù)查看/修改的變量名?
在”Name”欄下填入要操作的變量名,該變量名必須是源碼中存在,否則無效。此時其對 應(yīng)的”Value”欄會顯示出該變量當前的值,如下圖?

上圖中,添加變量 GlobalVar_Idata、GlobalVar_Xdata,Watch1 中觀察到該變量的值分 別是 0x0010、0x30。另外,在 C 源碼界面內(nèi),當鼠標移動到變量名的位置時,也會顯示 當前該變量的值及其類型和地址,如下圖所示

③修改變量值?
在需要修改的變量對應(yīng)的”Value”欄中,雙擊該值,進行修改,修改完成之后,在任意位置 單擊鼠標左鍵,當修改成功,該變量一欄顯示變?yōu)樯钌?,如圖。?

上圖中,修改 GlobalVar_Xdata 的值為 0x22。?
2、使用 Memory 查看和修改變量?
①打開 Memory 窗口?
點擊”Memory Windows”出現(xiàn) 4 個可選擇窗口:Memory1~Memory4,如圖 4.2.1,如果這 4 個窗口的帶淺黃色背景框,則表示選中,KEIL 界面下方會出現(xiàn)子窗口,否則,點擊選擇 任意一個,Memory 界面就會出現(xiàn)在 KEIL 界面的下方,如圖?

②通過地址查看修改變量?
在 Memory 的界面中,Address 欄用來輸入待顯示的存儲區(qū)起始地址。如果知道當前變量 的地址及變量所在的區(qū)域時,可通過如下命令完成。Ram data 區(qū):D:xx;RAM idata 區(qū): I:xx;Ram Xdata 區(qū):X:xx。?
當上述命令填寫完成,就可以顯示從起始地址開始的變量值,同時也可以雙擊該值進行修 改。?
例如:GlobalVar_Xdata 為 Xdata 區(qū),地址為 0x27,使用 0x27 為起始地址,查看 Xdata 區(qū)域的值,如圖。?

從上圖看出,X:0x000027 地址的值為 0x30,即 GlobalVar_Xdata 的值為 0x30。 同樣,也可在該位置修改變量的值,修改方式如下:?
1.雙擊 Memory 中地址相應(yīng)的值,進行修改,如圖?

寫入新的值,任意位置單擊鼠標,完成修改,如圖?

建議:如果對變量地址分配不清楚的情況下,請使用 Watch 窗口的方式。?
3、查看和修改 SFR?
①打開 Watch 窗口?
與查看和修改變量中打開 Watch 窗口相同。?
②填寫預(yù)查看/修改的 SFR 名?
在”Name”欄下填入要操作 SFR 名,該 SFR 必須是頭文件中存在的,否則無效。此時其 對應(yīng)的”Value”欄,會顯示出該 SFR 當前的值,如圖?

在需要修改的 SFR 對應(yīng)的”Value”欄中,雙擊該值,進行修改,修改完成之后,在任意位 置單擊鼠標左鍵,當修改成功,該變量一欄顯示變?yōu)樯钌?,修改結(jié)果如圖

