新闻中心

EEPW首页>嵌入式系统>设计应用> STM32开发环境(工具)之Keil MDK 介绍

STM32开发环境(工具)之Keil MDK 介绍

作者: 时间:2016-11-27 来源:网络 收藏

双击列表中的项可以对该项进行重命名操作,点击空白处可以添加新的项,虚方框按钮也可以添加新的项,红叉表示删除选中的项,上下箭头用于调整当前选中项在列表中的位置,“Add Files”可以添加新的源文件,操作过程和前面添加文件的操作是一样的。

5.1.4 编译程序
程序代码写好之后就进入编译程序阶段,可以通过菜单,工具栏和浮动菜单多种方式来发起编译过程,也可以通过批处理文件进行,关于这个批处理文件在Output标签页的设置中提到过。


红线圈起来的区域就是对应的菜单编译命令和工具栏编译命令。各命令的含义如下:
  Clean target:清除编译结果。
  Build target:编译被修改的文件并且编译应用程序。
  Rebuild all target files:重新编译所有的源文件并且编译应用程序。
  Batch Build:通过前面输出的批处理文件进行编译。
  Translate **.*:编译某个源文件,**.*代表要编译的源文件。
  Stop build:只有编译进行过程中这一项才有效。
通过在工程窗口“Target 1”上点击右键,也可以弹出相应的编译菜单,各命令含义和上面一致。


现在就让我们来编译我们的“HelloWorld”,如下图所示,编译的结果会在输出窗口显示。


很遗憾,有不少错误,也许你早就发现我们的代码中使用了很多我们没有定义的而且也不属于标准C的一些函数,没错这就是ST固件库给我们提供的函数,我们要做的就是把固件库添加到我们的工程中,和其他的开发环境一下,我们可以直接添加固件库的源文件和工程一起编译,也可以通过添加已经编译好的静态连接库(*.lib)文件。这里我们以后者为例,这些库在我们安装好Keil开发环境的时候已经提供了,路径一般在你安装目录下的ARM/RV31/LIB/中,例如我这里的路径是D:/Keil/ARM/RV31/LIB/ST。这里我们将添加一个新的Group,取名为FWLIB。然后将库文件添加到这个Group中,具体的操作过程可以参照编写源程序章节。添加库之后我们再次编译。

问题解决了,当出现“0 Error(s), 0 Warning(s)”的时候也就意味着我们的程序已经通过了语法检查,有时候一些Warning也不影响程序执行,但是我们要慎重对待,仔细分析每一个Warning。如果是源程序中有语法错误或者警告,我们可以通过双击输出窗口的该行,快速定位到出错的位置。

5.1.5 调试程序
编译通过只是说明我们的代码没有语法错误,至于源程序中存在的其他错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部分的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发接下来我们需要运行我们的程序来验证是否达到了预期的目的。也就是程序调试,程序调试往往是程序开发过程中最难的阶段,尤其是对一些比较大型的程序。下面我们就来看看uVision3对调试的支持。

5.1.5.1 常用的调试命令
在对工程成功进行汇编、连接之后,按Ctrl+F5或者使用菜单Debug->Start/Stop Debug Session即可进入调试状态。进入调试状态后,界面与编辑状态相比有明显的变化,Debug才单项中原来不能用的命令现在已经可以使用了,工具栏会多出一个用于运行和调试的工具栏,如下图所示,Debug菜单上的大部分命令可以在此找到对应的快捷按钮。


常用的Debug菜单命令如下所示:
  Start/Stop Debug Session:开始或者停止调试。
  Run:一直执行下一个活动的断点。
  Step:单步执行。
  Step Over:过程单步执行,即将一个函数作为一个语句来执行。
  Step out of current Function:跳出当前的函数。
  Run to Cursor line:执行到光标所在的行。
  Stop Running:停止运行。
  Breakpoints:打开断点对话框。
  Insert/Remove Breakpoint:在当前行插入/删除一个断点。
  Enable/Disable Breakpoint:激活当前行的断点或者使断点无效。
  Disable All Breakpoints:使程序中所有的断点都无效。
  Kill all Breakpoints:删除程序中所有的断点。


