官术网_书友最值得收藏!

第3章 STM32單片機程序模塊化設計與機器人運動控制

本章將介紹程序調試方法,以及如何利用模塊化的程序設計思想,設計機器人的運動控制模塊以實現各種巡航動作。這些編程技術在后面的章節都會用到,與后面章節唯一不同的是,本章機器人在無感覺的情況下巡航,而在后面的章節中,機器人將根據傳感器檢測到的信息進行智能巡航。本章所要完成的主要任務包括:STM32單片機程序調試方法,利用模塊化設計方法對STM32單片機編程,實現一些基本巡航動作函數:向前、向后、左轉、右轉和原地旋轉等。這些函數都能夠被多次調用,以使機器人可以實現復雜巡航運動。

3.1 STM32單片機程序調試方法

程序運行是連續執行的,但是當程序執行遇到問題時,我們如何來判斷是哪條語句出問題了呢?尤其是從本章開始,我們將要編寫的程序會越來越復雜,因此我們要學會如何調試程序,以及如何將一個復雜的程序模塊化,模塊內的函數代碼相對簡單。這也是程序設計的一個原則:“松耦合,強內聚”,內聚是子程序內部的關系,耦合是不同子程序的關系。就是要求各個函數模塊獨立性高一些,即使修改了其中的某個函數,其他的函數也不需要做修改。比如,我們每個程序都要用到的2個函數:開發板初始化函數和串口初始化函數。

任務一 程序調試

打開發光 二極管閃 爍程序,即工程文 件Led_Blink.Uv2,將光標移動到想要程序運行時需要暫停的語句處,如延時語句處,單擊圖3.1所示的圖標(或按F9鍵)。這樣你就給程序加了一個斷點,如圖3.2所示。當你想取消斷點時,可以再按一次這個圖標(或按F9鍵)。設置斷點也可以直接在你要設置的語句最前面的空白處雙擊一下。

圖3.1 斷點設置

圖3.2 程序加入斷點后的效果

注意:若設置成功,那里會有一個小紅點的,不然你就需要重新操作

斷點與調試

斷點就是程序運行到斷點處就暫停下來,不運行了(斷點所在的語句不會執行);你可以看一下你設的變量在這個時候是什么值,從而判斷程序有沒有什么邏輯上的錯誤或其他的問題。

調試是學習語言的好方法,對于新手來說寫一個完整的程序難免出現錯誤,如果直接運行程的話,是很難發現程序的錯誤。調試可以為程序的語句設置斷點,開始調試之后當運行到設置了斷點的語句時程序會停下來,之后你可以選擇逐個語句運行,也可以逐個方法運行,可以監視每個變量的變化,直到程序結束。這樣你就可以很容易發現程序的錯誤所在。通俗地說,調試就是人跟著程序跑一次。相當于你規劃了一個路線到達某地,但你不知道該路線是否真的能到達你想去的地方,要驗證該路線是否正確的最好辦法就是按照路線走一遍。

單擊圖3.3(a)所示的圖標(或按Ctrl+F5鍵)進入調試模式,然后再單擊圖3.3(b)所示的圖標(或按F5鍵)運行程序,這時程序就會停在斷點處,如圖3.4和圖3.5所示。這時你可以通過調試窗口檢查程序的執行狀態,包括寄存器窗口、存儲器窗口、查看和調用棧窗口、反匯編窗口和外設窗口等,這里不再贅述。

圖3.3 程序調試

圖3.4 程序調試開始

圖3.5 程序運行到斷點處

程序調試開始時,會有一個黃顏色箭頭出現在main函數入口處(圖3.4),表示程序運行停在這里。單擊圖3.3(b)所示的圖標(或按F5鍵),黃顏色箭頭出現在第一個斷點處時(圖3.5),此時發光二極管亮;你可繼續按F5鍵運行程序,黃顏色箭頭會出現在第二個斷點處時,此時發光二極管滅。試試看,連續按F5鍵,發光二極管什么現象。

單步調試

程序調試開始時,即黃顏色箭頭出現在main函數入口處(圖3.4),你還可以單擊圖3.6(a)所示的圖標(或按F11鍵),或單擊圖3.6(b)所示的圖標(或按F10鍵)單步運行程序,即一條語句一條語句地執行程序。它們的區別在于當程序運行到子函數調用時:

(1)Step into會進入到子函數體,并繼續開始單步執行每條語句,直到當前子函數結束返回上層調用函數;

(2)Step over將子函數調用僅當做一條語句單步執行,不會進入到子函數內單步執行,而是將子函數整個執行完再停止,也就是把子函數整個作為一步單步執行。

圖3.6(c)所示的圖標(或按Ctrl+F11鍵)表示跳出當前運行的函數,即將本函數余下語句執行完返回上層調用函數。即當單步執行到子函數內時,用Step out就可以執行完子函數余下部分,并返回到上一層函數。

圖3.6(d)所示的圖標(或按Ctrl+F10鍵)表示運行到當前光標所在語句處。

圖3.6 調試模式說明

此時,可以單擊圖3.6(e)、(f)、(g)所示圖標,分別打開Stack、Memory、邏輯分析儀窗口進一步觀察程序中各個變量、所用到的寄存器,以及引腳電平的變化,從而判斷程序有沒有邏輯上的錯誤或其他的問題。也可以單擊圖3.6(h)所示圖標,查看匯編代碼,并和C語言代碼對比分析,加深對STM32微控制器的理解。調試模式下的工作區主要用于顯示匯編代碼、C語言代碼的執行跟蹤及調試信息,這對應用程序的開發非常重要。單擊圖3.6(i)所示圖標時,將復位CPU,終止正在調試的程序,重新從代碼起始位置開始。

