您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
熟悉Keil C 51的朋友對于Keil MDK上手應該比較容易,畢竟界面是很像的。但ARM內(nèi)核畢竟不同于51內(nèi)核,因此無論在設置上還是在編程思想上,都需要下番功夫研究的。本文以MDK V4.03為例,詳細的寫一下MDK的設置、界面、工具?赡軙行╇s亂,但我想所涉及的東西都是最常用的;可能不是那么的嚴謹清晰,我想誰也沒把我期望成專家!哈,有問題歡迎留言。正式開始。
首先啟動MDK.當然要先安裝好MDK,如果找不到在哪里下載,可以翻翻我以前的博文。啟動后的MDK界面如圖1所示。
圖1 MDK界面
第二.新建一個工程。
單擊Project ->New µVision Project...菜單項,µVision 4將打開一個標準對話框,見圖2,輸入希望新建工程的名字即可創(chuàng)建一個新的工程,建議對每個新建工程使用獨立的文件夾。例如,這里先建立一個新的文件夾,然后選擇這個文件夾作為新建工程的目錄,輸入新建工程的名字Project1,µVision將會創(chuàng)建一個以Project1.uvproj2為名字的新工程文件,它包含了一個缺省的目標(target)和文件組名。這些內(nèi)容在Project Workspace->Files中可以看到。
第三.選擇設備
在創(chuàng)建一個新的工程時,µVision要求為這個工程選擇一款CPU。選擇設備對話框顯示了µVision的設備數(shù)據(jù)庫,只需要選擇用戶所需的微控制器即可。例如,選擇 Philips LPC2114微控制器,這個選擇設置了LPC2114設備的必要工具選項、簡化了工具的配置。
注意:
無語了,一個鐘頭寫的東西上傳之后竟然丟失了一大段。吐血中,繼續(xù)寫。
到這里一個工程就新建完成,下面就需要編寫代碼,然后設置目標配置,編譯調(diào)試等等。在這之前,我們先來了解一下MDK編譯器的常用工具按鈕,工欲善其事,必先利其器!
1.編譯快捷按鈕:
(1)編譯當前文件
(2)編譯已經(jīng)修改的文件(僅編譯已修改的文件,這樣可以節(jié)省編譯時間)
(3)編譯所有文件(一般使用這個即可,當設置過目標配置選項后,必須使用它來重新編譯。)
(4)停止編譯當前文件
2.程序下載快捷按鈕:
具體使用參見我的博文:http://blog.csdn.net/zhzht19861011/archive/2010/10/06/5924218.aspx
3.查找快捷按鈕:
(1)在文件中查找。這是我最常用的查找方式,特別是有多個模塊時,當你要找到一個函數(shù)或變量是在那個文件中定義的,就可以單擊這個圖標來在全工程文件中查找。
(2)在當前文件中查找。在編輯框中輸入要查找的關鍵字,按回車即可查到,連續(xù)按回車會跳到下一處。
(3)在當前文件中查找。單擊后會彈出查找對話框,能進行一些設置,比如大小寫區(qū)分等。
4.設置書簽快捷按鈕: (從左向右依次為標簽1、2、3、4)
這個功能還是很實用的,想象一下,當你的一個文件有很多代碼的時候,尋找你需要的代碼行就變得很不容易,這個時候,設置書簽快捷鍵就派上了用場!
(1)設置書簽。將鼠標定位到要標記的代碼行,單擊該圖標則在代碼行的左側(cè)設下一個書簽,再次單擊該按鈕,取消該代碼行的書簽。
(2)跳到上一書簽。
(3)跳到下一書簽。
(4)取消所有書簽
5.調(diào)試快捷按鈕:
(1)點擊此按鈕進入調(diào)試界面
(2)設置斷電。單擊要設計斷電的代碼行,再單擊此按鈕,則為該代碼行設置了斷點,再次單擊,取消所設的斷點。通常設置斷點是在debug窗口的要設斷點代碼處雙擊,再次雙擊取消設置斷點。
(3)使能/禁止斷點。將鼠標定位到一個已經(jīng)設置了斷點的代碼行處,單擊此按鈕,該斷點被禁止,再次單擊該按鈕,斷點使能。
(4)使能/禁止所有斷點。
(5)取消所有斷點。
6.工程視圖和配置快捷按鈕:
(1)工程視圖快捷按鈕。這相當于一個下拉菜單,里面有絕大多說的工程窗口。這個按鈕用來顯示/禁止工程內(nèi)的窗口。比如常常會有人把工程空間窗口或者編譯輸出窗口不小心關掉卻又不能把它再顯示出來,這個時候就可以通過單擊這個快捷按鈕的相應內(nèi)容來顯示。另外,該按鈕實現(xiàn)的功能都可以在菜單view 中設置。
(2)配置快捷按鈕。點擊一下出現(xiàn)圖4所示的界面:
圖4
(1)編輯選項卡。用來設置一些編輯信息,比如縮進的設置,顯示行號設置,界面顯示效果等等。
(2)設置代碼、關鍵的顏色和字體。如果默認的關鍵字顏色,代碼顏色,代碼字體、大小不符合你的習慣,可以在這里進行更該,在這里還可以更改用戶自定義關鍵字。
(3)設置用戶關鍵字。非常非常好用的一個功能,它可以使你自己定義的關鍵字像系統(tǒng)關鍵字一樣高亮顯示。假如你有想寫一個移植性比較高的程序,通常一些和編譯器無關的變量類型需要這樣定義:
typedef unsigned char uint8; /* 無符號8位整型變量 */
typedef signed char int8; /* 有符號8位整型變量 */
typedef unsigned short uint16; /* 無符號16位整型變量 */
然后在其它模塊中都是這樣定義一個無符號8位整形變量:
uint8 test; //定義變量
這樣有一個什么問題呢?就是uint8這個雖然是用戶定義的關鍵字,但是它并不能像系統(tǒng)關鍵字那樣高亮顯示。怎么辦呢?完全有辦法解決,而且就是在這個標簽卡中就可完成。方法如下:
a.打開User Keywords標簽卡。在左側(cè)窗口選擇文件類型,比如ARM:Editor C File;在右側(cè)窗口點擊 按鈕,新建一個用戶關鍵字編輯框,輸入用戶定義的關鍵字,比如uint8,這樣在程序代碼中,所有的uint8都會高亮顯示。
(4)設置快捷鍵。這個我沒有用過,所以不多說明。
(5)模板代碼。這又是一個比較實用的功能,模板既有軟件自帶的,也可以自己編輯模板?梢栽谀銜鴮懗绦虻臅r候使用這一功能加快代碼的輸入。使用方法:
a.先在該選項卡中編輯自己的代碼模板,也可以之用軟件自帶的模板。
b.使用上面6-(1)所說的工程視圖快捷按鈕,保證該按鈕下拉菜單中Templates被選中;選中后會在工程工作空間(Project WorkSpace)中出現(xiàn): 標簽。
c.在編寫代碼時,應用即可。
7.目標工具選項(Target Options …):
這個是最常用而且最重要的快捷按鈕和設置點。這里以LPC2114為例詳細做講述,其它CPU與之類似。
µVision可以設置目標硬件的選項。通過上面的工具欄按鈕或Project - Options for Target菜單項打開Options for Target對話框,如圖5所示。在Target頁中設置目標硬件及所選CPU片上組件的參數(shù)。
(1)設備選項卡(device )。
圖5
在這里可以在圖中2區(qū)域更改所使用的CPU,圖中3區(qū)域是該cpu 的一些描述。
(2)硬件目標設置選項卡(Target),見圖6所示。
圖6
1:選擇硬件目標設置選項卡
2:指定用于的晶振頻率
3:在應用中可以選擇實時操作系統(tǒng)(RTOS)。Keil 提供:
4:指定選擇 ARM 或者 Thumb 模式進行代碼生成。
5:利用 Cross-Module優(yōu)化為全局代碼優(yōu)化創(chuàng)建一個鏈接反饋文件。
6:使用MicroLib庫。為進一步改進基于ARM處理器的應用代碼密度,RealView MDK采用了新型microlib C庫(用于C的ISO標準運行時庫的一個子集),并將其代碼鏡像降低最小以滿足微控制器應用的需求。Microlib C庫可將運行時庫代碼大大降低。
7:選擇大端模式。編譯器默認都是小端模式,NXP的LPC2114處理器只支持小端模式,所以該項變成了灰色。三星的S3C2440既支持大端也支持小端,這樣的處理器該項就可以選擇了。
8:利用交叉模塊優(yōu)化創(chuàng)建一個鏈接反饋文件以實現(xiàn)全局代碼優(yōu)化。
11:片外ROM設置,最多支持3塊ROM(Flash),在Start一欄輸入起始地址,在Size一欄輸入大小。若是有多片片外ROM,需要在13區(qū)域設置一個作為啟動存儲塊,程序從該塊啟動;有幾塊ROM需要選中對應的9區(qū)域。
12:片內(nèi)ROM設置。設置方法同片外ROM,只是程序的存儲區(qū)在芯片內(nèi)集成。
17:片外RAM設置;就釸OM,只是若選中19、20區(qū)域后,對應的RAM不會被默認初始化為0。
18:片內(nèi)RAM設置。設置方法與片外RAM相同,只是數(shù)據(jù)的存儲區(qū)域在芯片內(nèi)集成。
(3)輸出選項卡(Output),見圖7所示。
圖7
1:選擇輸出選項卡
2:指定輸出文件的文件夾,這樣做可以減少工程文件夾文件的數(shù)目。
3.可執(zhí)行文件的名字。可執(zhí)行文件指生成的.hex文件,因此應先使能4區(qū)域。
4:使能后會產(chǎn)生可執(zhí)行文件。
5.創(chuàng)建批文件
6.生成庫文件
(4)列表選項卡(Listing),見圖8。
圖8
1:選擇列表選項卡
2: 指定輸出文件的文件夾,這樣做可以減少工程文件夾文件的數(shù)目。
3:設置生成/禁止一些.lst、.txt文件。
4.設置生成/禁止一些.map文件(生成的代碼詳細信息就在這個文件里)
(5)用戶程序選項卡(User),見圖9。
圖9
1:選擇用戶選項卡。
2:編輯源文件前運行用戶程序。
3:編譯前運行用戶程序。
4:編譯后運行用戶程序。圖中所示的是運行fromelf.exe程序生成.bin文件,詳細方法見博客:http://blog.csdn.net/yx_l128125/article/details/9145695
(6)C/C++選項卡,見圖10。
圖10
1:選擇C/C++選項卡。
2:定義預處理符號。假如有一段代碼使用了條件編譯,如下所示:
#if ABC
void delay_tus(uint32 dly)
{
uint8 i;
for (; dly>0; dly--)
for (i=0; i<4; i++);
}
#endif
如果你想讓編譯器編譯這段代碼,有兩種方法:
第一種方法:使用#define ABC
第二種方法:在圖中2區(qū)域所示的編輯框中輸入ABC。多個符號用逗號隔開。
3:使能/禁止ARM狀態(tài)與Thumb狀態(tài)交互。為了更好的優(yōu)化存儲空間,請使能該選項。
4:設置優(yōu)化級別,共4級。Level 0為不優(yōu)化,Level 3為最高級別優(yōu)化。一般選擇default ,即Level 2級優(yōu)化。
5:附加的優(yōu)化選項。
6:輸出警告信息設置。為了更好的檢查程序,設置成All即可。
7:頭文件路徑設置。
(7)Asm選項卡,見圖11。與C/C++選項卡。
圖11
該選項卡與C/C++選項卡十分類似。這里重點說說圖中紅色區(qū)域條件匯編控制符號的應用,因為這個在啟動代碼中可能會用到的。
摘錄一段啟動代碼:
IF :DEF:EXTERNAL_MODE
LDR R0, =PINSEL2
LDR R1, =PINSEL2_Val
STR R1, [R0]
ENDIF
在這段代碼中,如果在圖中1區(qū)域的編輯框中輸入了符號:EXTERNAL_MODE,則本段代碼被編譯。
(8)連接選項卡(Linker)
對于不是特別大或者特殊的程序,選項卡的內(nèi)容默認即可,編譯器會自動按照你的設置生成連接選項。
(9)調(diào)試選項卡(Debug),見圖12。
圖12
1:打開調(diào)試選項卡。
2:使用軟件仿真。
3:使用硬件仿真。(使用H-JTAG仿真參見我的博客:http://blog.csdn.net/zhzht19861011/archive/2010/08/28/5846510.aspx或者使用L-LINK仿真參見我的博客:http://blog.csdn.net/zhzht19861011/archive/2010/10/06/5924218.aspx)
4,5:選中后,點擊調(diào)試按鈕自動運行到main函數(shù)。
要去睡覺了,明天是周末,爭取把它寫完。
(10)工具選項卡(Utilities),見圖13。
圖13
1:點擊進入工具選項卡。
2.配置Flsah下載按鈕(即: )
使用J-LINK下載詳情見我的博文:http://blog.csdn.net/zhzht19861011/archive/2010/10/06/5924218.aspx
8.維護工程組件、配置工具環(huán)境及管理書:
點擊該快捷按鈕。彈出圖14所示界面。
(1)工程組建選項卡(Project Components)。
圖14
1:點擊進入工程組建選項卡.
2:工程目標組建。
3:添加/刪除文件組。重點講述一下這個,應用比較多。使用New (Insert)按鈕(圖3區(qū)域紅色劃線處)可在目標工程中設置文件組,方便文件歸類,圖中創(chuàng)建了兩個文件組:H-File和User。在工程工作空間中,新建的文件組會體現(xiàn)出來,如下圖15所示:
4:該區(qū)域頁面會列出用戶工程的文件組織結構。用戶可以通過用鼠標拖拉的方式來重新組織工程的源文件。
好啦,快捷按鈕終于告一段落!下面開始創(chuàng)建源文件,不過我先去玩一下。哎呀,我的周末,我來啦!
回來繼續(xù),其實就去吃個飯,昨晚舍友們胡扯,很晚才睡覺。今天早晨,呃~應該是今天上午起床就晚了點,然后打開電腦不一會的時間就到該吃飯的時間。
第四。創(chuàng)建源文件。
選擇菜單選項File – New以創(chuàng)建一個新的源文件,選項會打開一個空的編輯窗口,用戶可以在此窗口里輸入源代碼。如果以擴展名*.C保存文件,µVision4將以彩亮字體顯示C源代碼。至于代碼,還是用一個適合軟件仿真的吧(不需要硬件就能全部模擬仿真),這個程序主要使用了定時器0并定時1S鐘,然后在中斷服務程序中翻轉(zhuǎn)I/O口P0.17的電平。如下所示:(本示例保存文件為MAIN.C)
其中,cpu.h為自定義頭文件,內(nèi)容如下:(保存為cpu.h)
- /*
- ********************************Copyright (c)******************************
- ** File name: main.c
- ** Last modified Date: 2010-09-26
- ** Last Version: 1.0
- ** By: 瓶蓋
- **
- ****************************************************************************
- */
- #include <LPC21xx.H>
- #include "cpu.h"
- #define BEEPCON (1<<17) /* P0.17引腳控制B1,低電平蜂鳴 */
- /****************************************************************************
- * 名稱:IRQ_Time0()
- * 功能:定時器0中斷服務程序,取反BEEPCON控制口。
- * 入口參數(shù):無
- * 出口參數(shù):無
- ****************************************************************************/
- void __irq IRQ_Time0(void)
- {
- if( (IO0SET&BEEPCON) == 0 ) //使I/O口P0.17每隔1秒翻轉(zhuǎn)一次
- IO0SET = BEEPCON;
- else
- IO0CLR = BEEPCON;
- T0IR = 0x01; // 清除中斷標志
- VICVectAddr = 0x00; // 通知VIC中斷處理結束
- }
- /*
- **************************************************************************
- * 名稱:Time0Init()
- * 功能:初始化定時器0,定時時間為1S,并使能中斷。
- * 入口參數(shù):無
- * 出口參數(shù):無
- ***************************************************************************
- */
- void Time0Init(void)
- { /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
- Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
- */
- T0PR = 99; // 設置定時器0分頻為100分頻,得110592Hz
- T0MCR = 0x03; // 匹配通道0匹配中斷并復位T0TC
- T0MR0 = 110592; // 比較值(1S定時值)
- T0TCR = 0x03; // 啟動并復位T0TC
- T0TCR = 0x01;
- /* 設置定時器0中斷IRQ */
- VICIntSelect = 0x00; // 所有中斷通道設置為IRQ中斷
- VICVectCntl0 = 0x24; // 定時器0中斷通道分配最高優(yōu)先級(向量控制器0)
- VICVectAddr0 = (uint32)IRQ_Time0; // 設置中斷服務程序地址向量
- VICIntEnable = 0x00000010; // 使能定時器0中斷
- }
- */
- /**********************************************************************
- * 名稱:main()
- * 功能:初始化I/O及定時器,然后等待中斷。
- * 說明:在STARTUP.S文件中使能IRQ中斷(清零CPSR中的I位)。
- ************************************************************************
- */
- int main(void)
- { PINSEL0 = 0x00000000; // 設置管腳連接GPIO
- IO0DIR = BEEPCON; // 設置I/O為輸出
- IO0CLR=BEEPCON;
- Time0Init(); // 初始化定時器0及使能中斷
- while(1); // 等待定時器0中斷
- return(0);
- }
- /*************************************************************************
- ** End Of File
- *************************************************************************/
- /*
- ********************************Copyright (c)******************************
- ** File name: main.c
- ** Last modified Date: 2010-09-26
- ** Last Version: 1.0
- ** By: 瓶蓋
- **
- ****************************************************************************
- */
- #include <LPC21xx.H>
- #include "cpu.h"
- #define BEEPCON (1<<17) /* P0.17引腳控制B1,低電平蜂鳴 */
- /****************************************************************************
- * 名稱:IRQ_Time0()
- * 功能:定時器0中斷服務程序,取反BEEPCON控制口。
- * 入口參數(shù):無
- * 出口參數(shù):無
- ****************************************************************************/
- void __irq IRQ_Time0(void)
- {
- if( (IO0SET&BEEPCON) == 0 ) //使I/O口P0.17每隔1秒翻轉(zhuǎn)一次
- IO0SET = BEEPCON;
- else
- IO0CLR = BEEPCON;
- T0IR = 0x01; // 清除中斷標志
- VICVectAddr = 0x00; // 通知VIC中斷處理結束
- }
- /*
- **************************************************************************
- * 名稱:Time0Init()
- * 功能:初始化定時器0,定時時間為1S,并使能中斷。
- * 入口參數(shù):無
- * 出口參數(shù):無
- ***************************************************************************
- */
- void Time0Init(void)
- { /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
- Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
- */
- T0PR = 99; // 設置定時器0分頻為100分頻,得110592Hz
- T0MCR = 0x03; // 匹配通道0匹配中斷并復位T0TC
- T0MR0 = 110592; // 比較值(1S定時值)
- T0TCR = 0x03; // 啟動并復位T0TC
- T0TCR = 0x01;
- /* 設置定時器0中斷IRQ */
- VICIntSelect = 0x00; // 所有中斷通道設置為IRQ中斷
- VICVectCntl0 = 0x24; // 定時器0中斷通道分配最高優(yōu)先級(向量控制器0)
- VICVectAddr0 = (uint32)IRQ_Time0; // 設置中斷服務程序地址向量
- VICIntEnable = 0x00000010; // 使能定時器0中斷
- }
- */
- /**********************************************************************
- * 名稱:main()
- * 功能:初始化I/O及定時器,然后等待中斷。
- * 說明:在STARTUP.S文件中使能IRQ中斷(清零CPSR中的I位)。
- ************************************************************************
- */
- int main(void)
- { PINSEL0 = 0x00000000; // 設置管腳連接GPIO
- IO0DIR = BEEPCON; // 設置I/O為輸出
- IO0CLR=BEEPCON;
- Time0Init(); // 初始化定時器0及使能中斷
- while(1); // 等待定時器0中斷
- return(0);
- }
- /*************************************************************************
- ** End Of File
- *************************************************************************/
源文件創(chuàng)建完后,可以在工程里加入這個文件。在工程里加入源文件,µVision 3提供了幾種方式,例如:可以在Project Workspace – Files頁面選擇要加入的文件組,單擊鼠標右鍵打開局部菜單,選擇Add Files選項會打開一個標準的文件對話框,在對話框里選擇上面創(chuàng)建的MAIN.C源文件。
值得注意的是,大多數(shù)初學者會忘記這一步驟,假如在MDK中忘記加入文件,編譯器會給出錯誤提示,但在Keil C51(V8.02版)中就沒這么幸運了。在C51編譯器中,沒有添加文件編譯器僅有兩個警告,所以常常有寫人說:我明明都是按照課本上一個個字母敲進去的,怎么編譯不出可執(zhí)行文件。渴遣皇菚系拇a錯了?等等。想想我還在大學二年級的時候,也不止一次的遇到過類似情況 ,現(xiàn)在想起來,還真懷念當時的懵懂無知。
第六.設置目標工具選項
μVision 4 允許用戶根據(jù)目標硬件的實際情況對工程進行配置。通過點擊目標工具欄圖標()或單擊菜單項Project->Options for Target,在彈出的Target 頁面可指定目標硬件和所選擇設備片內(nèi)組件的相關參數(shù),下圖為本示例的相關設置。
CPU的啟動代碼 (ARM設備的啟動代碼文件名一般為Startup.S) 可在Project Workspace - Files Tab中打開。此外,μVision 4里大部分啟動代碼文件都對應有一個配置向?qū)?Configuration Wizard),它提供了一種菜單驅(qū)動方式來配置目標板的啟動代碼。關于啟動代碼詳情見我的博文:http://blog.csdn.net/zhzht19861011/archive/2010/08/27/5844514.aspx
本例的啟動代碼配置為見下圖:
第八.編譯工程( )
如果源程序中存在語法錯誤,μVision 則會在Output Window->Build 窗口中顯示出錯誤和警告信息。雙擊提示信息所在行,就會在μVision4編輯窗口里打開并顯示相應的出錯源文件,光標會定位在該文件的出錯行上,以方便用戶快速定位出錯位置。
另外關于部分警告和錯誤詳細信息可以參見:http://blog.csdn.net/zhzht19861011/archive/2010/08/19/5823537.aspx
終于告一段落!