在做開發的前幾年,基本上都沒用模擬,有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窗口方便查看。

我們點全速運行,我們可以看到在」2」標識的位置前面有個黃色和藍色的箭頭,代表程序已經執行到這裡並且停止。
這個時候,我們看watch窗口a的值,也就是」3」標識的那裡,卧槽,怎麼沒值出來?a這個時候不是應該等於0xAA嗎?
別著急,這個是編譯器的問題,a定義的是局部變數,編譯器把局部變數優化了,並沒有在內存中生成導致。
解決辦法有兩種:
1.調節keil的優化等級
這個大家可以自行度娘,一般我不去改,以免產生別的驚喜。
2.把a改成全局變數

改完以後記得重新編譯哦,這樣就可以看到a的值變為0xFF啦。
上面是模擬看變數,下面模擬看看硬體。

這個時候我板子上的LED是熄滅的。

上圖這個函數就是用來控制LED點亮的,我們繼續點全速運行,讓程序跑到第24行斷點處。

這個時候奇蹟發生了,LED亮啦!!!是不是很神奇???
學完這兩種基本的模擬調試方法,其他的騷操作就靠大家自行發揮啦。
如果大家有什麼更好的調試方法也歡迎來告訴我們無際單片機編程團隊。
實際的產品調試比這個還要複雜一些,調試過程中也會碰到一些問題。
比如一點單步執行,程序就一直執行,問題千奇百怪,這裡說不完。
其實這種問題也很好解決,直接把問題現象在度娘搜一下就可以了,肯定會有人碰到並提供解決的辦法。
我一直以來都是這樣去解決問題的。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/226109.html
微信掃一掃
支付寶掃一掃