天天看點

Keil MDK詳細講解

   熟悉Keil C 51的朋友對于Keil MDK上手應該比較容易,畢竟界面是很像的。但ARM核心畢竟不同于51核心,是以無論在設定上還是在程式設計思想上,都需要下番功夫研究的。本文以MDK V4.03為例,詳細的寫一下MDK的設定、界面、工具。可能會有些雜亂,但我想所涉及的東西都是最常用的;可能不是那麼的嚴謹清晰,我想誰也沒把我期望成專家!哈,有問題歡迎留言。正式開始。

    首先啟動MDK.當然要先安裝好MDK,如果找不到在哪裡下載下傳,可以翻翻我以前的博文。啟動後的MDK界面如圖1所示。

Keil MDK詳細講解

圖1 MDK界面

第二.建立一個工程。

單擊Project ->New µVision Project...菜單項,µVision 4将打開一個标準對話框,見圖2,輸入希望建立工程的名字即可建立一個新的工程,建議對每個建立工程使用獨立的檔案夾。例如,這裡先建立一個新的檔案夾,然後選擇這個檔案夾作為建立工程的目錄,輸入建立工程的名字Project1,µVision将會建立一個以Project1.uvproj2為名字的新工程檔案,它包含了一個預設的目标(target)和檔案組名。這些内容在Project Workspace->Files中可以看到。

第三.選擇裝置

在建立一個新的工程時,µVision要求為這個工程選擇一款CPU。選擇裝置對話框顯示了µVision的裝置資料庫,隻需要選擇使用者所需的微控制器即可。例如,選擇 Philips LPC2114微控制器,這個選擇設定了LPC2114裝置的必要工具選項、簡化了工具的配置。

注意:

  • 當建立一個新的工程時,µVision會自動為所選擇的CPU添加合适的啟動代碼。
  • 對于一些裝置而言,µVision需要使用者手動地輸入額外的參數。請仔細閱讀這個對話框右邊的資訊,因為它可能包含所選裝置的額外配置要求。

無語了,一個鐘頭寫的東西上傳之後竟然丢失了一大段。吐血中,繼續寫。

到這裡一個工程就建立完成,下面就需要編寫代碼,然後設定目标配置,編譯調試等等。在這之前,我們先來了解一下MDK編譯器的常用工具按鈕,工欲善其事,必先利其器!

1.編譯快捷按鈕:

Keil MDK詳細講解

(1)編譯目前檔案

(2)編譯已經修改的檔案(僅編譯已修改的檔案,這樣可以節省編譯時間)

(3)編譯所有檔案(一般使用這個即可,當設定過目标配置選項後,必須使用它來重新編譯。)

(4)停止編譯目前檔案

2.程式下載下傳快捷按鈕:

Keil MDK詳細講解

具體使用參見我的博文:https://blog.csdn.net/qq_38351824/article/details/82555406

3.查找快捷按鈕:

Keil MDK詳細講解

(1)在檔案中查找。這是我最常用的查找方式,特别是有多個子產品時,當你要找到一個函數或變量是在那個檔案中定義的,就可以單擊這個圖示來在全工程檔案中查找。

(2)在目前檔案中查找。在編輯框中輸入要查找的關鍵字,按回車即可查到,連續按回車會跳到下一處。

(3)在目前檔案中查找。單擊後會彈出查找對話框,能進行一些設定,比如大小寫區分等。

4.設定書簽快捷按鈕:

Keil MDK詳細講解

 (從左向右依次為标簽1、2、3、4)

這個功能還是很實用的,想象一下,當你的一個檔案有很多代碼的時候,尋找你需要的代碼行就變得很不容易,這個時候,設定書簽快捷鍵就派上了用場!

(1)設定書簽。将滑鼠定位到要标記的代碼行,單擊該圖示則在代碼行的左側設下一個書簽,再次單擊該按鈕,取消該代碼行的書簽。

(2)跳到上一書簽。

(3)跳到下一書簽。

(4)取消所有書簽

5.調試快捷按鈕:

Keil MDK詳細講解

(1)點選此按鈕進入調試界面

(2)設定斷電。單擊要設計斷電的代碼行,再單擊此按鈕,則為該代碼行設定了斷點,再次單擊,取消所設的斷點。通常設定斷點是在debug視窗的要設斷點代碼處輕按兩下,再次輕按兩下取消設定斷點。

(3)使能/禁止斷點。将滑鼠定位到一個已經設定了斷點的代碼行處,單擊此按鈕,該斷點被禁止,再次單擊該按鈕,斷點使能。