学习程序调试,必须明确两个重要的概念,即单步执行与全速执行。全速执行是指一行程序执行完了以后紧接着执行下一行程序,中间不停止,这样程序执行的速度就很快,并可以看到该段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难以确认错误出现在哪些程序行。单步执行是每次执行一行程序,执行完该行程序执行完以后即停止,等待命令执行下一行程序,此时我们可以观察该行程序执行完以后得到的结果,是否与我们写程序行所想要得的结果相同,借此可以找到程序中问题所在。程序调试中,这两种运行方式都要用到,要灵活应用,可以大大提高调试效率。
在调试窗口中,我们可以看到一个黄色的调试箭头,指向了当前执行到的程序行。

5.1.5.2 断点设置
程序调试时,有些程序行往往很难确认什么时候能够执行到,这类问题就不适合单步调试,这是我们需要使用程序调试中另一种非常重要的方法——断点设置。断点设置的方法有多种,常用的是在某一程序行设置断点,设置好断点之后可以全速运行程序,一旦执行到该程序行即停止,可在此观察有关的变量值,以确定问题所在。设置断点的命令请参考上一节常用调试命令介绍。一旦某一行被设置了断点,我们可以在程序行的左端看到一个红色方框(如图5.24调试窗口图所示),如果该断点被禁用,方框将会变为白色。
除了在某程序行设置断点这一基本方法以外,uVision3还提供了多种设置断点的方法,按Debug->Breakpoints,即出现一个对话框,该对话框用于对断点进行详细的设置,如下图所示。


图5.26中的Expression后的编辑框用于输入表达式,该表达式用于确定程序停止运行的条件,功能强大,涉及到uVision3内置的一套调试算法,这里不做详细说明,请查阅相关帮助文档。

5.1.5.3 调试窗口
前面讲了调试的一些方法,里面多次提到检查程序的执行状态。调试窗口就是用于查看程序执行状态的。uVision3提供了多种调试窗口,如寄存器窗口,存储器窗口,反汇编窗口,外设窗口等,下面将会一一作介绍。


1. 寄存器窗口
图5.26是工程窗口寄存器页的内容,寄存器页包含了当前所有的工作寄存器和系统寄存器,每当程序中执行到对某个寄存器的操作时,该寄存器会反色显示,用鼠标单击然后按F2(鼠标连续单击两次),即可修改该值。
2. 存储器窗口
存储器窗口可以显示系统中各种内存中的值,通过在Address后的编辑框中输入“字母:数字”即可显示相应内存值,其中字母C、D、I、X,分别代表代码存储空间、直接寻址的片内存储空间、间接寻址的片内存储空间、扩展的外部RAM单元值、键入C:0即可显示从0开始的ROM单元中的值,即查看程序的二进制代码。该窗口的显示值可以以各种形式显示,如十进制、十六进制、字符型等。改变显示方式的方法是点鼠标右键,在弹出的快捷菜单中选择。除了显示,还可以修改内存中的值,如下图所示。


3. 查看和调用栈窗口
这个窗口可以帮助我们查看当前调用树的情况,我们还可以通过这个窗口查看和修改一些变量的值。鼠标停留在某个变量的时候点右键,在弹出的浮动菜单中选择Add ***to Watch window,Local 窗口显示当前一些局部变量的值,变量值的现实方式可以在十六进制和十进制之间切换,方式是在查看窗口点右键,在某个变量的Value栏用鼠标单击然后按F2(鼠标连续单击两次),即可修改该值。如下图所示。


4. 反汇编窗口
点击View->Dissambly Window可以打开反汇编窗口,该窗口可以显示反汇编后的代码、源代码和相应反汇编代码的混合代码,可以在该窗口进行在线汇编、利用该窗口跟踪已找行的代码、在该窗口按汇编代码的方式单步执行。点击鼠标右键,出现快捷菜单,如图5.29所示,其中Mixed Mode是以混合方式显示,Assembly Mode是以返回编码方式显示。


5. 外设窗口
为了能够比较直观地了解单片机中各种外设的使用情况,uVison3提供了一个外围接口对话框。通过Peripherals菜单,下拉菜单中的内容和你选择的芯片有关,会列出你所选择的芯片上所有的外设。选择一项你可以进入查看或修改该外设的一些状态。例如在这里我们是通过GPIO中的PB9来控制LED闪烁,我们可以打开GPIOB的状态对换框,如图5.30所示。


现在我们可以调试我们的HelloWorld了。程序运行时,你将看到开发板上的L1不停闪烁。


上一页 1 2 3 下一页

评论


技术专区

关闭