标签:嵌入式系统开发,嵌入式开发,http://www.5idzw.com
采用MAXQ610评估套件(EV kit)和IAR嵌入式工作,http://www.5idzw.com
单击save,将文件命名为main.c (确定代码保存目录与您建立新工程的目录相同)。在工作窗口下,右键单击“blinker”,选择Add Add main.c。
下一步,将另外两个文件从软件分配源复制到您的工程目录中:isr.c和clib.r66。C文件含有中断部分,编译器需要利用它来编译程序。r66文件含有应用程序运行需要的启动代码和标准库代码。每次开始新的MAXQ610工程时,都需要重复这一复制步骤。
再次右键单击工作窗口中的“blinker”行,找到Add Add Files,选择isr.c。
现在,需要配置工程选项。选择Project Options,打开选项窗口。请按照以下步骤进行:
如果您希望在此处运行应用程序(例如,Project Debug,然后单击右箭头按钮),电路板上不会有任何事情发生。这是因为应用程序代码试图使用定时器中断来确定LED什么时候应该改变,而定时器的ISR中没有代码。因此,必须为定时器(ISR)编写代码。
打开文件isr.c,找到函数isr6(void),在它旁边应该有注释//timers。在函数中输入以下代码:
现在开始构建工程,进行调试(Project Debug把您带到执行C代码的第一行,如图5所示)。代码第一行下面高亮显示,左侧空白区有一个箭头,指示程序在此暂停。现在,单击Run按钮(图6)。该按钮使程序运行至结束(或者到下一个断点)。当程序执行无限循环时,LED块在一直闪烁。
图5. 程序在代码第一行暂停
图6. 程序Run按钮
返回到最初的blinker应用程序,开始上面介绍的调试过程。第一行高亮显示后,点击Go按钮,继续执行。您将看到LED接通500ms,然后关断500ms。
单击Break按钮,或者选择Debug Break,暂停执行(图7)。程序应暂停在while(1)声明上,这是因为该声明占用了无限循环的大部分运行时间,而中断矢量只占用了很少的时间(每500ms只有几个周期)。
图7. Break按钮
在检查一些处理器寄存器中的数值时,打开寄存器窗口(View Register)。此处,从下拉菜单中选择Timer 0,您将看到与定时器控制闪烁LED相关的寄存器(图8)。这里显示的Timer 0寄存器包括重装寄存器(TB0R),控制寄存器(TB0CN),计数寄存器(TB0C)和数值寄存器(TB0V)。
图8. Register窗口显示Timer 0寄存器
作为演示,我们将执行几行代码,观察这些定时器寄存器会有什么变化。按下Step Over按钮几次(图9),或者选择Debug Step Over。观察TB0V中的数值。Step Over按钮执行一行C代码,但是不会进入任何函数调用。该按钮按下时,您将看到TB0V中的数值变化范围很大,这是因为调试引擎执行时,定时器在不断运行。您还将看到,TB0CN寄存器随着定时器中断出现和结束的变化。
图9. Step Over按钮
寄存器窗口不但显示了寄存器内容,而且,在调试进程中,还可以向其写入数值。程序暂停时,双击TB0R寄存器中的数值。将寄存器改为0x2DC6 (这是0x5B8C/2),然后,单击Go按钮。LED现在闪烁应比以前快两倍,这是因为定时器重新装入的计数值减小了,从而减小了定时器中断之间的时间。
在另一个演示中,我们把光闪烁模式由全通/全关(1111 0000 1111)改为交替模式(1010 ,采用MAXQ610评估套件(EV kit)和IAR嵌入式工作
单击save,将文件命名为main.c (确定代码保存目录与您建立新工程的目录相同)。在工作窗口下,右键单击“blinker”,选择Add Add main.c。
下一步,将另外两个文件从软件分配源复制到您的工程目录中:isr.c和clib.r66。C文件含有中断部分,编译器需要利用它来编译程序。r66文件含有应用程序运行需要的启动代码和标准库代码。每次开始新的MAXQ610工程时,都需要重复这一复制步骤。
再次右键单击工作窗口中的“blinker”行,找到Add Add Files,选择isr.c。
现在,需要配置工程选项。选择Project Options,打开选项窗口。请按照以下步骤进行:
- 在General选项下:Target,选择MAXQ610。
- 在General选项下:Library Configuration,从下拉菜单中选择Custom CLIB。浏览Library File文本区,选择刚刚复制到工程目录中的clib.r66文件。
- 在Debugger下:Setup,从driver下拉菜单中选择JTAG。
- 在JTAG下:输入您将使用的连接JTAG电路板的串口。
如果您希望在此处运行应用程序(例如,Project Debug,然后单击右箭头按钮),电路板上不会有任何事情发生。这是因为应用程序代码试图使用定时器中断来确定LED什么时候应该改变,而定时器的ISR中没有代码。因此,必须为定时器(ISR)编写代码。
打开文件isr.c,找到函数isr6(void),在它旁边应该有注释//timers。在函数中输入以下代码:
TB0CN = TB0CN & 0xFF7F; // clear timer 0 interrupt PO3 = PO3 ^ 0x0f; // toggle lower nibble这些代码首先清除定时器中断标志(必须由软件清除中断标志,否则,将导致中断矢量不断启动)。第二行触发所有4个LED,这些LED连接到端口引脚P3.0至P3.3。
现在开始构建工程,进行调试(Project Debug把您带到执行C代码的第一行,如图5所示)。代码第一行下面高亮显示,左侧空白区有一个箭头,指示程序在此暂停。现在,单击Run按钮(图6)。该按钮使程序运行至结束(或者到下一个断点)。当程序执行无限循环时,LED块在一直闪烁。
图5. 程序在代码第一行暂停
图6. 程序Run按钮
使用IAR嵌入式工作台调试应用程序
现在,我们看一下MAXQ610和嵌入式工作台工具的调试功能。MAXQ610处理器有内置JTAG引擎,支持在实际芯片中进行调试。这一特性还避免了使用昂贵的模拟器或者有可能出错的仿真器。返回到最初的blinker应用程序,开始上面介绍的调试过程。第一行高亮显示后,点击Go按钮,继续执行。您将看到LED接通500ms,然后关断500ms。
单击Break按钮,或者选择Debug Break,暂停执行(图7)。程序应暂停在while(1)声明上,这是因为该声明占用了无限循环的大部分运行时间,而中断矢量只占用了很少的时间(每500ms只有几个周期)。
图7. Break按钮
在检查一些处理器寄存器中的数值时,打开寄存器窗口(View Register)。此处,从下拉菜单中选择Timer 0,您将看到与定时器控制闪烁LED相关的寄存器(图8)。这里显示的Timer 0寄存器包括重装寄存器(TB0R),控制寄存器(TB0CN),计数寄存器(TB0C)和数值寄存器(TB0V)。
图8. Register窗口显示Timer 0寄存器
作为演示,我们将执行几行代码,观察这些定时器寄存器会有什么变化。按下Step Over按钮几次(图9),或者选择Debug Step Over。观察TB0V中的数值。Step Over按钮执行一行C代码,但是不会进入任何函数调用。该按钮按下时,您将看到TB0V中的数值变化范围很大,这是因为调试引擎执行时,定时器在不断运行。您还将看到,TB0CN寄存器随着定时器中断出现和结束的变化。
图9. Step Over按钮
寄存器窗口不但显示了寄存器内容,而且,在调试进程中,还可以向其写入数值。程序暂停时,双击TB0R寄存器中的数值。将寄存器改为0x2DC6 (这是0x5B8C/2),然后,单击Go按钮。LED现在闪烁应比以前快两倍,这是因为定时器重新装入的计数值减小了,从而减小了定时器中断之间的时间。
在另一个演示中,我们把光闪烁模式由全通/全关(1111 0000 1111)改为交替模式(1010 ,采用MAXQ610评估套件(EV kit)和IAR嵌入式工作