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

第3章 STM32單片機(jī)程序模塊化設(shè)計(jì)與機(jī)器人運(yùn)動(dòng)控制

本章將介紹程序調(diào)試方法,以及如何利用模塊化的程序設(shè)計(jì)思想,設(shè)計(jì)機(jī)器人的運(yùn)動(dòng)控制模塊以實(shí)現(xiàn)各種巡航動(dòng)作。這些編程技術(shù)在后面的章節(jié)都會(huì)用到,與后面章節(jié)唯一不同的是,本章機(jī)器人在無(wú)感覺(jué)的情況下巡航,而在后面的章節(jié)中,機(jī)器人將根據(jù)傳感器檢測(cè)到的信息進(jìn)行智能巡航。本章所要完成的主要任務(wù)包括:STM32單片機(jī)程序調(diào)試方法,利用模塊化設(shè)計(jì)方法對(duì)STM32單片機(jī)編程,實(shí)現(xiàn)一些基本巡航動(dòng)作函數(shù):向前、向后、左轉(zhuǎn)、右轉(zhuǎn)和原地旋轉(zhuǎn)等。這些函數(shù)都能夠被多次調(diào)用,以使機(jī)器人可以實(shí)現(xiàn)復(fù)雜巡航運(yùn)動(dòng)。

3.1 STM32單片機(jī)程序調(diào)試方法

程序運(yùn)行是連續(xù)執(zhí)行的,但是當(dāng)程序執(zhí)行遇到問(wèn)題時(shí),我們?nèi)绾蝸?lái)判斷是哪條語(yǔ)句出問(wèn)題了呢?尤其是從本章開(kāi)始,我們將要編寫(xiě)的程序會(huì)越來(lái)越復(fù)雜,因此我們要學(xué)會(huì)如何調(diào)試程序,以及如何將一個(gè)復(fù)雜的程序模塊化,模塊內(nèi)的函數(shù)代碼相對(duì)簡(jiǎn)單。這也是程序設(shè)計(jì)的一個(gè)原則:“松耦合,強(qiáng)內(nèi)聚”,內(nèi)聚是子程序內(nèi)部的關(guān)系,耦合是不同子程序的關(guān)系。就是要求各個(gè)函數(shù)模塊獨(dú)立性高一些,即使修改了其中的某個(gè)函數(shù),其他的函數(shù)也不需要做修改。比如,我們每個(gè)程序都要用到的2個(gè)函數(shù):開(kāi)發(fā)板初始化函數(shù)和串口初始化函數(shù)。

任務(wù)一 程序調(diào)試

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

圖3.1 斷點(diǎn)設(shè)置

圖3.2 程序加入斷點(diǎn)后的效果

注意:若設(shè)置成功,那里會(huì)有一個(gè)小紅點(diǎn)的,不然你就需要重新操作

斷點(diǎn)與調(diào)試

斷點(diǎn)就是程序運(yùn)行到斷點(diǎn)處就暫停下來(lái),不運(yùn)行了(斷點(diǎn)所在的語(yǔ)句不會(huì)執(zhí)行);你可以看一下你設(shè)的變量在這個(gè)時(shí)候是什么值,從而判斷程序有沒(méi)有什么邏輯上的錯(cuò)誤或其他的問(wèn)題。

調(diào)試是學(xué)習(xí)語(yǔ)言的好方法,對(duì)于新手來(lái)說(shuō)寫(xiě)一個(gè)完整的程序難免出現(xiàn)錯(cuò)誤,如果直接運(yùn)行程的話,是很難發(fā)現(xiàn)程序的錯(cuò)誤。調(diào)試可以為程序的語(yǔ)句設(shè)置斷點(diǎn),開(kāi)始調(diào)試之后當(dāng)運(yùn)行到設(shè)置了斷點(diǎn)的語(yǔ)句時(shí)程序會(huì)停下來(lái),之后你可以選擇逐個(gè)語(yǔ)句運(yùn)行,也可以逐個(gè)方法運(yùn)行,可以監(jiān)視每個(gè)變量的變化,直到程序結(jié)束。這樣你就可以很容易發(fā)現(xiàn)程序的錯(cuò)誤所在。通俗地說(shuō),調(diào)試就是人跟著程序跑一次。相當(dāng)于你規(guī)劃了一個(gè)路線到達(dá)某地,但你不知道該路線是否真的能到達(dá)你想去的地方,要驗(yàn)證該路線是否正確的最好辦法就是按照路線走一遍。