注意按下“Debug”圖標進入調試模式時,需復位開發板,才能開始調試。

設置斷點和單步調試執行程序對于我們理解程序的運行過程和調試錯誤等都十分有用,所以要學會通過不斷嘗試來好好運用它!這里所用的方法,可以同樣適用于使用Keil軟件開發51單片機程序,或者使用VS.net,VC++編寫PC程序,具有一定的通用性。Debug菜單下的常用命令總結如下

Start/Stop Debug Session:開始或停止調試。圖3.3(a)所示。

Run:執行程序,直到遇見下一個斷點。圖3.3(b)所示。

Step:單步執行。圖3.6(a)所示,圖標上顯示Step into。

Step Over:函數單步執行,即將一個子函數作為一條語句來執行。圖3.6(b)所示。

Step Out of Current Function:跳出當前的函數執行。圖3.6(c)所示。

Run to Cursor line:執行到光標所在行。圖3.6(d)所示。

Stop Running:停止執行。

Breakpoints:打開斷點對話框。

Insert/Remove Breakpoint:在當前行插入/刪除一個斷點。圖3.1所示。

Enable/Disable Breakpoint:激活當前行的斷點或使斷點無效。

Disable All Breakpoints:使程序所有斷點無效。

Kill All Breakpoints:刪除掉程序所有斷點。

該你了——一條語句一條語句地執行程序!

軟件仿真

RealView MDK開發工具提供了強大的軟件仿真功能,可以不需要將程序下載到開發板上進行調試,而是采用MDK的軟件仿真功能進行調試,達到事半功倍的效果!

單擊圖標,或右鍵單擊“Target 1”,選擇“Option for target ‘Target 1’”,或單擊Project菜單下的Options for Target(工程屬性),或單擊“Flash”菜單下的“Configure Flash Tools”,彈出“Options for Target”對話框,選擇“Debug”頁面,選中“Use Simulator”之后確定,如圖3.7所示。注意需重新編輯,使設置成功。

圖3.7 軟件仿真設置

編譯成功后,進入Debug模式,按照前面介紹的方法即可進入軟件仿真模式。這時,可以選擇外圍模塊進行仿真,不同型號的STM32單片機會有不同的外設仿真功能。打開“Peripheral菜單”,可以打開多個外設仿真對話框,如圖3.8所示。

圖3.8 外設仿真對話框

LED閃爍程序只用到了GPIOC端口,關閉其他對話框,僅保留“GPIOC”外設仿真對話框,如圖3.9所示。因為這時程序還沒有運行,所以GPIOC端口是初始值。

圖3.9 GPIOC外設仿真對話框

單擊Debug工具條的運行按鈕,在仿真對話框里就可以看到程序的運行結果了。當執行完教學開發板初始化函數BSP_Init()后,GPIOC的各項參數會發生變化,如圖3.10(a)所示??纯闯跏蓟瘮礏SP_Init()的代碼是不是這樣呢?通過單步執行程序,可以發現PC13引腳的參數會發生變化,如圖3.10(b)和(c)所示。

圖3.10 GPIOC外設參數的變化情況

如果想觀察引腳的電平變化,可以單擊圖標,打開邏輯分析儀,如圖3.11(a)所示。然后單擊“Setup…”按鈕,在觀測引腳設置對話框中添加GPIOC_IDR,并設置相關參數,如圖3.11(b)~(e)所示。

圖3.11 邏輯分析儀設置

單擊“Debug”菜單下的“Run”菜單項或按F5鍵,開始軟件仿真。稍等一下之后,可以單擊“Debug”菜單下的“Stop Running”菜單項,停止仿真。

單擊“Zoom”的“All”按鈕,可以查看整個仿真期間PC13引腳的電平變化情況。單擊“In”按鈕,可以將時間軸網格為變??;單擊“Out”按鈕,可以將時間軸網格為變大,通過這兩個按鈕可以將時間軸網格調整到一個合適的大小,以利于觀測顯示波形。如圖3.12所示,PC13引腳的輸出電平每隔一定的時間變化一次,對應的發光二極管交替閃爍。從圖中可以看出存在一定的誤差,因此,最好用示波器驗證一下PC13引腳的輸出波形。軟件仿真存在一定的誤差。

要想得到精確的延時時間,可以使用后面將要學習到的定時器,來控制發光二極管交替閃爍。

圖3.12 PC13引腳的電平變化情況

主站蜘蛛池模板: 香格里拉县| 明溪县| 宁阳县| 榆中县| 吉安市| 鄯善县| 沈阳市| 固原市| 惠州市| 旬邑县| 宜宾市| 崇州市| 卓尼县| 东兰县| 盐津县| 昂仁县| 镇原县| 轮台县| 类乌齐县| 宜良县| 汝阳县| 泗洪县| 利川市| 巴林左旗| 新巴尔虎右旗| 鄂伦春自治旗| 赤城县| 疏附县| 兰考县| 宜都市| 泰州市| 临洮县| 龙州县| 天门市| 祁阳县| 南澳县| 延吉市| 剑川县| 诏安县| 平武县| 九龙县|