(4)使能/禁止所有斷點。

(5)取消所有斷點。

哎呀,有事要回去了,明天接着寫。

一晚上過去,繼續寫。

6.工程視圖和配置快捷按鈕:

Keil MDK詳細講解

(1)工程視圖快捷按鈕。這相當于一個下拉菜單,裡面有絕大多說的工程視窗。這個按鈕用來顯示/禁止工程内的視窗。比如常常會有人把工程空間視窗或者編譯輸出視窗不小心關掉卻又不能把它再顯示出來,這個時候就可以通過單擊這個快捷按鈕的相應内容來顯示。另外,該按鈕實作的功能都可以在菜單view 中設定。

(2)配置快捷按鈕。點選一下出現圖4所示的界面:

Keil MDK詳細講解

 圖4

(1)編輯頁籤。用來設定一些編輯資訊,比如縮進的設定,顯示行号設定,界面顯示效果等等。

(2)設定代碼、關鍵的顔色和字型。如果預設的關鍵字顔色,代碼顔色,代碼字型、大小不符合你的習慣,可以在這裡進行更該,在這裡還可以更改使用者自定義關鍵字。

(3)設定使用者關鍵字。非常非常好用的一個功能,它可以使你自己定義的關鍵字像系統關鍵字一樣高亮顯示。假如你有想寫一個移植性比較高的程式,通常一些和編譯器無關的變量類型需要這樣定義:

typedef unsigned char  uint8;                   

typedef signed   char  int8;                       

typedef unsigned short uint16;               

然後在其它子產品中都是這樣定義一個無符号8位整形變量:

uint8 test;     //定義變量

這樣有一個什麼問題呢?就是uint8這個雖然是使用者定義的關鍵字,但是它并不能像系統關鍵字那樣高亮顯示。怎麼辦呢?完全有辦法解決,而且就是在這個标簽卡中就可完成。方法如下:

a.打開User Keywords标簽卡。在左側視窗選擇檔案類型,比如ARM:Editor C File;在右側視窗點選

Keil MDK詳細講解

 按鈕,建立一個使用者關鍵字編輯框,輸入使用者定義的關鍵字,比如uint8,這樣在程式代碼中,所有的uint8都會高亮顯示。

(4)設定快捷鍵。這個我沒有用過,是以不多說明。

(5)模闆代碼。這又是一個比較實用的功能,模闆既有軟體自帶的,也可以自己編輯模闆。可以在你書寫程式的時候使用這一功能加快代碼的輸入。使用方法:

a.先在該頁籤中編輯自己的代碼模闆,也可以之用軟體自帶的模闆。

b.使用上面6-(1)所說的工程視圖快捷按鈕,保證該按鈕下拉菜單中Templates被選中;選中後會在工程工作空間(Project WorkSpace)中出現:

Keil MDK詳細講解

 标簽。

c.在編寫代碼時,應用即可。

7.目标工具選項(Target Options …):

Keil MDK詳細講解

這個是最常用而且最重要的快捷按鈕和設定點。這裡以LPC2114為例詳細做講述,其它CPU與之類似。

µVision可以設定目标硬體的選項。通過上面的工具欄按鈕或Project - Options for Target菜單項打開Options for Target對話框,如圖5所示。在Target頁中設定目标硬體及所選CPU片上元件的參數。

(1)裝置頁籤(device )。

Keil MDK詳細講解

 圖5

在這裡可以在圖中2區域更改所使用的CPU,圖中3區域是該cpu 的一些描述。

(2)硬體目标設定頁籤(Target),見圖6所示。

Keil MDK詳細講解

圖6

1:選擇硬體目标設定頁籤

2:指定用于的晶振頻率

3:在應用中可以選擇實時作業系統(RTOS)。Keil 提供:

  • RTX Kernel: 它是一個非常有效的 RTOS,支援搶占式的任務排程、 消息和信号傳送、信号量等等。 完整的版本帶有源代碼和包含一個Flash檔案系統和TCP/IP協定棧。

4:指定選擇 ARM 或者 Thumb 模式進行代碼生成。

5:利用 Cross-Module優化為全局代碼優化建立一個連結回報檔案。

6:使用MicroLib庫。為進一步改進基于ARM處理器的應用代碼密度,RealView MDK采用了新型microlib C庫(用于C的ISO标準運作時庫的一個子集),并将其代碼鏡像降低最小以滿足微控制器應用的需求。Microlib C庫可将運作時庫代碼大大降低。