單擊圖3.3(a)所示的圖標(biāo)(或按Ctrl+F5鍵)進(jìn)入調(diào)試模式,然后再單擊圖3.3(b)所示的圖標(biāo)(或按F5鍵)運(yùn)行程序,這時(shí)程序就會(huì)停在斷點(diǎn)處,如圖3.4和圖3.5所示。這時(shí)你可以通過(guò)調(diào)試窗口檢查程序的執(zhí)行狀態(tài),包括寄存器窗口、存儲(chǔ)器窗口、查看和調(diào)用棧窗口、反匯編窗口和外設(shè)窗口等,這里不再贅述。

圖3.3 程序調(diào)試

圖3.4 程序調(diào)試開(kāi)始

圖3.5 程序運(yùn)行到斷點(diǎn)處

程序調(diào)試開(kāi)始時(shí),會(huì)有一個(gè)黃顏色箭頭出現(xiàn)在main函數(shù)入口處(圖3.4),表示程序運(yùn)行停在這里。單擊圖3.3(b)所示的圖標(biāo)(或按F5鍵),黃顏色箭頭出現(xiàn)在第一個(gè)斷點(diǎn)處時(shí)(圖3.5),此時(shí)發(fā)光二極管亮;你可繼續(xù)按F5鍵運(yùn)行程序,黃顏色箭頭會(huì)出現(xiàn)在第二個(gè)斷點(diǎn)處時(shí),此時(shí)發(fā)光二極管滅。試試看,連續(xù)按F5鍵,發(fā)光二極管什么現(xiàn)象。

單步調(diào)試

程序調(diào)試開(kāi)始時(shí),即黃顏色箭頭出現(xiàn)在main函數(shù)入口處(圖3.4),你還可以單擊圖3.6(a)所示的圖標(biāo)(或按F11鍵),或單擊圖3.6(b)所示的圖標(biāo)(或按F10鍵)單步運(yùn)行程序,即一條語(yǔ)句一條語(yǔ)句地執(zhí)行程序。它們的區(qū)別在于當(dāng)程序運(yùn)行到子函數(shù)調(diào)用時(shí):

(1)Step into會(huì)進(jìn)入到子函數(shù)體,并繼續(xù)開(kāi)始單步執(zhí)行每條語(yǔ)句,直到當(dāng)前子函數(shù)結(jié)束返回上層調(diào)用函數(shù);

(2)Step over將子函數(shù)調(diào)用僅當(dāng)做一條語(yǔ)句單步執(zhí)行,不會(huì)進(jìn)入到子函數(shù)內(nèi)單步執(zhí)行,而是將子函數(shù)整個(gè)執(zhí)行完再停止,也就是把子函數(shù)整個(gè)作為一步單步執(zhí)行。

圖3.6(c)所示的圖標(biāo)(或按Ctrl+F11鍵)表示跳出當(dāng)前運(yùn)行的函數(shù),即將本函數(shù)余下語(yǔ)句執(zhí)行完返回上層調(diào)用函數(shù)。即當(dāng)單步執(zhí)行到子函數(shù)內(nèi)時(shí),用Step out就可以執(zhí)行完子函數(shù)余下部分,并返回到上一層函數(shù)。

圖3.6(d)所示的圖標(biāo)(或按Ctrl+F10鍵)表示運(yùn)行到當(dāng)前光標(biāo)所在語(yǔ)句處。

圖3.6 調(diào)試模式說(shuō)明

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

注意按下“Debug”圖標(biāo)進(jìn)入調(diào)試模式時(shí),需復(fù)位開(kāi)發(fā)板,才能開(kāi)始調(diào)試。

設(shè)置斷點(diǎn)和單步調(diào)試執(zhí)行程序?qū)τ谖覀兝斫獬绦虻倪\(yùn)行過(guò)程和調(diào)試錯(cuò)誤等都十分有用,所以要學(xué)會(huì)通過(guò)不斷嘗試來(lái)好好運(yùn)用它!這里所用的方法,可以同樣適用于使用Keil軟件開(kāi)發(fā)51單片機(jī)程序,或者使用VS.net,VC++編寫(xiě)PC程序,具有一定的通用性。Debug菜單下的常用命令總結(jié)如下

