在建立工程时,Project Explorer窗口(图4)会出现一个新工程,通常位于应用程序窗口的右上。打开它,您将看到两个文件夹,Source Files和System Files。打开Source Files,将看到main.c,这是您的应用程序源代码。双击它,打开。
图4. Project Explorer窗口
现在,输入附录A的应用代码,或者从上面提到的来源中,将代码剪切并粘贴到main.c文件中,替换所有当前内容。
当应用程序执行时,您会看到LED DS1、DS2和DS3 (位于套件电路板原型区左侧)按顺序不断闪烁。而在应用程序运行前,必须首先“构建”它。选择Build
Build WalkLED_demo,或者按下F7。如果一切都正确构建,您将在Output窗口看到消息“Build complete”,它旁边有一个对勾(图5)。如果有错,请确定您输入的代码是否正确。
图5. 工程构建后的输出
现在可以运行应用程序。对此,单击Debug
Build and Debug,程序将启动,不断运行。单击Pause按钮(Break Execution,如代码窗口上面和左侧所示),程序在当前位置暂停,等待用户的下一动作。如果没有Build和Debug选项,找到“targets”窗口;单击Maxim Serial JTAG Adapter;然后,单击Connect按钮(窗口左上角)。这样,通过JTAG电路板连接工具包和评估套件,使能调试功能。工具包调试功能被使能后,单击Step Over按钮就可以开始调试过程,如图6所示。
图6. Step Over按钮
按下Step Over按钮,程序启动后,CrossStudio通过JTAG电路把应用程序下载到MAXQ1850中,Output窗口显示状态消息。应用程序开始运行,然后,在代码第一行停止(左侧空白区显示黄色箭头)。从这一点运行应用程序时,选择Debug
Go (或者单击Play按钮)。现在,请确定MAXQ1850电路板上的LED正在闪烁。您可能希望能够在一定程度上修改应用程序;按照相反的顺序来闪烁LED,或者改变点亮时间,更快或者更慢的闪烁。
使用CrossStudio调试应用程序现在,让我们了解一下MAXQ1850和CrossStudio工具的调试功能。MAXQ1850有内置JTAG引擎,支持在实际芯片上进行调试,从而不需要昂贵的仿真器或者有可能出错的模拟器。注意,MAXQ1850还提供安全锁定机制,在元件锁定时,防止JTAG工作。这样,当MAXQ1850器件用在敏感应用中时,保证了JTAG调试引擎不会带来安全威胁。
考虑WalkLED_demo应用程序。作为一次试验,在main.c函数中,把Delay函数的延时计数从200000改为2000。
for(i=0;i < 2000; i++) ;现在,选择Build
Build and Debug,构建并运行应用程序。工具包会重新构建工程,装入新程序,开始运行。注意,LED为始终点亮状态,而非闪烁状态。
选择Pause按钮(或者选择Debug
Break),程序在当前代码行暂停执行,左侧空白区出现一个黄色箭头。由于程序大部分时间都花在Delay函数的“for”循环上,因此代码很有可能停在这里(参见图7)。
图7. 在Delay函数中,代码停止运行
观察右侧的Locals窗口(如果看不到该窗口,单击Debug
Debug Windows
Locals)。该窗口将显示“i”变量的当前值。现在,按下Step Over按钮。让程序运行一秒,然后,再次按下Pause按钮。您应该看到“i”值增加了。
要退出函数,应该一直按着Step Over按钮,直到循环结束,但这会浪费很长时间。只要按下Step Out按钮(在Step Into按钮的右边,如图6所示),程序一直执行,直到退出Delay函数,返回到其调用函数main.c。
通过设置断点,也可以获得相似的结果。函数main.c中,在调用Delay函数的任一行上设置断点时,单击该代码行左侧的小三角。它将变为红圈(图8)。现在,再次运行应用程序(Debug
Go,或者Play按钮)。应用程序会运行到这一点,然后暂停。
图8. 加入断点
现在,我们了解一下更多的调试功能。按下Step Over按钮几次。每按下一次,C源代码执行一行。您将看到,控制LED的一行代码每执行一次,LED闪烁一下。当暂停在Delay()一行时,按下Step Into按钮(图9)。这会进入该函数,暂停在该函数的第一行。正如前面所演示的,按下Step Out按钮,可以退出Delay()函数。
图9. Step Into按钮
在运行时,还可以改变变量(和寄存器)。点击GO,然后,点击Pause,程序应再次停止在Delay()函数的中间部分。注意“i”值。现在,把“i”设置为1998 (单击“i”显示的数值,高亮后输入1998)。单击Step Into按钮,由于达到了“i”最终值,因此,您会看到循环结束。
以及您感兴趣的其他调试功能:
- Debug Disassembly将同时显示C代码和生成的汇编代码。这样,用户可以进入汇编代码,而不是C代码,执行时,同时显示C代码。
- Debug Debug Windows Call Stack将显示应用程序到达当前位置时所调用的函数。如果在Delay()函数中暂停执行,其显示如图10所示。
- 使用Debug Stop停止调试,观察右侧的Targets窗口。确定Maxim Serial JTAG Adapter Properties以粗体字显示,观察Properties Window下部的信息。如果没有显示Maxim Serial JTAG Adapter Properties,从下拉菜单中选择它。您将看到属性列表及其设置,如图11所示。使用滚动条看到所有信息。Connection标题下的一个属性是Port Name。如果您使用串口,而不是默认的COM1,那么,可以在这里改变这一选项。
图10. 在Delay()函数中运行时调用堆栈
图11. Properties窗口
更多信息软件库和参考设计目前正在由Maxim工程师开发。如果您需要了解库和工具的最新信息,或者对本应用笔记还有其他问题,请联系
microcontroller.support@maxim-ic.com (English only)。
附录A. WalkLED main.c源代码#include
#include #include "WalkLED.h"voidmain(void){ PD1 = 0x62 ; // PD1 = In Out Out In In In Out In PO1 = PO1 & PO1_5_0 ; // U10 Din (P1.5) = 0 PO1 = PO1 | PO1_1_1 ; // U10 CS (P1.1) = 1 PO1 = PO1 & PO1_6_0 ; // U10 SCLK (P1.6) = 0 while (1) { wr_SPI(0x0700) ; // U10 P7 (nLED0) = 0 Delay() ; wr_SPI(0x0800) ; // U10 P8 (nLED1) = 0 Delay() ; wr_SPI(0x0900) ; // U10 P9 (nLED2) = 0 Delay() ; wr_SPI(0x0701) ; // U10 P7 (nLED0) = 1 Delay() ; wr_SPI(0x0801) ; // U10 P8 (nLED1) = 1 Delay() ; wr_SPI(0x0901) ; // U10 P9 (nLED2) = 1 Delay() ; }}voidwr_SPI(short SPI_Dat) // Write data to SPI™ device U10{ int i; PO1 = PO1 & PO1_1_0 ; // U10 CS (P1.1) = 0 for(i=0;i<16;i++) { // Set Din for each data bit if (SPI_Dat < 0) PO1 = PO1 | PO1_5_1 ; // Din = 1 else PO1 = PO1 & PO1_5_0 ; // Din = 0 PO1 = PO1 | PO1_6_1 ; // SCLK = 1 PO1 = PO1 & PO1_6_0 ; // SCLK = 0 PO1 = PO1 & PO1_5_0 ; // Din = 0 SPI_Dat = SPI_Dat << 1 ; // Shift in next bit } PO1 = PO1 | 0x02 ; // CS = 1}voidDelay(void) { // Delay to make LEDs visible int i = 0 ; for(i=0;i < 200000; i++) ; }