7:選擇大端模式。編譯器預設都是小端模式,NXP的LPC2114處理器隻支援小端模式,是以該項變成了灰色。三星的S3C2440既支援大端也支援小端,這樣的處理器該項就可以選擇了。

8:利用交叉子產品優化建立一個連結回報檔案以實作全局代碼優化。

11:片外ROM設定,最多支援3塊ROM(Flash),在Start一欄輸入起始位址,在Size一欄輸入大小。若是有多片片外ROM,需要在13區域設定一個作為啟動存儲塊,程式從該塊啟動;有幾塊ROM需要選中對應的9區域。

12:片内ROM設定。設定方法同片外ROM,隻是程式的存儲區在晶片内內建。

17:片外RAM設定。基本同片外ROM,隻是若選中19、20區域後,對應的RAM不會被預設初始化為0。

18:片内RAM設定。設定方法與片外RAM相同,隻是資料的存儲區域在晶片内內建。

(3)輸出頁籤(Output),見圖7所示。

Keil MDK詳細講解

圖7

1:選擇輸出頁籤

2:指定輸出檔案的檔案夾,這樣做可以減少工程檔案夾檔案的數目。

3.可執行檔案的名字。可執行檔案指生成的.hex檔案,是以應先使能4區域。

4:使能後會産生可執行檔案。

5.建立批檔案

6.生成庫檔案

(4)清單頁籤(Listing),見圖8。

Keil MDK詳細講解

圖8

1:選擇清單頁籤

2: 指定輸出檔案的檔案夾,這樣做可以減少工程檔案夾檔案的數目。

3:設定生成/禁止一些.lst、.txt檔案。

4.設定生成/禁止一些.map檔案(生成的代碼詳細資訊就在這個檔案裡)

(5)使用者程式頁籤(User),見圖9。

Keil MDK詳細講解

圖9

1:選擇使用者頁籤。

2:編輯源檔案前運作使用者程式。

3:編譯前運作使用者程式。

4:編譯後運作使用者程式。圖中所示的是運作fromelf.exe程式生成.bin檔案,詳細方法見部落格:https://blog.csdn.net/qq_38351824/article/details/82555443

(6)C/C++頁籤,見圖10。

Keil MDK詳細講解

圖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區域所示的編輯框中輸入ABC。多個符号用逗号隔開。

3:使能/禁止ARM狀态與Thumb狀态互動。為了更好的優化存儲空間,請使能該選項。

4:設定優化級别,共4級。Level 0為不優化,Level 3為最進階别優化。一般選擇default ,即Level 2級優化。

5:附加的優化選項。

6:輸出警告資訊設定。為了更好的檢查程式,設定成All即可。

7:頭檔案路徑設定。

(7)Asm頁籤,見圖11。與C/C++頁籤。

Keil MDK詳細講解

 圖11

該頁籤與C/C++頁籤十分類似。這裡重點說說圖中紅色區域條件彙編控制符号的應用,因為這個在啟動代碼中可能會用到的。

摘錄一段啟動代碼:

IF      :DEF:EXTERNAL_MODE 

               LDR     R0, =PINSEL2 

               LDR     R1, =PINSEL2_Val 

               STR     R1, [R0] 

ENDIF

在這段代碼中,如果在圖中1區域的編輯框中輸入了符号:EXTERNAL_MODE,則本段代碼被編譯。

(8)連接配接頁籤(Linker)

對于不是特别大或者特殊的程式,頁籤的内容預設即可,編譯器會自動按照你的設定生成連接配接選項。

(9)調試頁籤(Debug),見圖12。

Keil MDK詳細講解

 圖12

1:打開調試頁籤。

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:選中後,點選調試按鈕自動運作到main函數。

要去睡覺了,明天是周末,争取把它寫完。

(10)工具頁籤(Utilities),見圖13。

Keil MDK詳細講解

圖13

1:點選進入工具頁籤。

2.配置Flsah下載下傳按鈕(即:

Keil MDK詳細講解

 )

使用J-LINK下載下傳詳情見我的博文:https://blog.csdn.net/qq_38351824/article/details/82555406

8.維護工程元件、配置工具環境及管理書:

Keil MDK詳細講解

點選該快捷按鈕。彈出圖14所示界面。

(1)工程組建頁籤(Project Components)。

Keil MDK詳細講解

 圖14

1:點選進入工程組建頁籤.

2:工程目标組建。

