Keil MDK入门

熟悉Keil C 51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的。但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的。本文以MDK V4.03为例,详细的写一下MDK的设置、界面、工具。可能会有些杂乱,但我想所涉及的东西都是最常用的;可能不是那么的严谨清晰,我想谁也没把我期望成专家!哈,有问题欢迎留言。正式开始。

  首先启动MDK.当然要先安装好MDK,如果找不到在哪里下载,可以翻翻我以前的博文。启动后的MDK界面如图1所示。

图1 MDK界面

第二.新建一个工程。

单击Project ->New µVision Project...菜单项,µVision 4将打开一个标准对话框,见图2,输入希望新建工程的名字即可创建一个新的工程,建议对每个新建工程使用独立的文件夹。例如,这里先建立一个新的文件夹,然后选择这个文件夹作为新建工程的目录,输入新建工程的名字Project1,µVision将会创建一个以Project1.uvproj2为名字的新工程文件,它包含了一个缺省的目标(target)和文件组名。这些内容在Project Workspace->Files中可以看到。

图2

第三.选择设备

在创建一个新的工程时,µVision要求为这个工程选择一款CPU。选择设备对话框显示了µVision的设备数据库,只需要选择用户所需的微控制器即可。例如,选择 Philips LPC2114微控制器,这个选择设置了LPC2114设备的必要工具选项、简化了工具的配置。

图3

注意:

  • 当创建一个新的工程时,µVision会自动为所选择的CPU添加合适的启动代码。

  • 对于一些设备而言,µVision需要用户手动地输入额外的参数。请仔细阅读这个对话框右边的信息,因为它可能包含所选设备的额外配置要求。

MD的MSDN,一个钟头写的东西上传之后竟然丢失了一大段。

到这里一个工程就新建完成,下面就需要编写代码,然后设置目标配置,编译调试等等。在这之前,我们先来了解一下MDK编译器的常用工具按钮,工欲善其事,必先利其器!

1.编译快捷按钮:

(1)编译当前文件

(2)编译已经修改的文件(仅编译已修改的文件,这样可以节省编译时间)

(3)编译所有文件(一般使用这个即可,当设置过目标配置选项后,必须使用它来重新编译。)

(4)停止编译当前文件

2.程序下载快捷按钮:

具体使用参见我的博文:http://blog.csdn.net/zhzht19861011/archive/2010/10/06/5924218.aspx

3.查找快捷按钮:

(1)在文件中查找。这是我最常用的查找方式,特别是有多个模块时,当你要找到一个函数或变量是在那个文件中定义的,就可以单击这个图标来在全工程文件中查找。

(2)在当前文件中查找。在编辑框中输入要查找的关键字,按回车即可查到,连续按回车会跳到下一处。

(3)在当前文件中查找。单击后会弹出查找对话框,能进行一些设置,比如大小写区分等。

4.设置书签快捷按钮:

(从左向右依次为标签1、2、3、4)

这个功能还是很实用的,想象一下,当你的一个文件有很多代码的时候,寻找你需要的代码行就变得很不容易,这个时候,设置书签快捷键就派上了用场!

(1)设置书签。将鼠标定位到要标记的代码行,单击该图标则在代码行的左侧设下一个书签,再次单击该按钮,取消该代码行的书签。

(2)跳到上一书签。

(3)跳到下一书签。

(4)取消所有书签

5.调试快捷按钮:

(1)点击此按钮进入调试界面

(2)设置断电。单击要设计断电的代码行,再单击此按钮,则为该代码行设置了断点,再次单击,取消所设的断点。通常设置断点是在debug窗口的要设断点代码处双击,再次双击取消设置断点。

(3)使能/禁止断点。将鼠标定位到一个已经设置了断点的代码行处,单击此按钮,该断点被禁止,再次单击该按钮,断点使能。

(4)使能/禁止所有断点。

(5)取消所有断点。

有事要回去了,明天接着写。

一晚上过去,继续写。

6.工程视图和配置快捷按钮:

(1)工程视图快捷按钮。这相当于一个下拉菜单,里面有绝大多说的工程窗口。这个按钮用来显示/禁止工程内的窗口。比如常常会有人把工程空间窗口或者编译输出窗口不小心关掉却又不能把它再显示出来,这个时候就可以通过单击这个快捷按钮的相应内容来显示。另外,该按钮实现的功能都可以在菜单view 中设置。

(2)配置快捷按钮。点击一下出现图4所示的界面:

图4

(1)编辑选项卡。用来设置一些编辑信息,比如缩进的设置,显示行号设置,界面显示效果等等。

