摘要:本应用笔记说明如何建立、构建和调试面向maxq®平台、以c语言编写的应用程序,并演示maxq2000的某些特性。
引言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。将弹出另一个文件对话框。确定在下拉框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
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;
}
}
单击save按钮(工具条上的磁盘图标),或者从菜单上选择filesave,保存文件。在出现的文件对话框中,输入demo.c作为文件名称,单击save。注意,文件demo.c并不出现在项目窗口中。在能够构建该项目之前,需要为该项目加入源文件。右键单击项目窗口中的helloproject - debug行,选择菜单中的add files...。当文件对话框出现后,选择文件demo.c,单击open。现在,已经加入源文件,可以进行构建了。
在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)。下表说明了用于将按键连接至外部中断引脚的开关的使用。
switch (set to on)
connect push button
to port pin...
external interrupt #
sw6, switch 2
push button 1 (sw4)
port 5 pin 2
10
sw6, switch 3
push button 1 (sw4)
port 5 pin 3
11
sw6, switch 4
push button 2 (sw5)
port 7 pin 0
14
sw6, switch 5
push button 2 (sw5)
port 7 pin 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寄存器位的映射
为能够向i/o端口写入数值,首先需要将端口0引脚方向设置为输出。每个引脚具有一个独立的输入/输出方向控制。在第一个应用程序中,由以下代码来设置端口0所有的引脚为输出: 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将显示你在应用程序中的当前位置。
程序暂停后,可以有几种选择。如果将鼠标放在调试工具条的其他按钮(带有蓝色箭头)上,保持一段时间,将弹出提示窗口,显示该按钮的功能。较为常用的一些按钮为:
step over: 走过下一指令。如果下一指令是函数调用,按下此按钮将不会进入该函数。
step int 走入下一指令。如果下一指令是函数调用,按下该按钮将进入被调用的函数。
run to cursor: 运行程序至光标所在代码的位置。这要比使用断点功能来运行至代码的特定位置方便一些。
g 使程序正常运行。按下pause按钮或者到达断点后,程序停止运行。
iar调试:断点断点功能使我们在程序运行到特定位置后,能够停止程序运行。下面以实例说明。如果程序仍在运行,先停止它。找到代码中的函数pushbuttoninterrupt,找到下面一行: if (eif1 & 0x04)
右键单击此行,从弹出菜单中选择选项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主页。
常见问题及其解决开始使用一款新器件时,初次建立通信总会遇到一些问题。确定是否全部按照本文档第一部分的说明来进行操作可解决大部分问题(例如,电路板连接和项目配置)。以下是常见问题及其解决方式:
问题
可能的解决方式
点击调试时,iar根本不出现任何提示,但是maxq2000硬件没有反应。
确定已经选择了c-spy debugger项目选项下的jtag驱动器。
出现损坏的*.d66文件的错误提示。
确定在xlink include选项下,已经选择了以lnkmaxq200x.xcl文件覆盖默认的xcl文件。
每一步都配置正确了,但是按下debug按钮后,无法装入程序。
确定没有其他软件在使用你选用的com口。一般而言,pda软件在计算机启动时,占用串口。可以选择一个不同的com口,或者关掉pda软件。
iar试图开始装入程序,但一直不能成功。所有的电缆连接和配置都正确。
尝试重新启动iar embedded workbench。
对于上述这些以及其他有关maxq2000程序装载的问题,打开屏幕下方消息窗口中的tool output标签,将有助于问题的解决。此处列出的消息可能会给你提供一些有关为何装载失败的线索。
结论maxq2000是dallas semiconductor maxq平台引入的第一款器件,是功能强大的低成本、低功耗微控制器,为用户应用程序提供丰富的外设支持。在iar embedded workbench的支持下,可以采用c语言编写复杂的应用程序,在功能强大的工具帮助下进行调试,实现高质量产品并使其快速面市。
springboot三层架构mapper
飞腾基于Arm架构,打造三大CPU系列
三星确认建厂,用于扩大DRAM、NAND Flash快闪存储器的产能
百度携手新思科技实现芯片早期优化,将缩短运算时间
M1 Mac设备上安装Firefox浏览器的方法
IAR编译器和MAXQ2000评估板使用入门
Modbus IO扫描 三款PLC的串口只能定义IO扫描的一个实例
小米wifi放大器pro 双天线设计信号更强
电子芯闻早报:台积电超前Intel搞定10nm
浅谈变压器骨架加宽的问题
中法意11国专利!呵护150万中国家庭的果蔬
医院养老院UWB人员定位系统方案
哪款PLC最难学?网友纷纷评论,共同分享经验
大联大友尚集团推出基于ST产品的全桥相移DC-DC转换器数字电源方案
智能语音技术将引领人机交互的新模式
区块链对于金融的意义究竟是什么
五一入哪个牌子耳机好?无线主动降噪耳机排行榜
又添一家上市公司,光纤传感领域爆发吸引力
Realme为新款Watch S采用了圆形设计
为何单方面用力的互联网转诊时不时会出现卡顿现象?