3:添加/删除檔案組。重點講述一下這個,應用比較多。使用New (Insert)按鈕(圖3區域紅色劃線處)可在目标工程中設定檔案組,友善檔案歸類,圖中建立了兩個檔案組:H-File和User。在工程工作空間中,建立的檔案組會展現出來,如下圖15所示:

Keil MDK詳細講解

4:該區域頁面會列出使用者工程的檔案組織結構。使用者可以通過用滑鼠拖拉的方式來重新組織工程的源檔案。

好啦,快捷按鈕終于告一段落!下面開始建立源檔案,不過我先去玩一下。哎呀,我的周末,我來啦!

回來繼續,其實就去吃個飯,昨晚舍友們胡扯,很晚才睡覺。今天早晨,呃~應該是今天上午起床就晚了點,然後打開電腦不一會的時間就到該吃飯的時間。

第四。建立源檔案。

選擇菜單選項File – New以建立一個新的源檔案,選項會打開一個空的編輯視窗,使用者可以在此視窗裡輸入源代碼。如果以擴充名*.C儲存檔案,µVision4将以彩亮字型顯示C源代碼。至于代碼,還是用一個适合軟體仿真的吧(不需要硬體就能全部模拟仿真),這個程式主要使用了定時器0并定時1S鐘,然後在中斷服務程式中翻轉I/O口P0.17的電平。如下所示:(本示例儲存檔案為MAIN.C)

其中,cpu.h為自定義頭檔案,内容如下:(儲存為cpu.h)

[cpp]  view plain copy

  1. #include <LPC21xx.H>   
  2. #include "cpu.h"   
  3. #define   BEEPCON  (1<<17)          
  4. void __irq  IRQ_Time0(void)  
  5. {    
  6.     if( (IO0SET&BEEPCON) == 0 )     //使I/O口P0.17每隔1秒翻轉一次  
  7.         IO0SET = BEEPCON;     
  8.     else    
  9.         IO0CLR = BEEPCON;                           
  10.    T0IR = 0x01;                 // 清除中斷标志   
  11.    VICVectAddr = 0x00;               // 通知VIC中斷處理結束  
  12. }  
  13. void  Time0Init(void)  
  14. {     
  15.     T0PR = 99;                // 設定定時器0分頻為100分頻,得110592Hz  
  16.     T0MCR = 0x03;            // 比對通道0比對中斷并複位T0TC  
  17.     T0MR0 = 110592;              // 比較值(1S定時值)  
  18.     T0TCR = 0x03;            // 啟動并複位T0TC   
  19.     T0TCR = 0x01;   
  20.     VICIntSelect = 0x00;        // 所有中斷通道設定為IRQ中斷  
  21.     VICVectCntl0 = 0x24;    // 定時器0中斷通道配置設定最高優先級(向量控制器0)  
  22.     VICVectAddr0 = (uint32)IRQ_Time0;   // 設定中斷服務程式位址向量   
  23.     VICIntEnable = 0x00000010;           // 使能定時器0中斷  
  24. }  
  25. */  
  26. int  main(void)  
  27. {  PINSEL0 = 0x00000000;            // 設定管腳連接配接GPIO     
  28.    IO0DIR = BEEPCON;            // 設定I/O為輸出  
  29.    IO0CLR=BEEPCON;  
  30.    Time0Init();             // 初始化定時器0及使能中斷  
  31.    while(1);                // 等待定時器0中斷  
  32.    return(0);  
  33. }  
  1. #include <LPC21xx.H>

  2. #include "cpu.h"

  3. #define BEEPCON (1<<17)

  4. void __irq IRQ_Time0(void)

  5. {

  6. if( (IO0SET&BEEPCON) == 0 ) //使I/O口P0.17每隔1秒翻轉一次

  7. IO0SET = BEEPCON;

  8. else

  9. IO0CLR = BEEPCON;

  10. T0IR = 0x01; // 清除中斷标志

  11. VICVectAddr = 0x00; // 通知VIC中斷處理結束

  12. }

  13. void Time0Init(void)

  14. {

  15. T0PR = 99; // 設定定時器0分頻為100分頻,得110592Hz

  16. T0MCR = 0x03; // 比對通道0比對中斷并複位T0TC

  17. T0MR0 = 110592; // 比較值(1S定時值)

  18. T0TCR = 0x03; // 啟動并複位T0TC

  19. T0TCR = 0x01;

  20. VICIntSelect = 0x00; // 所有中斷通道設定為IRQ中斷

  21. VICVectCntl0 = 0x24; // 定時器0中斷通道配置設定最高優先級(向量控制器0)

  22. VICVectAddr0 = (uint32)IRQ_Time0; // 設定中斷服務程式位址向量

  23. VICIntEnable = 0x00000010; // 使能定時器0中斷

  24. }

  25. */

  26. int main(void)

  27. { PINSEL0 = 0x00000000; // 設定管腳連接配接GPIO

  28. IO0DIR = BEEPCON; // 設定I/O為輸出

  29. IO0CLR=BEEPCON;

  30. Time0Init(); // 初始化定時器0及使能中斷

  31. while(1); // 等待定時器0中斷

  32. return(0);

  33. }

