keil5如何仿真調試 keil5連接仿真器調試



文章插圖
keil5如何仿真調試 keil5連接仿真器調試

文章插圖
在做開發的前幾年,基本上都沒用仿真,有bug就嘗試改程序,一邊改一邊調試 。
甚至都還不知道硬件仿真存在的價值,因為一直都沒用過,而且很多芯片也不支持 。
直到有一次在做行車記錄儀項目的時候,接觸到了GRAIN公司的一款單片機 。
本來我打算是直接開干的,但是老大非要我把這個芯片的仿真環境搭好 。
于是我就開始網上搜集資料,不得不說這塊的資料真少,那時又剛接觸仿真這塊的 。
搞了將近半個月都搞不定,然后我鼓起勇氣跟老大說,仿真搞不出來,要不我就直接開始寫程序燒錄進去調試算了 。
但是老大的意思還是希望我把仿真的環境搭建出來,我又試了2個星期,還是不行,于是就不理他了,直接開始寫程序調試 。
如果沒浪費時間研究怎么搭建調試環境,估計我程序都完成40%-50%了 。
過了一個星期,確實我也把程序跑起來了,在屏上顯示了一些UI,老大問我仿真搞定了?
我說沒有,跟他說沒仿真也能調啊,為什么一定要用仿真?
老大只是笑了笑沒說話,我也不解他具體是幾個意思,不過后面這個項目沒完全做完就跳槽了(不是因為仿真的事情) 。
直到后面,我在做一些比較復雜的主機程序的時候,我才理解老大當初為什么叫我一定讓我把仿真環境搭建出來 。
因為通過硬件仿真開發效率至少比沒有仿真高很多!
我來舉個簡單的例子,比如說我要看一個指針指向的地址 。
如果我要看指針指向的地址到底是多少,如果有屏和串口還好,可以通過屏或者串口打印出來 。
不過這個過程也需要改程序,調試完以后再把程序注釋,還是比較麻煩 。
而用仿真的話,直接在keil上面把鼠標移動到指針的位置就能直接看到地址 。
這就是效率的差別 。
所以,仿真的功能在寫一些復雜的產品程序的時候太重要了!
下面,我給大家分享下,stm32怎么用keil進行仿真 。
keil調試工具設置
先點擊那個錘子圖標進入keil的設置 。
選擇Debug,然后在USE那里點下拉按鍵,選擇St-Link Debugger 。
這一步是選擇我們使用的仿真器,一般有jtag和st-link,其中st-link實際產品用的最多,所以以這個為主 。
設置好仿真器以后,我們需要把仿真器連接到板子(我板子是直接用st-link的vdd供電,如果你沒用則板子單獨供電) 。
板子上電,并且st-link連接到板子 。
我們下一步點擊Settings,會彈出上圖這個界面,如果Device name顯示ARM core….就代表板子和st-link連接成功,可以正常進行仿真和燒錄程序了 。
我們點擊確定返回到工程界面后,點擊紅色那個小放大鏡進入仿真模式(注意板子和st-link保持連接和供電) 。
進入仿真模式好,我們看右上角我標注的那幾個箭頭圖標,我紅色箭頭標注的中間那個就是用的最多的單步執行,也就是說點擊一下,就會執行一條語句,這個大家下去可以試下 。
如果你嫌棄單步執行太慢,也可以設置斷點,然后點全速運行,讓程序自動跑到斷點位置,然后停止等待你下一步的操作 。
一般來說,我們調試程序的時候就是通過這種方式 。
比如說,我現在要看變量a的值在不同程序位置的變化,我可以根據上圖來設置斷點1,2,然后點全速執行 。
如果要看程序里變量的值,大家還需要把watch窗口調出來,按照上面的步驟 。
然后我們把變量名輸入到watch窗口方便查看 。
【keil5如何仿真調試 keil5連接仿真器調試】我們點全速運行,我們可以看到在”2”標識的位置前面有個黃色和藍色的箭頭,代表程序已經執行到這里并且停止 。
這個時候,我們看watch窗口a的值,也就是”3”標識的那里,臥槽,怎么沒值出來?a這個時候不是應該等于0xAA嗎?
別著急,這個是編譯器的問題,a定義的是局部變量,編譯器把局部變量優化了,并沒有在內存中生成導致 。
解決辦法有兩種:
1.調節keil的優化等級
這個大家可以自行度娘,一般我不去改,以免產生別的驚喜 。
2.把a改成全局變量
改完以后記得重新編譯哦,這樣就可以看到a的值變為0xFF啦 。
上面是仿真看變量,下面仿真看看硬件 。
這個時候我板子上的LED是熄滅的 。
上圖這個函數就是用來控制LED點亮的,我們繼續點全速運行,讓程序跑到第24行斷點處 。
這個時候奇跡發生了,LED亮啦?。。∈遣皇呛苌衿????
學完這兩種基本的仿真調試方法,其他的騷操作就靠大家自行發揮啦 。
如果大家有什么更好的調試方法也歡迎來告訴我們無際單片機編程團隊 。
實際的產品調試比這個還要復雜一些,調試過程中也會碰到一些問題 。
比如一點單步執行,程序就一直執行,問題千奇百怪,這里說不完 。
其實這種問題也很好解決,直接把問題現象在度娘搜一下就可以了,肯定會有人碰到并提供解決的辦法 。
我一直以來都是這樣去解決問題的 。