(2)设置代码、关键的颜色和字体。如果默认的关键字颜色,代码颜色,代码字体、大小不符合你的习惯,可以在这里进行更该,在这里还可以更改用户自定义关键字。

(3)设置用户关键字。非常非常好用的一个功能,它可以使你自己定义的关键字像系统关键字一样高亮显示。假如你有想写一个移植性比较高的程序,通常一些和编译器无关的变量类型需要这样定义:

typedef unsigned char  uint8;                  /*  无符号8位整型变量  */
typedef signed   char  int8;                      /* 有符号8位整型变量  */
typedef unsigned short uint16;                /* 无符号16位整型变量 */

然后在其它模块中都是这样定义一个无符号8位整形变量:

uint8 test;     //定义变量

这样有一个什么问题呢?就是uint8这个虽然是用户定义的关键字,但是它并不能像系统关键字那样高亮显示。怎么办呢?完全有办法解决,而且就是在这个标签卡中就可完成。方法如下:

a.打开User Keywords标签卡。在左侧窗口选择文件类型,比如ARM:Editor C File;在右侧窗口点击

按钮,新建一个用户关键字编辑框,输入用户定义的关键字,比如uint8,这样在程序代码中,所有的uint8都会高亮显示。

(4)设置快捷键。这个我没有用过,所以不多说明。

(5)模板代码。这又是一个比较实用的功能,模板既有软件自带的,也可以自己编辑模板。可以在你书写程序的时候使用这一功能加快代码的输入。使用方法:

a.先在该选项卡中编辑自己的代码模板,也可以之用软件自带的模板。

b.使用上面6-(1)所说的工程视图快捷按钮,保证该按钮下拉菜单中Templates被选中;选中后会在工程工作空间(Project WorkSpace)中出现:

标签。

c.在编写代码时,应用即可。

7.目标工具选项(Target Options …):

这个是最常用而且最重要的快捷按钮和设置点。这里以LPC2114为例详细做讲述,其它CPU与之类似。

µVision可以设置目标硬件的选项。通过上面的工具栏按钮或Project - Options for Target菜单项打开Options for Target对话框,如图5所示。在Target页中设置目标硬件及所选CPU片上组件的参数。

(1)设备选项卡(device )。

图5

在这里可以在图中2区域更改所使用的CPU,图中3区域是该cpu 的一些描述。

(2)硬件目标设置选项卡(Target),见图6所示。

图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所示。

图7

1:选择输出选项卡

2:指定输出文件的文件夹,这样做可以减少工程文件夹文件的数目。

3.可执行文件的名字。可执行文件指生成的.hex文件,因此应先使能4区域。

4:使能后会产生可执行文件。

5.创建批文件

6.生成库文件

(4)列表选项卡(Listing),见图8。

图8

1:选择列表选项卡

2: 指定输出文件的文件夹,这样做可以减少工程文件夹文件的数目。

3:设置生成/禁止一些.lst、.txt文件。

4.设置生成/禁止一些.map文件(生成的代码详细信息就在这个文件里)

(5)用户程序选项卡(User),见图9。

图9

1:选择用户选项卡。

2:编辑源文件前运行用户程序。

3:编译前运行用户程序。

4:编译后运行用户程序。图中所示的是运行fromelf.exe程序生成.bin文件,详细方法见我的博客:http://blog.csdn.net/zhzht19861011/archive/2010/10/08/5927924.aspx