[cpp] view plaincopy

  1. #ifndef __CPU_H   
  2. #define __CPU_H   
  3. typedef unsigned char  uint8;                     
  4. typedef signed   char  int8;                      
  5. typedef unsigned short uint16;                    
  6. typedef signed   short int16;                     
  7. typedef unsigned int   uint32;                    
  8. typedef signed   int   int32;                     
  9. typedef float          fp32;                      
  10. typedef double         fp64;                      
  11. #define TEST_CODE   //正式下載下傳時屏蔽掉該句,防止有測試代碼帶入正式程式  
  1. #ifndef __CPU_H

  2. #define __CPU_H

  3. typedef unsigned char uint8;

  4. typedef signed char int8;

  5. typedef unsigned short uint16;

  6. typedef signed short int16;

  7. typedef unsigned int uint32;

  8. typedef signed int int32;

  9. typedef float fp32;

  10. typedef double fp64;

  11. #define TEST_CODE //正式下載下傳時屏蔽掉該句,防止有測試代碼帶入正式程式

第五.在工程裡加入源檔案

源檔案建立完後,可以在工程裡加入這個檔案。在工程裡加入源檔案,µVision 3提供了幾種方式,例如:可以在Project Workspace – Files頁面選擇要加入的檔案組,單擊滑鼠右鍵打開局部菜單,選擇Add Files選項會打開一個标準的檔案對話框,在對話框裡選擇上面建立的MAIN.C源檔案。

Keil MDK詳細講解

     值得注意的是,大多數初學者會忘記這一步驟,假如在MDK中忘記加入檔案,編譯器會給出錯誤提示,但在Keil C51(V8.02版)中就沒這麼幸運了。在C51編譯器中,沒有添加檔案編譯器僅有兩個警告,是以常常有寫人說:我明明都是按照課本上一個個字母敲進去的,怎麼編譯不出可執行檔案啊?是不是書上的代碼錯了?等等。想想我還在大學二年級的時候,也不止一次的遇到過類似情況 ,現在想起來,還真懷念當時的懵懂無知。

第六.設定目标工具選項

       μVision 4 允許使用者根據目标硬體的實際情況對工程進行配置。通過點選目标工具欄圖示(

Keil MDK詳細講解

)或單擊菜單項Project->Options for Target,在彈出的Target 頁面可指定目标硬體和所選擇裝置片内元件的相關參數,下圖為本示例的相關設定。

Keil MDK詳細講解

       另外,如果需要生成Intel HEX 檔案,用于下載下傳到EPROM 程式設計器中或仿真器中。在Options for Target->Output中選擇Create HEX file 選項,μVision  4會在編譯過程中同時産生HEX 檔案。

第七.配置啟動代碼

CPU的啟動代碼 (ARM裝置的啟動代碼檔案名一般為Startup.S) 可在Project Workspace - Files Tab中打開。此外,μVision 4裡大部分啟動代碼檔案都對應有一個配置向導(Configuration Wizard),它提供了一種菜單驅動方式來配置目标闆的啟動代碼。關于啟動代碼詳情見我的博文:https://blog.csdn.net/qq_38351824/article/details/82555462

本例的啟動代碼配置為見下圖:

Keil MDK詳細講解

 第八.編譯工程(

Keil MDK詳細講解

 )

如果源程式中存在文法錯誤,μVision 則會在Output Window->Build 視窗中顯示出錯誤和警告資訊。輕按兩下提示資訊所在行,就會在μVision4編輯視窗裡打開并顯示相應的出錯源檔案,光标會定位在該檔案的出錯行上,以友善使用者快速定位出錯位置。

另外關于部分警告和錯誤詳細資訊可以參見我的博文:https://blog.csdn.net/qq_38351824/article/details/82555466