引言MAXQ平台得到了世界一流工具的支持,例如IAR专为MAXQ系列提供的“嵌入式工作台” (Embedded Workbench)。本应用笔记说明如何建立、构建和调试面向MAXQ平台、以C语言编写的应用程序。本文还将演示MAXQ2000的某些特性,MAXQ2000是MAXQ系列的第一款微控制器。
本应用采用专用于MAXQ平台的1.12B版IAR编译器编写。这些指令在后续版本的产品中仍会保留。这些指令可以在MAXQ2000评估板上执行。 设置MAXQ2000评估板在开始编写代码前,首先连接MAXQ2000评估板。该评估板应含有3块电路板,其中一个带有小型LCD屏。最大的那个电路板(图1中连接了LCD子板的)就是MAXQ2000评估板。我们将在本文后面讨论它的特性。将LCD板连接至MAXQ2000评估板上标有J3的端子。
图1. 连接有LCD板的MAXQ2000评估板
剩下的一块电路板是JTAG板。MAXQ2000装载器和调试引擎采用JTAG协议通信。由于很难找到通用的、用于个人计算机的商品化JTAG适配器,Dallas Semiconductor提供了一个串行至JTAG转换板。评估板还包括了一个小型连接器。如图2所示,使用该连接器来连接MAXQ2000评估板和JTAG板。通过电缆将MAXQ2000评估板上标有J4的端子和JTAG电路板上标有P2的端子连接在一起。注意,连接电缆的红边应在两个板子上的引脚“1”和“2”一侧。
图2. MAXQ2000评估板与JTAG板连接
MAXQ2000评估板上有3个跳线。跳线JU1、JU2和JU3上的引脚1和2应跳接在一起。此外,确保晶体放置在Y1上(靠近板上的微处理器)。本应用笔记的演示程序默认晶振频率为13.5MHz。JTAG板也含有3个跳线。跳线应放置在端子JH1、JH2和JH3上。
本装置要求5V ±5%/300mA的电源,插孔中心为正极。将电源插入JTAG板上的电源插孔J2。
最后,需要将PC串口连接至JTAG板。采用一个标准9针直通串行电缆,将计算机的一个串口与JTAG板的串口相连(注意:不要连接至MAXQ2000评估板的串口,具体参见图3的正确连接方式)。
图3. 连接至JTAG板的串行电缆的正确位置
现在,我们就可以利用IAR工具开始工作了。 IAR编译器使用入门: Hello WorldIAR提供了一个为MAXQ平台设计、限定代码尺寸的评估版编译器,它们在MAXQ2000评估板附带的CD上。此外,也可以从http://www.iar.com下载。按照说明来安装、选择默认的安装位置和选项。注意,IAR Embedded Workbench产品仅适用于Windows®平台。
按照以下步骤从开始菜单启动IAR Embedded Workbench:IAR Systems IAR Embedded Workbench for MAXQ IAR Embedded Workbench。现在,我们就在MAXQ2000评估板上创建一个简单的应用。
建立一个新的工作区。在FILE菜单下,选择NEW。将出现一个对话框,显示"Source/Text"和"Workspace"选项。选择WORKSPACE,单击OK。出现一个文件对话框,询问新工作区的名称。确定保存新工作区的位置后,输入工作区名称。对于本项目,我们称其为"helloworld"。输入工作区名称后,单击SAVE。
一旦打开工作区后,则需要建立一个项目。在PROJECT菜单下,选择CREATE NEW PROJECT。将d出另一个文件对话框。确定在下拉框"Tool Chain"中选择MAXQ。输入项目名称,单击CREATE按钮。此项目名定为"helloproject"。
现在项目建立完毕,我们还需要对其进行配置,以便用于MAXQ2000评估板。在项目管理窗口中,右键单击标有"helloproject - Debug"的一行,单击OPTIONS项(图4)。大部分默认选项是恰当的,但是需要修改部分设置。
图4. 在项目上单击右键
在项目选项中,选择CATEGORY下的XLINK,然后选择"Include"标签。在对话框的最下面,选中标有"Override Default"的框,然后单击下面编辑行右侧的小按钮(标着"...")。将出现文件选择对话框。选择文件"lnkmaxq200x.xcl"¹,单击OPEN。应出现如图5所示的项目选项对话框。
图5. 为MAXQ2000设置正确的链接器选项
现在,选择CATEGORY下面的C-SPY DEBUGGER。在标有"Driver"的下拉框下,选择JTAG。这就告诉IAR Embedded Workbench在真实硬件(而不是在软件仿真器)上调试应用程序。同时,确定"Device DescripTIon File"所选的是'$TOOLKIT_DIR$\Config\maxq200x.ddf'。图6所示为该对话框窗口的正确配置。
图6. MAXQ2000工作时的调试器选项
所需的最后一个项目选项在条目JTAG中,它是CATEGORY列表下的C-SPY DEBUGGER子条目。在标有"COM Port:"的编辑框中,输入将与MAXQ2000评估板进行通信的PC COM端口。通常为COM1或者COM2,许多带有USB串口适配器的用户将使用COM4或者序号更高的端口。
现在,已经正确的配置了IAR工具,使其能够与MAXQ2000评估板一起工作。单击项目选项窗口中的OK按钮。下一步,将需要为项目建立源代码。首先,开始一个能够触发LED的简单的HelloWorld型应用程序。
单击工具条上的新文件按钮(工具条最左侧的空白页),或者选择FILE菜单下的NEW。选择SOURCE/TEXT,单击OK按钮。标有"UnTItled1"的新窗口将出现。在新窗口中输入以下代码:
#include单击Save按钮(工具条上的磁盘图标),或者从菜单上选择FILESAVE,保存文件。在出现的文件对话框中,输入"demo.c"作为文件名称,单击save。注意,文件"demo.c"并不出现在项目窗口中。在能够构建该项目之前,需要为该项目加入源文件。右键单击项目窗口中的"helloproject - Debug"行,选择菜单中的"Add Files..."。当文件对话框出现后,选择文件"demo.c",单击OPEN。现在,已经加入源文件,可以进行构建了。void main() { unsigned int counter1; unsigned int counter2; PD0 = 0xff; while (1) { for (counter1 = 0; counter1 < 0xffff; counter1++) { for (counter2 = 0; counter2 < 0x10; counter2++) { } } PO0 = PO0 ^ 0xff; } }
在PROJECT菜单下,选择选项REBUILD ALL。屏幕下方的消息窗口中将输出大量数据,其结尾是:
Total number of errors: 0 Total number of warnings: 0如果出现任何错误或者警告信息,请确定输入代码是否正确,是否按照项目设置说明进行 *** 作。此处常出现的警告信息是"last line of file ends without a new line"。如果出现该错误,则找到源代码的最后一行,多次敲击ENTER,在最后的右括号('})之后,建立几个新行。
成功构建项目后,准备运行。确定JTAG板和MAXQ2000板已经按照本文第一部分所述已经连接并上电。同样,对于第一次演示,需要打开能使LED段点亮的一个开关。找到标有SW6的开关,将第8个开关打到on (上部)位置。运行本项目,选择PROJECT菜单,然后选择DEBUG选项。将出现一个窗口通知应用程序正在下载。
点击执行代码第一行的第一个断点"PD0 = 0xff;",启动项目。我们将在以后研究IAR Embedded Workbench的调试选项。现在,只需点击工具条的GO按钮(三个蓝色箭头),或者选择DEBUG菜单下的GO。将看到大部分LED以每秒一次的频率闪烁。
我们已经采用IAR Embedded Workbench编译、下载、运行了首个为MAXQ2000评估板编写的应用。下一步,该实例程序将变得复杂一些。然后,将讨论MAXQ2000评估板的一些特性,以及IAR Embedded Workbench的某些调试特性。 一个简单应用:在LCD上显示一个计数器现在已经成功触发了LED,下一步继续处理更加复杂的LCD应用程序。MAXQ2000微控制器具有一个集成的132段LCD控制器,以及一个片内电阻分压器用于对比度控制。它还可以直接对LCD屏供电。MAXQ2000评估板带有一个简单的静态LCD屏,其上有4个数字和一些简单的标点符号(一对冒号和点号,参见图7)。对于初次使用者,我们将编写一个能够在LCD上实现计数器的应用程序。然后,深入讨论控制LCD的代码,演示更复杂的实例。
按照前面所述的步骤,建立一个新的工作区和项目(注意,需要为该新项目重新输入所有的XLINK、C-SPY和JTAG选项)。 为该工作区起名为LCDDemo,项目名为SimpleLCD。下载该实例的源代码。将文件lcdcounter.c放在刚刚建立的LCDDemo项目目录下。在IAR项目窗口中,右键单击标有"SimpleLCD - Debug"的一行,选择"Add Files..."。选择刚刚加入的文件lcdcounter.c,然后单击OPEN。
在运行项目前,我们来查看一些比较重要的代码段。首先,下拉至文件底部的void main()一行,此处是应用程序的起始点。您将看到对LCD的初始化(函数initLCD),然后进入无限循环while (1)。主循环调用的函数在LCD屏幕上显示一个数字。每执行一次循环,数值计数增1,如果超过LCD能够显示的最大值19999,则重新计数。
现在继续运行程序。单击DEBUG按钮(工具条的最右侧),或者选择菜单中的PROJECT DEBUG。注意,IAR Embedded Workbench在将应用程序装入到评估板之前,自动进行构建。我们将看到IAR显示变为调试模式,在void main()代码的第一行停止运行。点击GO按钮(三个蓝色箭头),查看显示屏,它应快速向上计数。如果观察的时间足够长,接近20000时,显示将从头开始。
现在可以展示MAXQ2000评估板上非常有用的一个特性――RESET按钮。评估板左下侧是标有SW2和RESET的开关。按下按键,观察LCD屏幕,它将立刻从0开始显示。该按钮连接在微控制器的复位引脚上――如果需要重新启动应用程序,则按该按钮。 MAXQ2000评估板特性现在已经建立了使用MAXQ2000评估板LCD子板的应用程序,让我们仔细研究一下评估板的各个部分。我们不在此处涉及到评估板的所有器件,在评估板附带的CD中的MAXQ2000评估板原理图和"MAXQ2000 Evaluate Kit GetTIng Started Guide"中有更详细的信息。
LCD子板现在,LCD板已经能够运转。显示段和公共极信号的产生受控于MAXQ微控制器的几个寄存器。LCD子板的连接方式简化了对于LCD屏的 *** 作,向4个显示位置中的任何一个写入数码非常容易。由于每个7段LCD数字的映射相同,因此,在代码中包括了下表,以帮助写入正确的LCD寄存器数值:
#define LCD_PATTERN_0 0x03F #define LCD_PATTERN_1 0x006 #define LCD_PATTERN_2 0x05B #define LCD_PATTERN_3 0x04F #define LCD_PATTERN_4 0x066 #define LCD_PATTERN_5 0x06D #define LCD_PATTERN_6 0x07D #define LCD_PATTERN_7 0x007 #define LCD_PATTERN_8 0x07F #define LCD_PATTERN_9 0x067 int PATTERNS[] = { LCD_PATTERN_0, LCD_PATTERN_1, LCD_PATTERN_2, LCD_PATTERN_3, LCD_PATTERN_4, LCD_PATTERN_5, LCD_PATTERN_6, LCD_PATTERN_7, LCD_PATTERN_8, LCD_PATTERN_9 }; int getLCDDigit(int digit) { return PATTERNS[digit]; }利用getLCDDigit函数,可由以下代码向控制器屏写入数值:
/* write the value 612 to the LCD screen */ LCD2 = getLCDDigit(6); LCD1 = getLCDDigit(1); LCD0 = getLCDDigit(2);该LCD板还可以显示小数点和冒号,适用于时钟、温度显示以及任何其他简单的数字显示等。图7是LCD子板各段的完整显示以及用于控制各段LCD显示的寄存器位。
图7. LCD段至MAXQ2000寄存器位的映射
按键MAXQ2000评估板上有三个按键,两个连接至外部中断,一个连接至微控制器的复位信号。复位按钮用于重新运行应用程序,如同前面演示的LCD计数器所示。
经开关使能后,其他两个按键可连接至外部中断。每个按键可连接至一对外部中断。按键1在评估板上标记为SW4,可连接至端口5引脚2 (外部中断#10)或者端口5引脚3 (外部中断#11)。按键2在评估板上标记为SW5,可连接至端口7引脚0 (外部中断#14)或者端口7引脚1 (外部中断#15)。下表说明了用于将按键连接至外部中断引脚的开关的使用。
注意,这些引脚还有其他功能,这就是为什么要对按键连接到哪个部中断进行选择的原因。例如,端口7引脚0和1用于UART 0串口发送和接收。如果将按键连接至这些引脚之一,则不利于使用UART 0的功能。请注意,MAXQ2000含有两个UART,因此,决定如何配置MAXQ2000评估板时,可以有多个选择。
串行连接器MAXQ2000评估板含有一个9针连接器和一个RS-232电平转换器。因此,可以采用一条标准的直通串行电缆连接评估板和PC。这与连接串口至JTAG板的串行电缆相同。
为能够通过该串口读取到达数据,SW1上的3号开关必须置于ON的位置。注意,如果P7.1被用于外部中断(如果SW6.5置于ON),将产生冲突。要在该串口写数据,SW1上的第7个开关必须置于ON的位置。同样,如果P7.0被用于外部中断(如果SW6.4置于ON),也将产生冲突。
LED面板在简单的HelloWorld式应用程序中我们已经使用了LED面板,现在仔细观察一下面板的实际显示。图8显示了LED面板的每个亮条和与其相关的输出引脚。
图8. LED至MAXQ2000寄存器位的映射
PD0 = 0xff;当适当的I/O端口设置为输出后,PO0寄存器相应位设置为1时,该引脚对应的LED被点亮。注意,组合开关SW6上的8号开关必须置于ON的位置,才能对LED阵列供电。
MAX1407MAXQ2000评估板带有一个MAX1407,它含有一个4通道16位模数转换器,以及两个10位数模转换器。MAXQ2000通过其片内SPI™主机与之通信。这样,MAX1407就成为连接MAXQ2000与外部真实世界信号的理想桥梁。网上²有一个使用热敏电阻以及MAXQ2000评估板来实时显示当前温度的实例程序。请查看该实例程序的源代码,了解运行该程序所需的硬件连接和配置。
参见: MAX1407快速浏览数据资料 使用IAR编译器来调试应用程序现在,转向一个新的应用程序,通过它我们来熟悉一下IAR调试工具。同前面一样,建立一个新的工作区和项目,将工作区命名为"lcdtime",项目名为"rtc_demo"。从本应用笔记的下载源³添加源代码文件lcd_trc.c。构建该程序,点击DEBUG按钮将其装入到MAXQ2000评估板。
该程序实际是前面编写的LCD计数器程序的扩展。开始运行后,其LCD显示与以前相似,快速显示计数递增。但是,按下SW4按键,程序将显示实时时钟的当前值。这看起来实用性较差,因为时间显示几乎都不正确。按下SW5按钮几次后,将看到分钟递增。如果同样需要增加小时,不停的按该按钮将使人疲倦。在这种情况下,可以按住SW5按钮,然后按下SW4按钮来增加小时。如果再次单独按下SW4按钮,将切换回计数器显示。
点击GO按钮(三个蓝色箭头),继续运行程序。反复 *** 作几次,熟悉该程序。一旦掌握该程序后,我们将利用它来介绍一些IAR调试工具。
IAR调试:暂停一个应用程序程序正在运行时,按下工具条左侧的红色手形按钮,或者选择DEBUG菜单下的BREAK,这将使处理器停止运行,IAR将显示你在应用程序中的当前位置。
程序暂停后,可以有几种选择。如果将鼠标放在调试工具条的其他按钮(带有蓝色箭头)上,保持一段时间,将d出提示窗口,显示该按钮的功能。较为常用的一些按钮为:
- Step Over: 走过下一指令。如果下一指令是函数调用,按下此按钮将不会进入该函数。
- Step Int 走入下一指令。如果下一指令是函数调用,按下该按钮将进入被调用的函数。
- Run to Cursor: 运行程序至光标所在代码的位置。这要比使用断点功能来运行至代码的特定位置方便一些。
- G 使程序正常运行。按下pause按钮或者到达断点后,程序停止运行。
IF (EIF1 & 0x04)右键单击此行,从d出菜单中选择选项TOGGLE BREAKPOINT (不是选项'Toggle Bookmark'!)。该行左侧空白位置将出现一个红色的'X'。现在,再次点击DEBUG按钮,按下GO按钮,运行程序。将看到LCD计数器运行。
按下SW5按键,计数器程序似乎停止了。如果回过头来注意一下IAR Embedded Workbench,将看到程序已经停止运行,加入断点的一行被高亮显示,如图9所示。
图9. 在IAR Embedded Workbench中达到断点
调试应用程序时,断点是非常有用的工具。开发人员通常希望了解代码是否按要求执行,或未被执行。例如,如果按键中断例程没有正常工作,我们将会考虑两种可能—1) 按键中断例程代码不正确,因此,得不到预期结果,2) 按键中断代码根本就没有执行。采用断点后,可以知道第2种情况是否发生,帮助我们决定应在哪方面花时间调试。
IAR调试:局部变量程序还停止在断点上时,打开LOCALS窗口(如果还没有打开)。可通过选择VIEW菜单下的LOCALS选项来打开窗口。如果还停止在前面所设置的断点行上,则locals窗口应如下所示:
图10. IAR Embedded Workbench的局部变量窗口
注意到有两个条目:temp和time。temp变量用于显示PI7寄存器的数值。注意另一条目time的表达。这意味着该变量不在当前视野之内――它或者没有赋值,或者其数值不会再被函数使用。
LOCALS窗口显示了应用中止处所在函数中所声明且使用的变量。这是了解程序当前状态的强有力工具――可以检查变量中不正确的数值,还可以根据变量值判断程序下一步的去向。
LOCALS窗口的功能不仅这些――在程序执行期间,还可以修改变量值。单击temp值(可能是1),输入一个新的整数值,则修改了运行程序的状态。这可以帮助开发人员查看其程序对不同输入的反应,而不必重新构建和装载程序。
IAR调试:Watch窗口程序暂停时,打开WATCH窗口(VIEW WATCH)。在expression下,输入pbcount。WATCH窗口中应出现数值1 (除非按下了其他键,使程序再次运行)。Watch窗口使我们能够随意输入任意表达式,并显示该表达式的计算数值。在本例中,我们输入了一个全局变量名,它告诉我们按键中断代码被执行了几次。Watch窗口的作用还不仅如此――在WATCH窗口中,再次单击pbcount,输入pbcount ^ 0x05。IAR Embedded Workbench将计算该表达式(pbcount值与5异或),显示结果为(4)。
图11. IAR Embedded Workbench中表达式的Watch窗口
IAR调试:Call Stack打开call Stack (VIEW CALL STACK)。Call Stack显示代码执行到当前位置已调用过的函数。此时,由于正在响应一个中断,只显示pushButtonInterrupt() (以及一些调试信息)。单步调试该程序,查看该窗口的反应。向下找到标有中断15的代码段下面的showTime()行。可以按下STEP OVER几次,或者右键单击该行,选择RUN TO CURSOR。此时,showTime()行被高亮显示。按下STEP INTO按钮,将看到showTime()函数的第一行代码被高亮显示。再次查看Call Stack――现在,showTime()函数显示在第一行,其后是pushButtonInterrupt()。由于这是一个堆栈,现在执行的函数被首先列出,其后是调用该函数的函数,再后是更上一层的调用函数,等等。
图12. IAR Embedded Workbench中的Call stack窗口
IAR调试:Memory窗口IAR Embedded Workbench允许我们察看正在执行应用程序的器件的内部存储器。选择VIEW MEMORY来查看Memory窗口。窗口首次打开时,可能会显示代码段的存储器内容。单击下拉框,你会看到用于显示的存储器类型选项。选择Data选项来查看MAXQ2000片内RAM的内容。
图13. IAR Embedded Workbench显示的Memory内容
与LOCALS窗口相似,我们也可以直接在这里修改RAM的数值。加亮某个位置,输入你所希望的新16进制数值。与LOCALS窗口一样,这是个非常有用的工具,便于开发人员修改程序状态而无须重新构建和装入应用程序。
IAR调试:Register窗口Register窗口(VIEW REGISTER)与Memory窗口相似。该窗口显示MAXQ2000的寄存器映射。出现的第一个寄存器是MAXQ平台的核心寄存器,例如累加器、数据指针和循环计数器等。单击下拉框,可以看到其他几个选项。例如,如果选择Port I/O寄存器,你就可以看到并编辑与MAXQ2000输入/输出端口相关的所有寄存器。
图14. IAR Embedded Workbench显示的Register内容 开发支援对于MAXQ平台的开发者,我们提供了多种资源予以支持。其中之一是由Dallas Semiconductor开发人员管理的在线论坛,解答用户提交的问题,同时也是开发人员发布消息的窗口,提供最新的工具信息和相关的其他问题。请访问主页,进行注册,登录您的账号:
Dallas Semiconductor讨论组 (English only)对于不适合在公开论坛提出的问题,请通过Maxim支持中心联系我们。
对于综合新闻和信息,以及如何开始使用MAXQ2000、MAXQ平台和MAXQ未来器件的信息,请访问MAXQ主页。 常见问题及其解决开始使用一款新器件时,初次建立通信总会遇到一些问题。确定是否全部按照本文档第一部分的说明来进行 *** 作可解决大部分问题(例如,电路板连接和项目配置)。以下是常见问题及其解决方式:
对于上述这些以及其他有关MAXQ2000程序装载的问题,打开屏幕下方消息窗口中的TOOL OUTPUT标签,将有助于问题的解决。此处列出的消息可能会给你提供一些有关为何装载失败的线索。 结论MAXQ2000是Dallas Semiconductor MAXQ平台引入的第一款器件,是功能强大的低成本、低功耗微控制器,为用户应用程序提供丰富的外设支持。在IAR Embedded Workbench的支持下,可以采用C语言编写复杂的应用程序,在功能强大的工具帮助下进行调试,实现高质量产品并使其快速面市。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)