(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区域所示的编辑框中输入ABC。多个符号用逗号隔开。

3:使能/禁止ARM状态与Thumb状态交互。为了更好的优化存储空间,请使能该选项。

4:设置优化级别,共4级。Level 0为不优化,Level 3为最高级别优化。一般选择default ,即Level 2级优化。

5:附加的优化选项。

6:输出警告信息设置。为了更好的检查程序,设置成All即可。

7:头文件路径设置。

(7)Asm选项卡,见图11。与C/C++选项卡。

图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。

图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。

图13

1:点击进入工具选项卡。

2.配置Flsah下载按钮(即:

使用J-LINK下载详情见我的博文:http://blog.csdn.net/zhzht19861011/archive/2010/10/06/5924218.aspx

8.维护工程组件、配置工具环境及管理书:

点击该快捷按钮。弹出图14所示界面。

(1)工程组建选项卡(Project Components)。

图14

1:点击进入工程组建选项卡.

2:工程目标组建。

3:添加/删除文件组。重点讲述一下这个,应用比较多。使用New (Insert)按钮(图3区域红色划线处)可在目标工程中设置文件组,方便文件归类,图中创建了两个文件组:H-File和User。在工程工作空间中,新建的文件组会体现出来,如下图15所示:

4:该区域页面会列出用户工程的文件组织结构。用户可以通过用鼠标拖拉的方式来重新组织工程的源文件。

第四。创建源文件。

选择菜单选项File – New以创建一个新的源文件,选项会打开一个空的编辑窗口,用户可以在此窗口里输入源代码。如果以扩展名*.C保存文件,µVision4将以彩亮字体显示C源代码。至于代码,还是用一个适合软件仿真的吧(不需要硬件就能全部模拟仿真),这个程序主要使用了定时器0并定时1S钟,然后在中断服务程序中翻转I/O口P0.17的电平。如下所示:(本示例保存文件为MAIN.C)

其中,cpu.h为自定义头文件,内容如下:(保存为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控制口。* 入口参数:无* 出口参数:无****************************************************************************/void __irq  IRQ_Time0(void){if( (IO0SET&BEEPCON) == 0 ) //使I/O口P0.17每隔1秒翻转一次IO0SET = BEEPCON;elseIO0CLR = BEEPCON;T0IR = 0x01;    // 清除中断标志VICVectAddr = 0x00;         // 通知VIC中断处理结束}/**************************************************************************** 名称:Time0Init()* 功能:初始化定时器0,定时时间为1S,并使能中断。* 入口参数:无* 出口参数:无****************************************************************************/void  Time0Init(void){   /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHzFpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz*/T0PR = 99;              // 设置定时器0分频为100分频,得110592HzT0MCR = 0x03;     // 匹配通道0匹配中断并复位T0TCT0MR0 = 110592;         // 比较值(1S定时值)T0TCR = 0x03;     // 启动并复位T0TCT0TCR = 0x01;/* 设置定时器0中断IRQ */VICIntSelect = 0x00;// 所有中断通道设置为IRQ中断VICVectCntl0 = 0x24;// 定时器0中断通道分配最高优先级(向量控制器0)VICVectAddr0 = (uint32)IRQ_Time0; // 设置中断服务程序地址向量VICIntEnable = 0x00000010;         // 使能定时器0中断}*//*********************************************************************** 名称:main()* 功能:初始化I/O及定时器,然后等待中断。* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。*************************************************************************/int  main(void){  PINSEL0 = 0x00000000;// 设置管脚连接GPIOIO0DIR = BEEPCON; // 设置I/O为输出IO0CLR=BEEPCON;Time0Init();// 初始化定时器0及使能中断while(1);// 等待定时器0中断return(0);}/***************************************************************************                            End Of File*************************************************************************/
#ifndef __CPU_H#define __CPU_H/******************************************************              定义数据类型操作符*******************************************************/typedef unsigned char  uint8;                   /* 无符号8位整型变量  */typedef signed   char  int8;                    /* 有符号8位整型变量  */typedef unsigned short uint16;                  /* 无符号16位整型变量 */typedef signed   short int16;                   /* 有符号16位整型变量 */typedef unsigned int   uint32;                  /* 无符号32位整型变量 */typedef signed   int   int32;                   /* 有符号32位整型变量 */typedef float          fp32;                    /* 单精度浮点数(32位长度) */typedef double         fp64;                    /* 双精度浮点数(64位长度) *//*******************************************************       定义测试屏蔽语句,书写测试代码时:*              #ifdef TEST_CODE*              测试语句...*              #endif*       正式下载时,将下句:#define TEST_CODE 屏蔽掉。******************************************************/#define TEST_CODE//正式下载时屏蔽掉该句,防止有测试代码带入正式程序/****************************************************************** End Of File******************************************************************/

第五.在工程里加入源文件

源文件创建完后,可以在工程里加入这个文件。在工程里加入源文件,µVision 3提供了几种方式,例如:可以在Project Workspace – Files页面选择要加入的文件组,单击鼠标右键打开局部菜单,选择Add Files选项会打开一个标准的文件对话框,在对话框里选择上面创建的MAIN.C源文件。

值得注意的是,大多数初学者会忘记这一步骤,假如在MDK中忘记加入文件,编译器会给出错误提示,但在Keil C51(V8.02版)中就没这么幸运了。在C51编译器中,没有添加文件编译器仅有两个警告,所以常常有写人说:我明明都是按照课本上一个个字母敲进去的,怎么编译不出可执行文件啊?是不是书上的代码错了?等等。想想我还在大学二年级的时候,也不止一次的遇到过类似情况 ,现在想起来,还真怀念当时的懵懂。

第六.设置目标工具选项

μVision 4 允许用户根据目标硬件的实际情况对工程进行配置。通过点击目标工具栏图标(

)或单击菜单项Project->Options for Target,在弹出的Target 页面可指定目标硬件和所选择设备片内组件的相关参数,下图为本示例的相关设置。

另外,如果需要生成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),它提供了一种菜单驱动方式来配置目标板的启动代码。关于启动代码详情见我的博文: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

终于告一段落!

(0)

相关推荐

  • 【教程】如何用GCC“零汇编”白嫖MDK

    [说在前面的话] 其实我很久之前就想写这篇文章了,但彼时总觉得这是一个伪命题: 既然已经用了MDK,编译出来的代码,无论是体积还是性能都甩下arm gcc好几条街,谁还会想用gcc来进行Cortex- ...

  • 航顺单片机开发环境

    航顺单片机开发环境

  • 单片机学习归纳总结(三):代码编写的前期准备

    注:该文章中所讲述内容均是在VSCode编辑器中操作! 在正式编写业务代码之前,需要先搭建好整体框架,包括忽略文件.代码片段自动生成文件.安装各种插件.防止VSCode编译器报错的文件.各种今后可能会 ...

  • VB6.0怎么调用带参数的DLL?

    vb6.0中可以创建DLL文件,也可以调用DLL文件,该怎么调用呢?下面我们就来看看详细的教程. 软件名称: msdn for vb6.0(vb6 msdn) 精简中文版 软件大小: 20.6MB 更 ...

  • 火爆全网开源额温枪同平台之华大HC32L136 SDK开发入门

    到淘宝以及相关平台上不少商家为了蹭疫情额温枪的热度把额温枪开发方案的价格定得非常高,少则几千,多则上万,实在是让国人寒心!关键时刻,大家应该同心协力,即将没法向白衣天使一样上前线去抗疫,也应该以别的方 ...

  • 手把手教你VSCode搭建STM32开发环境

    干货福利,第一时间送达! 摘要:作为一个51单片机或STM32单片机的使用者,keil一直是我们的必备的一款工具之一.但keil的一些问题也一直存在,当然也有人用其他的,比如STM32CubeIDE. ...

  • STC51(点灯+五向开关)

    实物 原理图 丝印层 这个实验需要做程序的烧录,需要一些下载的软件什么的 https://www.stcisp.com/ STC的官网丢上来. 菊花里面夹芯片 哪个鬼才整的这花活 好家伙儿,我一往开点 ...

  • 手把手教你移植ThreadX操作系统,基于在Keil MDK环境

    手把手教你移植ThreadX操作系统,基于在Keil MDK环境

  • Keil MDK下如何设置非零初始化变量(复位后变量值不丢失)

    一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备.而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始 ...

  • Keil MDK中Image~~RW

    ARM程序的组成 此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别.             一个ARM ...

  • KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则

    KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则 小编我一向主张在实战中学习,不主张直接去去学习规则&定义,太枯燥,在实际应用中去摸索,才会真正理解具体的技术细 ...

  • KEIL MDK 分散加载示例1-更改程序运行基址

    KEIL MDK 分散加载示例1-更改程序运行基址     小编我一向主张在实战中学习,不主张直接去去学习规则&定义,太枯燥,在实际应用中去摸索,才会真正理解具体的技术细节,下面我们就通过实际 ...

  • KEIL MDK 分散加载的结构-2-语法

    KEIL MDK 分散加载的结构-2-语法 语法.枯燥的.烦人的语法--,但是有些时候木有办法,我本来也不想写这些东西,但确实绕不过去,我认为把它当成一种工具比较合适,了解大概结构以及基本的语法,一些 ...

  • KEIL MDK 分散加载的结构

    KEIL MDK 分散加载的结构 1.我们先来解剖一只麻雀     很多人会说我做项目时没用过分散加载啊,可能有些人甚至都不知道它的存在.事实上,开发环境会默认生成一个分散加载文件(或者叫链接器描述文 ...

  • 手把手教你在Keil MDK中使用GCC编译器工具链

    Keil MDK 是否支持编译器?有没有办法选择其他编译器? 可能你使用其他GUN工具链进行编译时,会出现类似如下错误: --- Error: can't execute 'as'--- Error: ...

  • 手把手教你升级Keil MDK的ARM编译器

    今天在我的技术交流群里,有朋友问了这么一个问题:怎么才能用更高的编译器呀? 这位朋友给了一张图: 从上图可以看得出来,这位朋友使用的Keil MDK并不是最新版本.目前(2020-11)最新MDK版本 ...