Start/Stop Debug Session:開(kāi)始或停止調(diào)試。圖3.3(a)所示。

Run:執(zhí)行程序,直到遇見(jiàn)下一個(gè)斷點(diǎn)。圖3.3(b)所示。

Step:?jiǎn)尾綀?zhí)行。圖3.6(a)所示,圖標(biāo)上顯示Step into。

Step Over:函數(shù)單步執(zhí)行,即將一個(gè)子函數(shù)作為一條語(yǔ)句來(lái)執(zhí)行。圖3.6(b)所示。

Step Out of Current Function:跳出當(dāng)前的函數(shù)執(zhí)行。圖3.6(c)所示。

Run to Cursor line:執(zhí)行到光標(biāo)所在行。圖3.6(d)所示。

Stop Running:停止執(zhí)行。

Breakpoints:打開(kāi)斷點(diǎn)對(duì)話框。

Insert/Remove Breakpoint:在當(dāng)前行插入/刪除一個(gè)斷點(diǎn)。圖3.1所示。

Enable/Disable Breakpoint:激活當(dāng)前行的斷點(diǎn)或使斷點(diǎn)無(wú)效。

Disable All Breakpoints:使程序所有斷點(diǎn)無(wú)效。

Kill All Breakpoints:刪除掉程序所有斷點(diǎn)。

該你了——一條語(yǔ)句一條語(yǔ)句地執(zhí)行程序!

軟件仿真

RealView MDK開(kāi)發(fā)工具提供了強(qiáng)大的軟件仿真功能,可以不需要將程序下載到開(kāi)發(fā)板上進(jìn)行調(diào)試,而是采用MDK的軟件仿真功能進(jìn)行調(diào)試,達(dá)到事半功倍的效果!

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

圖3.7 軟件仿真設(shè)置

編譯成功后,進(jìn)入Debug模式,按照前面介紹的方法即可進(jìn)入軟件仿真模式。這時(shí),可以選擇外圍模塊進(jìn)行仿真,不同型號(hào)的STM32單片機(jī)會(huì)有不同的外設(shè)仿真功能。打開(kāi)“Peripheral菜單”,可以打開(kāi)多個(gè)外設(shè)仿真對(duì)話框,如圖3.8所示。

圖3.8 外設(shè)仿真對(duì)話框

LED閃爍程序只用到了GPIOC端口,關(guān)閉其他對(duì)話框,僅保留“GPIOC”外設(shè)仿真對(duì)話框,如圖3.9所示。因?yàn)檫@時(shí)程序還沒(méi)有運(yùn)行,所以GPIOC端口是初始值。

圖3.9 GPIOC外設(shè)仿真對(duì)話框

單擊Debug工具條的運(yùn)行按鈕,在仿真對(duì)話框里就可以看到程序的運(yùn)行結(jié)果了。當(dāng)執(zhí)行完教學(xué)開(kāi)發(fā)板初始化函數(shù)BSP_Init()后,GPIOC的各項(xiàng)參數(shù)會(huì)發(fā)生變化,如圖3.10(a)所示。看看初始化函數(shù)BSP_Init()的代碼是不是這樣呢?通過(guò)單步執(zhí)行程序,可以發(fā)現(xiàn)PC13引腳的參數(shù)會(huì)發(fā)生變化,如圖3.10(b)和(c)所示。

圖3.10 GPIOC外設(shè)參數(shù)的變化情況

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

圖3.11 邏輯分析儀設(shè)置

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

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

要想得到精確的延時(shí)時(shí)間,可以使用后面將要學(xué)習(xí)到的定時(shí)器,來(lái)控制發(fā)光二極管交替閃爍。

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

主站蜘蛛池模板: 怀安县| 武功县| 资源县| 浦江县| 化德县| 东乌| 昆明市| 陆良县| 交口县| 津市市| 毕节市| 江源县| 石阡县| 康乐县| 台南县| 黑山县| 南阳市| 安阳县| 长春市| 和龙市| 武冈市| 安徽省| 嘉义市| 林周县| 楚雄市| 双牌县| 宁城县| 饶平县| 迁安市| 资源县| 疏附县| 安岳县| 唐海县| 澄江县| 额尔古纳市| 贵港市| 吴忠市| 长治市| 塔河县| 丰原市| 胶南市|