<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32系列微控制器開(kāi)發(fā)工具與應(yīng)用——keil

          STM32系列微控制器開(kāi)發(fā)工具與應(yīng)用——keil

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          STM32微處理器基于ARM核,所以很多基于ARM嵌入式開(kāi)發(fā)環(huán)境都可用于STM32開(kāi)發(fā)平臺(tái)。開(kāi)發(fā)工具都可用于STM32開(kāi)發(fā)。選擇合適的開(kāi)發(fā)環(huán)境可以加快開(kāi)發(fā)進(jìn)度,節(jié)省開(kāi)發(fā)成本。本章將先對(duì)STM32常用的開(kāi)發(fā)工具Keil MDK和IAR EWARM進(jìn)行簡(jiǎn)單介紹,然后結(jié)合STM32_SK仿真評(píng)估板和STM32F103C的開(kāi)發(fā)板講解STM32片上資源使用,最后給出一個(gè)基于STM32的數(shù)據(jù)采集器的應(yīng)用實(shí)例。


          5.1 Keil MDK介紹
          Keil是德國(guó)知名軟件公司Keil(現(xiàn)已并入ARM 公司)開(kāi)發(fā)的微控制器軟件開(kāi)發(fā)平臺(tái),是目前ARM內(nèi)核單片機(jī)開(kāi)發(fā)的主流工具。Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器在內(nèi)的完整開(kāi)發(fā)方案,通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(uVision)將這些功能組合在一起。uVision當(dāng)前最高版本是uVision3,它的界面和常用的微軟VC++的界面相似,界面友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強(qiáng)大的功能。因此很多開(kāi)發(fā)ARM應(yīng)用的工程師,都對(duì)它十分喜歡。

          5.1.1 開(kāi)發(fā)過(guò)程及集成開(kāi)發(fā)環(huán)境簡(jiǎn)介
          1. Keil的軟件開(kāi)發(fā)周期
          使用Keil來(lái)開(kāi)發(fā)嵌入式軟件,開(kāi)發(fā)周期和其他的平臺(tái)軟件開(kāi)發(fā)周期是差不多的,大致有以下幾個(gè)步驟:
          1. 創(chuàng)建一個(gè)工程,選擇一塊目標(biāo)芯片,并且做一些必要的工程配置。
          2. 編寫(xiě)C或者匯編源文件。
          3. 編譯應(yīng)用程序。
          4. 修改源程序中的錯(cuò)誤。
          5. 聯(lián)機(jī)調(diào)試。
          下面這種結(jié)構(gòu)圖完整描述了Keil開(kāi)發(fā)軟件的整個(gè)過(guò)程。

          本文引用地址:http://www.ex-cimer.com/article/201611/317806.htm

          2. uVision3 集成開(kāi)發(fā)環(huán)境
          uVision3 IDE是一款集編輯,編譯和項(xiàng)目管理于一身的基于窗口的軟件開(kāi)發(fā)環(huán)境。uVision3集成了C語(yǔ)言編譯器,宏編譯,鏈接/定位,以及HEX文件產(chǎn)生器。uVision3具有如下特性:
          ? 功能齊全的源代碼編輯器,
          ? 用于配置開(kāi)發(fā)工具的設(shè)備庫(kù),
          ? 用于創(chuàng)建工程和維護(hù)工程的項(xiàng)目管理器,
          ? 所有的工具配置都采用對(duì)話框進(jìn)行,
          ? 集成了源碼級(jí)的仿真調(diào)試器,包括高速CPU和外設(shè)模擬器,
          ? 用于往Flash ROM下載應(yīng)用程序的Flash編程工具,
          ? 完備的開(kāi)發(fā)工具幫助文檔,設(shè)備數(shù)據(jù)表和用戶使用向?qū)А?br />uVision3具有良好的界面風(fēng)格,下圖是一個(gè)典型的調(diào)試時(shí)的窗口。

          ? 工程區(qū):用于訪問(wèn)文件組和文件,調(diào)試是可以查看CPU寄存器。
          ? 輸出窗口:顯示編譯結(jié)果,以便快速查找錯(cuò)誤的地方,同時(shí)還是調(diào)試命令輸入輸出窗口,也可以用于顯示查找結(jié)果。
          ? 內(nèi)存窗口:顯示指定地址內(nèi)村里的內(nèi)容。
          ? 查看和調(diào)用棧窗口:用于查看和修改變量的值,并且現(xiàn)實(shí)當(dāng)前函數(shù)調(diào)用樹(shù)。
          ? 代碼窗口:用于查看和編輯源文件。
          ? 外設(shè)對(duì)話框:檢查微控制的片上外設(shè)的狀態(tài)。

          3. ULINK USB-JTAG接口適配器
          ULINK USB-JTAG是一個(gè)用于連接PC USB口和開(kāi)發(fā)板JTAG口的小硬件適配器。通過(guò)ULINK你可以在真實(shí)的目標(biāo)板上創(chuàng)建,下載和測(cè)試嵌入式應(yīng)用。ULINK支持如下操作:
          ? 下載目標(biāo)程序。
          ? 檢查內(nèi)存和寄存器。
          ? 單步運(yùn)行程序。
          ? 插入多個(gè)斷點(diǎn)。
          ? 實(shí)時(shí)運(yùn)行程序
          ? 燒寫(xiě)FLASH存儲(chǔ)器

          5.1.2 工程管理
          在項(xiàng)目開(kāi)發(fā)中,并不是僅有一個(gè)源程序就行了,還要為這個(gè)項(xiàng)目選擇CPU(Keil支持?jǐn)?shù)百種CPU,而這些CPU的特性并不完全相同),確定編譯、匯編、連接的參數(shù),指定調(diào)試的方式,有一些項(xiàng)目還會(huì)有多個(gè)文件組成等,為管理和使用方便,Keil使用工程(Project)這一概念,將這些參數(shù)設(shè)置和所需的所有文件都加到一個(gè)工程中,只對(duì)工程而不是對(duì)單一的源程序進(jìn)行編譯(匯編)和連接等操作。下面我們就以一個(gè)簡(jiǎn)單的例子HelloWorld來(lái)講解如何建立工程和配置工程。在這個(gè)例子里,我們將實(shí)現(xiàn)開(kāi)發(fā)板上的LED1閃爍,本例使用STM32F103C開(kāi)發(fā)板為目標(biāo)板。

          5.1.2.1 新建工程
          點(diǎn)擊菜單“Project”,選擇“New uVision Project”,這是將會(huì)出現(xiàn)一個(gè)對(duì)話框,要求給將要建立的工程起一個(gè)名字。
          選擇你要保存的路徑,輸入工程文件的名字,這里我們就叫HelloWorld,uVision3工程文件的后綴為“.uv2”,然后點(diǎn)擊“Save”。 這時(shí)會(huì)彈出一個(gè)對(duì)話框要求你選擇目標(biāo)設(shè)備的型號(hào)。

          你可以根據(jù)你使用的處理器來(lái)選擇,如果您所使用的處理器型號(hào)在列表中找不到,也可以找一款與您使用的相兼容的型號(hào)來(lái)代替。這里我們選擇STM32F103C8,如圖所示,右邊一欄是對(duì)這個(gè)芯片的基本的說(shuō)明,然后點(diǎn)擊“OK”。

          有些芯片會(huì)提供啟動(dòng)代碼,我們這個(gè)時(shí)候點(diǎn)擊“Yes”,到此一個(gè)工程就建立好了。

          5.1.2.2 配置工程
          工程建立好了之后,還要對(duì)工程進(jìn)行進(jìn)一步的設(shè)置,以滿足要求。
          首先用鼠標(biāo)右鍵(注意用右鍵)點(diǎn)擊左邊工程窗口的“Target 1”,會(huì)出現(xiàn)一個(gè)菜單,選擇“Options for Target Target 1”(也可以通過(guò)點(diǎn)擊工程窗口的Target 1”,然后使用菜單“Project”->“Options for Target Target 1”),即出現(xiàn)工程配置的對(duì)話框,如下圖所示:

          這個(gè)對(duì)話框很復(fù)雜,而且根所選擇的芯片有關(guān),這里共有10個(gè)頁(yè)面,絕大多數(shù)選擇默認(rèn)配置即可,下面將對(duì)一些需要注意的配置簡(jiǎn)單介紹一下。
          1. Output標(biāo)簽頁(yè)的設(shè)置

          Select Folder for Objects:選擇編譯之后的目標(biāo)文件存儲(chǔ)在哪個(gè)目錄里,默認(rèn)位置為工程文件的目錄里。
          Name of Executable:生成的目標(biāo)文件的名字,缺省是工程的名字。
          Create Executable:生成OMF以及HEX文件。OMF文件名同工程文件名但沒(méi)有帶擴(kuò)展名。
          Debug Information:用于Debug版本,生成調(diào)試信息,否則的話無(wú)法進(jìn)行單步調(diào)試。
          Create Batch File:生成用于實(shí)現(xiàn)整個(gè)編譯過(guò)程的批處理文件,使用這個(gè)文件可以脫離IDE對(duì)省程序進(jìn)行編譯。
          Create Hex File:這個(gè)選項(xiàng)默認(rèn)情況下未被選中,如果要寫(xiě)片做硬件實(shí)驗(yàn)就必須選中該項(xiàng)。這一點(diǎn)是初學(xué)者易疏忽的,在此特別提醒注意一定要要選中,否則編譯之不生成Hex文件。
          Big Endian:編碼格式,與CPU相關(guān),如果CPU采用的是Big Endian編碼則勾選上。
          Browse Information:產(chǎn)生用于在源文件快速定位的信息。
          Create Library:生成lib庫(kù)文件,默認(rèn)不選。
          在我們剛剛新建的HelloWorld工程中,更改了三個(gè)地方,在工程目錄下新建了一個(gè)Output目錄保存目標(biāo)文件,以避免和源文件混在一起。另外選中了Create Hex File和Browse Information,如上圖所示。
          2. C/C++標(biāo)簽頁(yè)的設(shè)置

          Include Paths:指定頭文件的查找路徑,可以添加多個(gè)。
          這里我們所有的選擇保持默認(rèn)選擇就可以了。
          3. Debug標(biāo)簽頁(yè)的設(shè)置

          左邊是對(duì)應(yīng)uVision3的模擬環(huán)境,右邊是針對(duì)仿真器,這里選擇右邊的ULINK Cortex Debugger仿真器為例進(jìn)行說(shuō)明。
          如果已經(jīng)將ULINK仿真器連接到你的電腦,點(diǎn)擊“Settings”你將進(jìn)入ARM Target Driver Setup 界面。

          ULINK - JTAG/SWD Adapter:
          Serial No:列出了當(dāng)前連接到主機(jī)的所有ULINK適配器的串號(hào),你可以通過(guò)列表選擇要使用的ULINK適配器。
          ULINK Version,Device Family以及Firmware Version分別列出了當(dāng)前選擇的ULINK適配器的版本,設(shè)備家族和固件版本。
          SWJ,Port:根據(jù)和開(kāi)發(fā)板接口的類(lèi)型選擇端口,有JTAG和SW兩種,勾選SWJ表示支持兩種方式。
          Max Clock:指定和開(kāi)發(fā)板的最高通信時(shí)鐘。
          JTAG Device Chain:顯示當(dāng)前通過(guò)適配器連接上的開(kāi)發(fā)板。
          Automatic Detection:自動(dòng)監(jiān)測(cè),選擇系統(tǒng)將自動(dòng)檢測(cè)連接上的開(kāi)發(fā)板,建議使用。
          Manual Configuration:手動(dòng)配置,通過(guò)手動(dòng)設(shè)置ID CODE,Device Name和IR len等屬性來(lái)查找設(shè)備。
          Debug:
          Cache Options:
          ? Cache Code:通知調(diào)試器已經(jīng)下載的程序代碼不會(huì)改變,選中的話uVision將不會(huì)從目標(biāo)系統(tǒng)讀取程序代碼。
          ? Cache Memory:決定調(diào)試程序期間程序停止運(yùn)行的時(shí)候,是否更新存儲(chǔ)器顯示。
          Download Options:
          ? Verify Code Download:比較目標(biāo)存儲(chǔ)器和調(diào)試器上的應(yīng)用程序的內(nèi)容。
          ? Download to Flash:將代碼下載到所有的存儲(chǔ)器區(qū)域,如果不選中,調(diào)試器不會(huì)把代碼下載到Flash Download Setup中制定的存儲(chǔ)器地址范圍。
          Misc Options:
          ? Use Reset at Startup:選中的時(shí)候,調(diào)試器在開(kāi)始調(diào)試的時(shí)候會(huì)發(fā)起一次CPU復(fù)位?!?br />Load Application at Startup:將Output標(biāo)簽中指定的可執(zhí)行文件導(dǎo)入到調(diào)試器的起始地址。
          Run to Main:開(kāi)始調(diào)試時(shí)執(zhí)行到Main函數(shù)入口暫停執(zhí)行。
          Initialization File:指定一個(gè)包含一組調(diào)試命令的文件,這組命令是調(diào)試器開(kāi)始工作或者調(diào)試函數(shù)在調(diào)試期間要使用的。
          Restore Debug Session Settings:使用上一次調(diào)試過(guò)程對(duì)Breakpoints,Watchpoints,Memory Display和Toolbox(如果這些項(xiàng)被選中的話)。
          Driver DLL – Parameter:由Device Database設(shè)置的目標(biāo)驅(qū)動(dòng)DLL,不要修改。
          Dialog DLL – Parameter:由Device Database設(shè)置的對(duì)話框DLL,不要修改。
          這里我們修改了兩個(gè)地方,選中了Use ULINK和Run to Main,對(duì)ULINK的設(shè)置進(jìn)行了一些調(diào)整,具體的設(shè)置圖5.11所示。
          4. Utilities標(biāo)簽頁(yè)的設(shè)置

          Configure Flash Menu Command
          ? Use Target Driver for Flash Programming:列表選擇和調(diào)試接口一致的驅(qū)動(dòng)。Init File的設(shè)置也和前面調(diào)試設(shè)置一致。點(diǎn)擊Settings將進(jìn)入Flash Download Setup界面。

          Download Function:定義了Flash燒寫(xiě)的時(shí)候進(jìn)行的操作。
          ? Erase Full Chip:前面三項(xiàng)要選一,燒寫(xiě)程序之前擦除整個(gè)Flash存儲(chǔ)器。
          ? Erase Sectors:燒寫(xiě)程序之前擦除程序要使用的扇區(qū)。
          ? Do not Erase:不進(jìn)行擦除操作
          ? Program:使用當(dāng)前uVision工程的程序燒寫(xiě)ROM。
          ? Verify:驗(yàn)證Flash ROM的內(nèi)容和當(dāng)前工程中的程序一致。
          ? Reset and Run:在燒寫(xiě)和驗(yàn)證完成之后復(fù)位開(kāi)發(fā)板并且運(yùn)行程序。
          RAM for Algorithm:指定用于燒寫(xiě)程序的RAM區(qū)域,通常是微控制器上的一段片上空間。
          ? Start:起始地址。
          ? Size:大小。
          可以通過(guò)點(diǎn)擊Add添加,點(diǎn)擊Add你將看到如下的選擇列表,可以根據(jù)你選用的芯片選擇合適的,也可以自己手動(dòng)添加。

          ? Use External Tool for Flash Programming:使用第三方的工具進(jìn)行Flash下載。
          ? Command:要使用的Flash燒寫(xiě)工具的命令文件(通常是一個(gè).exe文件)。
          ? Arguments:傳遞給Flash燒寫(xiě)工具的參數(shù)。
          ? Run Independent:當(dāng)選中的時(shí)候,uVision不等待Flash燒寫(xiě)完成。不選中的時(shí)候uVision要等待Flash燒寫(xiě)完成并且在輸出窗口顯示燒寫(xiě)結(jié)果。
          在HelloWorld里面修改了Flash Download Setup,具體的設(shè)置如上圖所示。到此工程設(shè)置就結(jié)束了。

          5.1.2.3 打開(kāi)工程
          通過(guò)菜單“Project”->“Open Project”來(lái)打開(kāi)一個(gè)現(xiàn)有工程,這時(shí)將彈出一個(gè)打開(kāi)文件對(duì)話框讓我們選擇要打開(kāi)的工程文件。
          選擇你要打開(kāi)的工程的路徑,然后點(diǎn)擊“Open”打開(kāi)工程。我們還可以和打開(kāi)其他文件一樣,找到一個(gè)后綴為“uv2”的uVision3工程文件,直接雙擊,Windows會(huì)自動(dòng)調(diào)用uVision3打開(kāi)這個(gè)文件,前提是你電腦已經(jīng)安裝了uVision3并且和“uv2”文件建立了關(guān)聯(lián)。

          5.1.3 編寫(xiě)源程序
          選擇菜單“File”->“New”或者點(diǎn)擊工具欄的新建文件按鈕,即可在項(xiàng)目窗口的右側(cè)打開(kāi)一個(gè)新的文本編輯窗口,在該窗口可以輸入程序代碼。
          需要說(shuō)明的是,源文件就是一般的文本文件,不一定使用Keil軟件編寫(xiě),可以使用任意文本編輯器編寫(xiě),而且Keil的編輯器對(duì)漢字的支持不好,建議使用UltraEdit之類(lèi)的編輯軟件進(jìn)行源程序的輸入。
          每一個(gè)程序至少有一個(gè)原型為int main(void)的主函數(shù),這是程序的入口地址,程序?qū)倪@里開(kāi)始運(yùn)行。此外,我們還需要對(duì)開(kāi)發(fā)板做一些時(shí)鐘和中斷方面的初始化工作,這些工作將在函數(shù)RCC_Configuration和NVIC_Configuration中完成。源文件的代碼清單如下所示。
          #include "stm32f10x_lib.h"
          GPIO_InitTypeDef GPIO_InitStructure;
          void Delay (vu32 nCount);
          /******************************************************************************* Function Name : main
          * Description : 主程序
          * Input : None
          * Output : None
          * Return : None
          ******************************************************************************/
          int main (void)
          {
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_ GPIOB, ENABLE);
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init (GPIOB, &GPIO_InitStructure);
          while (1)
          {
          GPIO_WriteBit (GPIOB, GPIO_Pin_9,
          (BitAction)(1-GPIO_ReadOutputDataBit (GPIOB, GPIO_Pin_9)));
          Delay (1000000);
          }
          }
          void Delay (vu32 nCount)
          {
          for (; nCount != 0; nCount--);
          }
          代碼編輯完成之后,我們可以保存源文件,選擇菜單“File”->“Save”或者點(diǎn)擊工具欄的保存文件按鈕,可以用來(lái)保存源文件。
          這時(shí)會(huì)出現(xiàn)一個(gè)保存文件的文件對(duì)話框,選擇你要保存的路徑,輸入文件名HelloWorld.c。注意一定要輸入擴(kuò)展名,如果是c程序文件擴(kuò)展名為.c,如果是匯編文件擴(kuò)展名為.s,習(xí)慣.asm的也可以存儲(chǔ)為.asm。注解說(shuō)明文件可以保存為.txt的擴(kuò)展名。
          源文件編輯完成之后我們還需要將源文件加入到工程中,工程建好之后,在工程窗口的文件頁(yè)中,將會(huì)出現(xiàn)“Target 1”,前面有個(gè)“+”號(hào),點(diǎn)擊“+”號(hào)展開(kāi),可以看到下一層的“Source Group 1”,我們需要向這個(gè)里面加入源文件,點(diǎn)擊“Source Group 1”使其反白顯示,然后,點(diǎn)擊鼠標(biāo)右鍵,出現(xiàn)一個(gè)下拉菜單,如下圖如示。

          選中其中的“Add file to Group ‘Source Group 1’”,出現(xiàn)一個(gè)對(duì)話框,要求尋找源文件,如下圖所示。

          注意,該對(duì)話框下面的“文件類(lèi)型”默認(rèn)為C source file(*.c),我們可以通過(guò)調(diào)整這個(gè)來(lái)選擇過(guò)濾我們想要格式的文件,從而幫助我們快速查找文件。如果是匯編文件,就選擇“asm source file”;如果是目標(biāo)文件,選擇“Object file”;如果是庫(kù)文件,選擇“Library file”。最后點(diǎn)擊“Add”,也可以雙擊要添加的文件進(jìn)行加入。注意:點(diǎn)擊“Add”之后,窗口不會(huì)消失,如果要添加多個(gè)文件,可以不斷添加,添加完畢此時(shí)再點(diǎn)擊“Close”關(guān)閉該窗口。初學(xué)者時(shí)常誤認(rèn)為操作沒(méi)有成功而再次雙擊同一文件或者再次點(diǎn)擊“Add”,這時(shí)會(huì)出現(xiàn)如下的對(duì)話框。

          在這里我們把剛新建的HelloWorld.c添加進(jìn)去,文件添加進(jìn)去之后,我們點(diǎn)擊“Source Group 1”前面的“+”號(hào),就會(huì)發(fā)現(xiàn)我們剛剛添加的文件HelloWrold.c已在其中了,雙擊文件名,即在代碼區(qū)打開(kāi)該源程序文件。
          除了添加文件,我們還可以添加新的Group,操作和添加文件類(lèi)似,出現(xiàn)下拉菜單之后我們選擇“New Group”,這時(shí)就會(huì)在工程窗口看到新加的Group。對(duì)Group和添加文件的操作我們還可以通過(guò)點(diǎn)擊工具欄上的彩色品字按鈕進(jìn)入“Components,Environment and Books”窗口,如下圖所示。

          雙擊列表中的項(xiàng)可以對(duì)該項(xiàng)進(jìn)行重命名操作,點(diǎn)擊空白處可以添加新的項(xiàng),虛方框按鈕也可以添加新的項(xiàng),紅叉表示刪除選中的項(xiàng),上下箭頭用于調(diào)整當(dāng)前選中項(xiàng)在列表中的位置,“Add Files”可以添加新的源文件,操作過(guò)程和前面添加文件的操作是一樣的。

          5.1.4 編譯程序
          程序代碼寫(xiě)好之后就進(jìn)入編譯程序階段,可以通過(guò)菜單,工具欄和浮動(dòng)菜單多種方式來(lái)發(fā)起編譯過(guò)程,也可以通過(guò)批處理文件進(jìn)行,關(guān)于這個(gè)批處理文件在Output標(biāo)簽頁(yè)的設(shè)置中提到過(guò)。

          紅線圈起來(lái)的區(qū)域就是對(duì)應(yīng)的菜單編譯命令和工具欄編譯命令。各命令的含義如下:
          ? Clean target:清除編譯結(jié)果。
          ? Build target:編譯被修改的文件并且編譯應(yīng)用程序。
          ? Rebuild all target files:重新編譯所有的源文件并且編譯應(yīng)用程序。
          ? Batch Build:通過(guò)前面輸出的批處理文件進(jìn)行編譯。
          ? Translate **.*:編譯某個(gè)源文件,**.*代表要編譯的源文件。
          ? Stop build:只有編譯進(jìn)行過(guò)程中這一項(xiàng)才有效。
          通過(guò)在工程窗口“Target 1”上點(diǎn)擊右鍵,也可以彈出相應(yīng)的編譯菜單,各命令含義和上面一致。

          現(xiàn)在就讓我們來(lái)編譯我們的“HelloWorld”,如下圖所示,編譯的結(jié)果會(huì)在輸出窗口顯示。


          很遺憾,有不少錯(cuò)誤,也許你早就發(fā)現(xiàn)我們的代碼中使用了很多我們沒(méi)有定義的而且也不屬于標(biāo)準(zhǔn)C的一些函數(shù),沒(méi)錯(cuò)這就是ST固件庫(kù)給我們提供的函數(shù),我們要做的就是把固件庫(kù)添加到我們的工程中,和其他的開(kāi)發(fā)環(huán)境一下,我們可以直接添加固件庫(kù)的源文件和工程一起編譯,也可以通過(guò)添加已經(jīng)編譯好的靜態(tài)連接庫(kù)(*.lib)文件。這里我們以后者為例,這些庫(kù)在我們安裝好Keil開(kāi)發(fā)環(huán)境的時(shí)候已經(jīng)提供了,路徑一般在你安裝目錄下的ARMRV31LIB中,例如我這里的路徑是D:KeilARMRV31LIBST。這里我們將添加一個(gè)新的Group,取名為FWLIB。然后將庫(kù)文件添加到這個(gè)Group中,具體的操作過(guò)程可以參照編寫(xiě)源程序章節(jié)。添加庫(kù)之后我們?cè)俅尉幾g。
          問(wèn)題解決了,當(dāng)出現(xiàn)“0 Error(s), 0 Warning(s)”的時(shí)候也就意味著我們的程序已經(jīng)通過(guò)了語(yǔ)法檢查,有時(shí)候一些Warning也不影響程序執(zhí)行,但是我們要慎重對(duì)待,仔細(xì)分析每一個(gè)Warning。如果是源程序中有語(yǔ)法錯(cuò)誤或者警告,我們可以通過(guò)雙擊輸出窗口的該行,快速定位到出錯(cuò)的位置。

          5.1.5 調(diào)試程序
          編譯通過(guò)只是說(shuō)明我們的代碼沒(méi)有語(yǔ)法錯(cuò)誤,至于源程序中存在的其他錯(cuò)誤,必須通過(guò)調(diào)試才能發(fā)現(xiàn)并解決,事實(shí)上,除了極簡(jiǎn)單的程序以外,絕大部分的程序都要通過(guò)反復(fù)調(diào)試才能得到正確的結(jié)果,因此,調(diào)試是軟件開(kāi)發(fā)接下來(lái)我們需要運(yùn)行我們的程序來(lái)驗(yàn)證是否達(dá)到了預(yù)期的目的。也就是程序調(diào)試,程序調(diào)試往往是程序開(kāi)發(fā)過(guò)程中最難的階段,尤其是對(duì)一些比較大型的程序。下面我們就來(lái)看看uVision3對(duì)調(diào)試的支持。

          5.1.5.1 常用的調(diào)試命令
          在對(duì)工程成功進(jìn)行匯編、連接之后,按Ctrl+F5或者使用菜單Debug->Start/Stop Debug Session即可進(jìn)入調(diào)試狀態(tài)。進(jìn)入調(diào)試狀態(tài)后,界面與編輯狀態(tài)相比有明顯的變化,Debug才單項(xiàng)中原來(lái)不能用的命令現(xiàn)在已經(jīng)可以使用了,工具欄會(huì)多出一個(gè)用于運(yùn)行和調(diào)試的工具欄,如下圖所示,Debug菜單上的大部分命令可以在此找到對(duì)應(yīng)的快捷按鈕。

          常用的Debug菜單命令如下所示:
          ? Start/Stop Debug Session:開(kāi)始或者停止調(diào)試。
          ? Run:一直執(zhí)行下一個(gè)活動(dòng)的斷點(diǎn)。
          ? Step:?jiǎn)尾綀?zhí)行。
          ? Step Over:過(guò)程單步執(zhí)行,即將一個(gè)函數(shù)作為一個(gè)語(yǔ)句來(lái)執(zhí)行。
          ? Step out of current Function:跳出當(dāng)前的函數(shù)。
          ? Run to Cursor line:執(zhí)行到光標(biāo)所在的行。
          ? Stop Running:停止運(yùn)行。
          ? Breakpoints:打開(kāi)斷點(diǎn)對(duì)話框。
          ? Insert/Remove Breakpoint:在當(dāng)前行插入/刪除一個(gè)斷點(diǎn)。
          ? Enable/Disable Breakpoint:激活當(dāng)前行的斷點(diǎn)或者使斷點(diǎn)無(wú)效。
          ? Disable All Breakpoints:使程序中所有的斷點(diǎn)都無(wú)效。
          ? Kill all Breakpoints:刪除程序中所有的斷點(diǎn)。

          學(xué)習(xí)程序調(diào)試,必須明確兩個(gè)重要的概念,即單步執(zhí)行與全速執(zhí)行。全速執(zhí)行是指一行程序執(zhí)行完了以后緊接著執(zhí)行下一行程序,中間不停止,這樣程序執(zhí)行的速度就很快,并可以看到該段程序執(zhí)行的總體效果,即最終結(jié)果正確還是錯(cuò)誤,但如果程序有錯(cuò),則難以確認(rèn)錯(cuò)誤出現(xiàn)在哪些程序行。單步執(zhí)行是每次執(zhí)行一行程序,執(zhí)行完該行程序執(zhí)行完以后即停止,等待命令執(zhí)行下一行程序,此時(shí)我們可以觀察該行程序執(zhí)行完以后得到的結(jié)果,是否與我們寫(xiě)程序行所想要得的結(jié)果相同,借此可以找到程序中問(wèn)題所在。程序調(diào)試中,這兩種運(yùn)行方式都要用到,要靈活應(yīng)用,可以大大提高調(diào)試效率。
          在調(diào)試窗口中,我們可以看到一個(gè)黃色的調(diào)試箭頭,指向了當(dāng)前執(zhí)行到的程序行。

          5.1.5.2 斷點(diǎn)設(shè)置
          程序調(diào)試時(shí),有些程序行往往很難確認(rèn)什么時(shí)候能夠執(zhí)行到,這類(lèi)問(wèn)題就不適合單步調(diào)試,這是我們需要使用程序調(diào)試中另一種非常重要的方法——斷點(diǎn)設(shè)置。斷點(diǎn)設(shè)置的方法有多種,常用的是在某一程序行設(shè)置斷點(diǎn),設(shè)置好斷點(diǎn)之后可以全速運(yùn)行程序,一旦執(zhí)行到該程序行即停止,可在此觀察有關(guān)的變量值,以確定問(wèn)題所在。設(shè)置斷點(diǎn)的命令請(qǐng)參考上一節(jié)常用調(diào)試命令介紹。一旦某一行被設(shè)置了斷點(diǎn),我們可以在程序行的左端看到一個(gè)紅色方框(如圖5.24調(diào)試窗口圖所示),如果該斷點(diǎn)被禁用,方框?qū)?huì)變?yōu)榘咨?br />除了在某程序行設(shè)置斷點(diǎn)這一基本方法以外,uVision3還提供了多種設(shè)置斷點(diǎn)的方法,按Debug->Breakpoints,即出現(xiàn)一個(gè)對(duì)話框,該對(duì)話框用于對(duì)斷點(diǎn)進(jìn)行詳細(xì)的設(shè)置,如下圖所示。

          圖5.26中的Expression后的編輯框用于輸入表達(dá)式,該表達(dá)式用于確定程序停止運(yùn)行的條件,功能強(qiáng)大,涉及到uVision3內(nèi)置的一套調(diào)試算法,這里不做詳細(xì)說(shuō)明,請(qǐng)查閱相關(guān)幫助文檔。

          5.1.5.3 調(diào)試窗口
          前面講了調(diào)試的一些方法,里面多次提到檢查程序的執(zhí)行狀態(tài)。調(diào)試窗口就是用于查看程序執(zhí)行狀態(tài)的。uVision3提供了多種調(diào)試窗口,如寄存器窗口,存儲(chǔ)器窗口,反匯編窗口,外設(shè)窗口等,下面將會(huì)一一作介紹。

          1. 寄存器窗口
          圖5.26是工程窗口寄存器頁(yè)的內(nèi)容,寄存器頁(yè)包含了當(dāng)前所有的工作寄存器和系統(tǒng)寄存器,每當(dāng)程序中執(zhí)行到對(duì)某個(gè)寄存器的操作時(shí),該寄存器會(huì)反色顯示,用鼠標(biāo)單擊然后按F2(鼠標(biāo)連續(xù)單擊兩次),即可修改該值。
          2. 存儲(chǔ)器窗口
          存儲(chǔ)器窗口可以顯示系統(tǒng)中各種內(nèi)存中的值,通過(guò)在Address后的編輯框中輸入“字母:數(shù)字”即可顯示相應(yīng)內(nèi)存值,其中字母C、D、I、X,分別代表代碼存儲(chǔ)空間、直接尋址的片內(nèi)存儲(chǔ)空間、間接尋址的片內(nèi)存儲(chǔ)空間、擴(kuò)展的外部RAM單元值、鍵入C:0即可顯示從0開(kāi)始的ROM單元中的值,即查看程序的二進(jìn)制代碼。該窗口的顯示值可以以各種形式顯示,如十進(jìn)制、十六進(jìn)制、字符型等。改變顯示方式的方法是點(diǎn)鼠標(biāo)右鍵,在彈出的快捷菜單中選擇。除了顯示,還可以修改內(nèi)存中的值,如下圖所示。

          3. 查看和調(diào)用棧窗口
          這個(gè)窗口可以幫助我們查看當(dāng)前調(diào)用樹(shù)的情況,我們還可以通過(guò)這個(gè)窗口查看和修改一些變量的值。鼠標(biāo)停留在某個(gè)變量的時(shí)候點(diǎn)右鍵,在彈出的浮動(dòng)菜單中選擇Add ***to Watch window,Local 窗口顯示當(dāng)前一些局部變量的值,變量值的現(xiàn)實(shí)方式可以在十六進(jìn)制和十進(jìn)制之間切換,方式是在查看窗口點(diǎn)右鍵,在某個(gè)變量的Value欄用鼠標(biāo)單擊然后按F2(鼠標(biāo)連續(xù)單擊兩次),即可修改該值。如下圖所示。

          4. 反匯編窗口
          點(diǎn)擊View->Dissambly Window可以打開(kāi)反匯編窗口,該窗口可以顯示反匯編后的代碼、源代碼和相應(yīng)反匯編代碼的混合代碼,可以在該窗口進(jìn)行在線匯編、利用該窗口跟蹤已找行的代碼、在該窗口按匯編代碼的方式單步執(zhí)行。點(diǎn)擊鼠標(biāo)右鍵,出現(xiàn)快捷菜單,如圖5.29所示,其中Mixed Mode是以混合方式顯示,Assembly Mode是以返回編碼方式顯示。

          5. 外設(shè)窗口
          為了能夠比較直觀地了解單片機(jī)中各種外設(shè)的使用情況,uVison3提供了一個(gè)外圍接口對(duì)話框。通過(guò)Peripherals菜單,下拉菜單中的內(nèi)容和你選擇的芯片有關(guān),會(huì)列出你所選擇的芯片上所有的外設(shè)。選擇一項(xiàng)你可以進(jìn)入查看或修改該外設(shè)的一些狀態(tài)。例如在這里我們是通過(guò)GPIO中的PB9來(lái)控制LED閃爍,我們可以打開(kāi)GPIOB的狀態(tài)對(duì)換框,如圖5.30所示。

          現(xiàn)在我們可以調(diào)試我們的HelloWorld了。程序運(yùn)行時(shí),你將看到開(kāi)發(fā)板上的L1不停閃爍。



          關(guān)鍵詞: STM32系列微控制器kei

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();