1、使用 Keil进行 stm32的程序开发本章的上一节向读者介绍了 Keil MDK的安装流程与在 Keil MDK的 Vision4 集成开发环境下进行stm32工程的建立方法。本节我们就来看看如何使用 Keil MDK开发工具进行 stm32应用程序的开发。在此之前有必要向大家介绍几个名词,Keil、MDK、Vision4、RealView、RVCT、JLINK 还有 RVDS,这些名词分别表示什么,有什么从属关系呢?相信很多读者并没有明确的概念,现在简单的说明一下:Keil:这个大家应该最为熟悉,Keil 其实是一家公司的名字,而这家 Keil公司由两家私人公司联合运营,分别是德国慕尼黑的
2、 Keil Elektronik GmbH和美国德克萨斯的 Keil Software组成。大家很熟悉的 keil C51就是从 Keil Software手中诞生的。但是在 2005年, Keil公司被 ARM公司收购。值得一提的是,Keil 公司只有区区 20多名员工,却仍然做出了伟大的作品。MDK:MDK 全称 Microcontroller Develop Kit,意为微控制器开发套件。ARM 收购 Keil公司的意图在于进军微控制器(也就是我们常说的单片机)领域,MDK 就是这种意图下的产物。但我们一般仍称之为Keil MDK而不是 ARM MDK,Keil MDK 作为一个套件,包
3、含了一系列软件模块。包括 Keil公司的 IDE 环境”Vision”,ARM 公司的编译器 RVCT,Flash 烧写软件模块等。Vision4:Vision4 是 Keil公司的 IDE环境”Vision”的第四个版本,从根本上来说Vision4 是一个开发环境,并不必须包含编译器、仿真、烧写等模块。比如 AVR单片机的一个开发环境WinAVR(又称 GCCAVR)就不包含仿真调试器,也不包含烧写模块。值得一提的是,家喻户晓的 Keil C51正是基于 Vision2 开发环境,所以 Vision4 的界面和 Vision2 非常的相似,很有利于广大习惯于Vision2 开发环境的开发人员
4、转向使用 Vision4 进行 stm32的开发。RealView:是 ARM公司编译工具的名称。其首字母就是下文提到的 RVCT中的R。RVCT:全称为 RealView Compilation Tools,意为 RealView编译工具。是 ARM公司针对自身 ARM系列CPU开发的编译工具,其主要由:ARM/Thumb 汇编器 armasm连接器 armlink格式转换工具 fromelf库管理器 armarC 和 C+应用程序库工程管理组成,这些模块都被嵌入到了集成 Keil Vision4开发环境里(但绝不仅是 Keil Vision4)。值得一提的是,ARM 公司作为 ARM处理器
5、的设计者,其编译工具 RVCT的性能与表现是无与伦比的,没有任何一套编译工具能取代其成为首选。RVDS:全称为 RealView Developer Suite,意为 RealView开发套件。是 ARM公司为方便用户在 ARM芯片上进行应用软件开发而推出的一整套集成开发工具。该套工具包括软件开发套件和硬件仿真工具,是软硬件结合的套件。RVDS 的价格十分的高昂,但功能也十分的强大,基本不会在普通企业和个人用户手中出现。J-Link:J-Link 是 SEGGER公司为支持仿真 ARM内核芯片推出的 JTAG仿真器。配合 IAR EWAR,ADS,KEIL,WINARM,RealView 等集
6、成开发环境支持所有 ARM7/ARM9/Cortex内核芯片的仿真,通过 RDI接口和各集成开发环境无缝连接,操作方便、连接方便、简单易学,是学习开发 ARM最好最实用的开发工具。笔者使用的就是 J-Link仿真器,并且推荐各位读者使用 J-Link仿真器进行 stm32工程的开发。OK,名词解释完毕,相信各位读者看完之后,以后不会再秉持“我使用 Keil编译器”或者“我正在下载 RVDS”这种看似内行本质外行的言论了_。本书选用 Keil Vision4 作为本书中工程实例的开发环境,原因在于其软件操作方式简单,功能齐全,有 Keil C51开发经历的读者朋友可以很快上手。而且作为 ARM公
7、司旗下根正苗红的 IDE,相信 ARM公司是不会让自家孩子在外边献丑的。一般情况下,我们会使用 IDE做以下事情:1、编写程序代码。2、编译程序。3、烧写程序。4、调试程序,包括查看变量、内存、寄存器,时间跟踪分析、甚至可以调用虚拟打印窗和虚拟逻辑分析仪用以显示程序输出。5、输出需要的文件如 Hex、Bin、Lib 等我们就遵循以上几条思路,来看看我们的 Keil Vision4 如何实现这些功能。首先请读者准备好一块至少拥有一个最小系统的 stm32硬件环境,J-Link 仿真器,然后依照上一节的办法建立一个 stm32的工程,建立完毕后请将如下代码作为 main.c文件的内容:#inclu
8、de “stm32f10x_lib.h“u32 Stm32IdHigh = 0;u32 Stm32IdMed = 0;u32 Stm32IdLow = 0;void RccInitialisation(void);int main(void)RccInitialisation();Stm32IdLow = *(u32*)0x1FFFF7E8);Stm32IdMed = *(u32*)0x1FFFF7EC);Stm32IdHigh = *(u32*)0x1FFFF7F0); while(1);void RccInitialisation(void)ErrorStatus HSEStartUpSt
9、atus;RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus = SUCCESS)RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2);FLASH_SetLatency(FLASH_Latency_2);FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
10、RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET);RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource() != 0x08);键入如上代码完成后按下 ctrl + S进行保存。然后我们来看看在开始代码编译调试之前需要进行哪些设置工作。1、右键点击 project区工程组中的顶部”MyFirstJob “,在弹出的右键菜单中选
11、择”Option for Target MyFirstJob”项,弹出设置窗口,如下图所示:在弹出的设置窗口 Option for Target MyFirstJob中,请读者执行如下操作:(1)切换到 Debug标签,选择 Use:Cortex M/R J-LINK/J-Trace,勾选 Load Application at Startup,Run to main()等,如下图所示:(2) 切换到 Utilities标签,选择 Use Target Driver For Flash Programming,并选择 Cortex M/R J-LINK/J-Trace,点击 Settings,
12、在弹出的窗口中点击 Add按钮,根据读者自身的 stm32型号做出如下选择:如果使用的是 stm32f103x4或 stm32f103x6系列,则请选择 STM32F10X Low-density Flash;如果使用的是 stm32f103x8或 stm32f103xb系列,则请选择 STM32F10X Med-density Flash;如果使用的是 stm32f103xc、stm32f103xd 或 stm32f103xe系列,则请选择 STM32F10X High-density Flash;这里的 High、Med、Low 分别对应了 stm32中各种型号中的大、中、小容量 Flas
13、h型号。笔者使用的是 stm32f103rbt6,所以应该选择STM32F10X Med-density Flash。如下图所示:选定后依次点击 AddOK,完成 Option for Target MyFirstJob的设置。2、按下 F7进行编译,无错误和警告提示。3、在连接好硬件之后(包括 J-link驱动的安装)按下 ctrl + F5进入实时仿真状态,还需提及的是,ctrl + F5 操作不仅仅表示进入了仿真调试状态,而且还把程序真正的烧写进了 STM32的 FLASH空间里。4、可以看到进入仿真状态的 Keil Vision4 在界面上多了不少变化: * 多出调试工具栏:其中上面分
14、别有 Reset(复位)、Run(全速运行)、Step (单步进入函数内部)、Step Over(单步越过函数)、Step Out(单步跳出函数)等图标; * 多出一个汇编跟踪窗口; * 多出一个命令提示窗口;如下图所示:当然这些窗口可以根据需要随时关闭或开启。5、很值得说一下 Reset(复位)、Run(全速运行)、Step(单步进入函数内部)、Step Over(单步越过函数)、Step Out(单步跳出函数)这几个按钮的作用:Reset:复位按钮,其作用是让程序回到程序的起始处开始执行,注意这相当于一次软复位,而不是硬件复位;Run:全速运行按钮,其作用是使程序全速运行;Step:单步进
15、入函数内部按钮,如果当前语句是一个函数调用(任何形式的调用),则按下此按钮进入该函数,但只运行一句 C代码;Step Over:单步越过,无论当前是任何功能的语句,按下此按钮后都会执行至下一条语句;Step Out:单步跳出函数,如果当前处于某函数内部,则按下此按钮则运行至该函数退出后的第一条语句;此外经常用到的还有两个按钮:“Start/Stop Debug Session”、“Insert/Remove Breakpoint”,分别是“开启/关闭调试模式”和“插入/解除断点”,分别对应快捷键 Ctrl + F5和 F9。最后笔者建议读者应该尽快熟悉这些调试工具按钮所对应的快捷键,如全速运行
16、 Run按钮对应 F5按键,单步运行 Step对应 F10按键等。熟悉使用这些快捷键一定能极大地提高调试程序的效率。6、首先请读者是光标停留在程序中“while(1);”一句所在行,按下 F9设置断点,并随即按下 F5执行全速运行。很快可以看到程序停在了 while(1);一行,如下图所示。因为程序很短小,对于 72MHz主频的 STM32来说,花费的时间只有几个 us。7、解释一下该程序的作用,首先在程序顶部进行三个外部变量 Stm32IdHigh、Stm32IdMed、Stm32IdLow 的定义。随后调用RccInitialisation()函数对 STM32的时钟进行配置。然后读出 S
17、TM32整个存储空间中起始地址为0x1FFFF7E8、0x1FFFF7EC、0x1FFFF7F0 的数据,分别保存在三个外部变量中。事实上,这三个地址所存放的是 STM32本身所自带的全球唯一身份识别码(ID)。每一片 STM32都拥有与任何其他一片任何型号的 STM32器件不同的 ID码,这对数据加密有重要意义。8、如何查看变量的值呢?有两种办法,一是将光标置于该变量上,大约 1秒钟之后该变量的值会在光标附近浮现。这种方法经常使用在仅仅查看单个变量的值的情形中。第二种办法是使用 Vision4 的 Watch窗口,操作流程如下:依次点击 View Watch Windows Watch 1
18、/ Watch 2,此时会根据选择出现 Watch 1或 Watch 2窗口。随后使用光标拖选想要查看的变量并拖放到该 Watch中即可查看到该变量的当前值。将三个变量都添加进 Watch 1窗口之后,界面如下所示:可以看到这三个变量的值分别为 Stm32IdHigh = 0x87203743、Stm32IdMed = 0x51508248、Stm32IdLow = 0x066Bff52。9、我们都知道,变量一定是存放在 STM32内部的存储空间中(无论是 FLASH空间还是 RAM空间),那理所当然的这些存储空间应该也是可以查看的。操作流程如下:依次点击 View Memory Window
19、s Memory 1 / Memory 2 / Memory 3 / Memory 4,此时根据选择出现 Memory窗口。在该 Memory窗口中填入所要查看的存储地址(此处填入 0x1FFFF7E8,注意前面的 0x不能省略),按下回车键后 Memory窗口的内容发生跳转,如下图所示:我们可以看到,从 0x1FFFF7E8地址处开始的数据分配情况如下:0x1FFFF7E8:52 FF 6B 060x1FFFF7EC:48 82 50 510x1FFFF7F0:43 37 20 87 在第 8点的时候我们列出了 Stm32IdHigh、Stm32IdMed、Stm32IdLow 三个变量的值
20、分别为 Stm32IdLow = 0x066Bff52、Stm32IdMed = 0x51508248、Stm32IdHigh = 0x87203743。细心的读者可以发现存储区空间的数据和这三个变量有这“一样”却有“不一样”的地方。一样在于数据的大小是一致吻合的,不一样在于数据的排列顺序却颠倒了。这就是所谓的小端格式:低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。(注意 Memory窗口中,地址是从左往右,从上往下递增的)10、此外 Vision4 开发环境中较为经常用到的功能还有文件查找(Find in Files)、分析仪(Analysis Window)、寄存器组(Register Window)等。这些功能模块可以在菜单栏里面轻易地找到并启用。以上就是使用 Keil MDK开发工具进行 STM32开发应用的所必须的基本操作,读者要在接触 Keil MDK的早期熟悉软件的基本使用方法,并在此基础上逐步探索 Keil MDK的一些高级功能,特别是一系列快捷键的使用,对日后进行程序开发必定大有裨益。