STM32-Keil软件仿真和硬件仿真/在线仿真
軟件仿真和硬件仿真什么區(qū)別?軟件仿真就是沒有硬件參與的仿真,完全是模擬實現(xiàn)的。硬件仿真是將程序下載到控制芯片的FLASH或RAM中,直接在硬件上實現(xiàn)仿真。【有什么問題歡迎聯(lián)系討論,一起解決問題】
仿真這種東西,因為涉及到信任問題,用的好覺得好用,用不好可能會徒增麻煩——“還不如直接在硬件上調(diào)試靠譜”。但是總體上,仿真還是比較有用的,比如在排查軟件問題(寄存器配置等)的時候,使用軟件仿真是非常靠譜的。而如果涉及到硬件的問題(比如你的板子代碼需要讀取外部信號,或者輸出信號等),可能需要用到硬件仿真,或者說在線仿真。關(guān)于仿真,網(wǎng)上的資料說的還是挺全的,這里只做總結(jié)。
目錄
一、軟件仿真
1.1 仿真配置
1.2 操作方法
邏輯分析窗口
Watch窗口
堆棧局部變量窗口
Peripherals窗口
二、硬件/在線仿真
2.1 仿真器通信協(xié)議/接口
JTAG協(xié)議/接口
SWD協(xié)議/接口
RDI協(xié)議/接口
2.2 常見仿真器
Jlink
STlink
ULINK
2.3?Jlink的Keil5仿真配置
2.4?硬件仿真操作方法
一、軟件仿真
1.1 仿真配置
首先確定仿真的硬件環(huán)境。點擊魔術(shù)棒,,在Target項確認(rèn)一下仿真的芯片型號無誤,然后選擇外部時鐘源頻率(因為STM32一般使用外部時鐘),一般是8MHz。
然后按照如下勾選,這里使用軟件仿真就勾選Use Simulator。勾選Run to main(),表示仿真時跳過匯編代碼,直接跳轉(zhuǎn)到 main 函數(shù)開始仿真。然后Dialog DLL和Parameter分別按照自己的型號進行修改,比如如果你是用的是STM32F103ZE××,就把-pSTM32F103VB改為-pSTM32F103ZE便可,這里是設(shè)置支持所選型號的芯片的軟硬件仿真,設(shè)置好后仿真的時候就可以通過 Peripherals 選擇對應(yīng)外設(shè)的對話框觀察仿真結(jié)果(非常實用,后邊詳述)。
1.2 操作方法
點擊開始仿真。
這里的DEBUG工具條是比較常用,其中作為一般的使用者或者說入門的使用者來說,最常使用的還是下面加黑的幾個。
- 復(fù)位:其功能等同于硬件上按復(fù)位按鈕。相當(dāng)于實現(xiàn)了一次硬復(fù)位。按下該按鈕之后,代碼會重新從頭開始執(zhí)行。
- 執(zhí)行到斷點處:該按鈕用來快速執(zhí)行到斷點處,有時候你并不需要觀看每步是怎么執(zhí)行的,而是想快速的執(zhí)行到程序的某個地方看結(jié)果,這個按鈕就可以實現(xiàn)這樣的功能,前提是你在查看的地方設(shè)置了斷點。
- 掛起:此按鈕在程序一直執(zhí)行的時候會變?yōu)橛行?#xff0c;通過按該按鈕,就可以使程序停止下來,進入到單步調(diào)試狀態(tài)。
- 執(zhí)行進去:該按鈕用來實現(xiàn)執(zhí)行到某個函數(shù)里面去的功能,在沒有函數(shù)的情況下,是等同于執(zhí)行過去按鈕的。
- 執(zhí)行過去:在碰到有函數(shù)的地方,通過該按鈕就可以單步執(zhí)行過這個函數(shù),而不進入這個函數(shù)單步執(zhí)行。
- 執(zhí)行出去:該按鈕是在進入了函數(shù)單步調(diào)試的時候,有時候你可能不必再執(zhí)行該函數(shù)的剩余部分了,通過該按鈕就直接一步執(zhí)行完函數(shù)余下的部分,并跳出函數(shù),回到函數(shù)被調(diào)用的位置。
- 執(zhí)行到光標(biāo)處:該按鈕可以迅速的使程序運行到光標(biāo)處,其實是挺像執(zhí)行到斷點處按鈕功能,但是兩者是有區(qū)別的,斷點可以有多個,但是光標(biāo)所在處只有一個。
- 匯編窗口:通過該按鈕,就可以查看匯編代碼,這對分析程序很有用。
- 堆棧局部變量窗口:該按鈕按下,會彈出一個顯示變量的窗口,在里面可以查看各種你想要看的變量值,也是很常用的一個調(diào)試窗口。
- Watch窗口:可以用來查看全局變量。
- 串口打印窗口:該按鈕按下,會彈出一個類似串口調(diào)試助手界面的窗口,用來顯示從串口打印出來的內(nèi)容。需要注意的是在硬件調(diào)試時無法使用,只能從硬件上獲取串口信息。
- 內(nèi)存查看窗口:該按鈕按下,會彈出一個內(nèi)存查看窗口,可以在里面輸入你要查看的內(nèi)存地址,然后觀察這一片內(nèi)存的變化情況。是很常用的一個調(diào)試窗口。
- 性能分析窗口(沒標(biāo)的那個):按下該按鈕,會彈出一個觀看各個函數(shù)執(zhí)行時間和所占百分比的窗口,用來分析函數(shù)的性能是比較有用的。
- 邏輯分析窗口:按下該按鈕會彈出一個邏輯分析窗口,通過 SETUP 按鈕新建一些 IO 口,就可以觀察這些 IO 口的電平變化情況,以多種形式顯示出來,比較直觀。
關(guān)于執(zhí)行到某處以及設(shè)置/清除斷點等這些常規(guī)操作不在贅述。
邏輯分析窗口
點擊選擇邏輯分析儀(Logic Analyzer),
點擊左上角SETUP
然后輸入要查看的引腳,選擇顯示類型為Bit,最后Close(另外顯示顏色可以自由選擇)。這里的引腳名有一定的格式,比如這個是表示GPIOC13引腳,PORTC這里可以理解為GPIOC引腳狀態(tài)寄存器,(PORTC & 0x00002000)表示取其GPIOC13的狀態(tài)(bit),然后右移13位是把該值移到最低位(可以簡記為pin號是幾就右移幾位)。
如果不知道怎么確定“&”的數(shù)應(yīng)該是多少,可以參考下面各pin號的值:
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ #define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ #define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ #define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ #define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ #define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ #define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ #define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ #define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ #define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ #define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ #define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ #define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ #define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ #define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */比如,如果你需要查看PA11的引腳,就寫為(PORTA & 0x00000800)>> 11(0x00000800可以寫為0x0800)。因為為PA11,所以寫PORTA,從上宏定義可知,因為11腳對應(yīng)的是0x0800,所以就&0x0800,因為是11腳就右移11位。
設(shè)置好引腳之后,在View下勾選上更新窗口,這樣的話仿真時各種數(shù)據(jù)會實時更新,邏輯分析儀也就可以看到實時波形。
設(shè)置好之后點擊運行,就可以在邏輯分析儀窗口看到該引腳的狀態(tài)實時波形。
Watch窗口
Watch創(chuàng)口可以用來觀察全局變量,只要將需要觀察的全局變量復(fù)制到下面的窗口中,運行之后就可以看到數(shù)據(jù)的變化。
比如這里是觀察一個結(jié)構(gòu)體數(shù)組變量的情況,那個數(shù)據(jù)的值是多少、是什么類型一目了然。
當(dāng)然,這里沒法看局部變量,要看局部變量的話還是要用堆棧局部變量窗口。
堆棧局部變量窗口
你可能會問,什么是堆、棧?點這!
什么是堆棧? 內(nèi)存分配方式有三種: [1]從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在。例如全局變量,static變量。 [2]在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。 [3]從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運行的時候用malloc或new申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責(zé)任回收它,否則運行的程序會出現(xiàn)內(nèi)存泄漏,頻繁地分配和釋放不同大小的堆空間將會產(chǎn)生堆內(nèi)碎塊。簡言之,我們可以通過這個串口觀察申請在堆棧區(qū)的變量,另外實測發(fā)現(xiàn)靜態(tài)變量也是可以看的。總之,通過Watch窗口和堆棧窗口我們可以查看幾乎所有的變量。
Peripherals窗口
它是用來仿真時觀察和修改芯片的在外設(shè)寄存器用的,第一個System Viewer可以通過箭頭所指的地方直接查看。
? ? ? ? ? ??
但是! 這是一個通用的選項,即涵蓋了所有的外設(shè),這上邊可以查看的外設(shè)在我們的芯片型號上不一定有。比如我選用的是STM32VBT6只有3個串口,而這里可以看5個串口!而SyetemViwer下邊的是外設(shè)是根據(jù)前文配置仿真時配置的Dialog DLL和Parameter決定的,所以要使用這個功能,必須要把Dialog DLL和Parameter配置為你要仿真的芯片型號。
另外兩者的界面也有一些差別,看一哈
? ??
左圖是System Viwer的界面,直接顯示了改外設(shè)的所有寄存器極其每個位的值。右圖是另一個界面,可以相對前者比較直觀一些。
二、硬件/在線仿真
2.1 仿真器通信協(xié)議/接口
目前主流的協(xié)議是JTAG協(xié)議和SWD協(xié)議,一般常用的仿真器也是同時支持這兩種協(xié)議/接口的。
JTAG協(xié)議/接口
JTAG(Joint Test Action Group,聯(lián)合測試行動小組)是一種國際標(biāo)準(zhǔn)測試協(xié)議(IEEE 1149.1兼容),主要用于芯片內(nèi)部測試。現(xiàn)在多數(shù)的高級器件都支持JTAG協(xié)議,如ARM、DSP、FPGA器件等。JTAG的工作原理可以歸結(jié)為:在器件內(nèi)部定義一個TAP(Test Access Port,測試訪問口),通過專用的JTAG測試工具對內(nèi)部節(jié)點進行測試和調(diào)試。一個含有JTAG Debug接口模塊的CPU,只要時鐘正常,就可以通過JTAG接口訪問CPU的內(nèi)部寄存器、掛在CPU總線上的設(shè)備以及內(nèi)置模塊的寄存器。
JTAG有5根線與目標(biāo)CPU相連,TMS、TCK、TDI、TDO、NTRST:
- TMS:測試模式選擇,TMS用來設(shè)置JTAG接口處于某種特定的測試模式;
- TCK:測試時鐘輸入;
- TDI:測試數(shù)據(jù)輸入,數(shù)據(jù)通過TDI引腳輸入JTAG接口;
- TDO:測試數(shù)據(jù)輸出,數(shù)據(jù)通過TDO引 腳從JTAG接口輸出;
- NTRST:JTAG模塊復(fù)位
其中在引腳緊缺的時候NTRST復(fù)位引腳可以不用。
SWD協(xié)議/接口
SWD全稱Serial Wire Debug,是ARM為嵌入式設(shè)備推出的一種簡單的調(diào)試接口,這種接口通過一條雙向數(shù)據(jù)線和一條時鐘線實現(xiàn)對于ARM核心的調(diào)試。
SWD需要3根線與目標(biāo)MCU相連,SWDIO,SWDCLK和GND。
- SWDIO 為雙向Data口,主機到目標(biāo)的數(shù)據(jù)傳送。
- SWDCLK 為時鐘口,主機驅(qū)動。
- GND??GND腳。
關(guān)于SWD的協(xié)議的具體內(nèi)容,可以參考這位篇文章。還不滿足的話可以參考這篇碩士論《WD協(xié)議的研究及ARM程序下載器的設(shè)計》。
RDI協(xié)議/接口
遠程調(diào)試接口(Remote Debug Interface),是ARM公司提出的標(biāo)準(zhǔn)調(diào)試接口,主要用于ARM芯片的仿真,由于各個IDE廠商使用的調(diào)試接口各自獨立,硬件無法進行跨平臺的調(diào)試。現(xiàn)在眾多的IDE廠家都逐步采用標(biāo)準(zhǔn)RDI作為ARM仿真器的調(diào)試接口,因此使跨平臺的硬件調(diào)試成為可能。EasyJTAG由于使用標(biāo)準(zhǔn)RDI調(diào)試接口,因此在任何使用標(biāo)準(zhǔn)RDI接口的IDE調(diào)試環(huán)境中都可以使用,例如ARM公司的ADS1.2/IAR公司的EWARM 3.30 。
2.2 常見仿真器
Jlink
J-Link是德國SEGGER公司推出基于JTAG的仿真器。簡單地說,是一個JTAG協(xié)議轉(zhuǎn)換盒,即一個小型USB到JTAG的轉(zhuǎn)換盒,其連接到計算機用的是USB接口,而到目標(biāo)板內(nèi)部用的還是jtag協(xié)議。它完成了USB接口和JTAG接口的轉(zhuǎn)換工作。JLINK是一個通用的開發(fā)工具,可以用于KEIL、IAR、ADS 等平臺。速度,效率,功能都很好,據(jù)說是眾多仿真器里最強悍的。
STlink
ST-LINK是專門針對意法半導(dǎo)體STM8和STM32系列芯片的仿真器。ST-LINK /V2指定的SWIM標(biāo)準(zhǔn)接口和JTAG / SWD標(biāo)準(zhǔn)接口。
ULINK
ULINK是ARM/KEIL公司推出的仿真器,專用于KEIL平臺下使用,ADS、IAR下不能使用。
?
2.3?Jlink的Keil5仿真配置
首先確認(rèn)所選用的芯片支持哪種仿真通信協(xié)議,STM32F103支持 JTAG 和 SWD。并且PA13、PA14、PA15、PB3、PB4默認(rèn)功能為調(diào)試引腳,如果要使用這些引腳,要Remap為普通IO。
魔術(shù)棒的DEBUG選項下選用使用仿真器以及所使用的仿真器的型號。
點擊setting,選擇接口類型(SW或JTAG),速度建議選4M,過高的話也行,只是有時候擦寫flash會失敗。
下載的時候使用的仿真器,所以要在這里勾選使用仿真器
最后,這里根據(jù)所選型號flash大小選擇合適的下載算法。如果不知道怎么選,看一下STM32芯片的命名規(guī)則,或點這里。
2.4?硬件仿真操作方法
仿真操作方法與軟件操作相同,不同的是,硬件/在線仿真是在硬件上跑的,可以向硬件輸入數(shù)據(jù)或者由硬件輸出數(shù)據(jù),比如做按鍵仿真的時候,只能通過硬件/在線仿真才能測試出芯片有沒有正確地處理按鍵信息等。
總結(jié)
以上是生活随笔為你收集整理的STM32-Keil软件仿真和硬件仿真/在线仿真的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx+mysql+端口映射_最浅显
- 下一篇: 2019最强一键刷机root教程,安卓用