
更详细的图(PDF, 284kB)
图1. MAXQ610评估套件
MAXQ610评估套件电路板和JTAG电路板都有很多跳线需要进行配置。在本应用笔记中,应按照表1和表2配置这些跳线。
表1. MAXQ610评估套件的电路板跳线配置
| Jumper(s) | State | Purpose |
| JH1, JH2 | Don't Care | Control RS-232 level shifters FORCEON and active-low FORCEOFF inputs |
| JH3, JH4 | Don't Care | Configure RS-232 transmitter inputs |
| JH20, JH21 | Don't Care | Connect RS-232 receiver outputs to MAXQ610 signals |
| JH18 | Don't Care | Connect RS-232 active-low INVALID input to MAXQ610 control pin |
| JH5 | Connect Pins 1 (Square Pad) and 2 | Connects regulated voltage to MAXQ610 supply |
| JH22, JH23, JH24, JH25 | Closed | Connects MAXQ610 port pins to LEDs |
| JH15, JH16, JH17 | Don't Care | Connect IR circuitry to MAXQ610 pins |
| JH26 | Closed | Uses power from JTAG connection to power the MAXQ610 board |
| JH14 | Closed | Connects board power to MAXQ610 |
| Jumper(s) | State | Purpose |
| JH1, JH2 | Don't Care | External DTR used to control loading the on-board microcontroller. |
| JH3 | Closed | Connects JTAG board's 5.0V supply to JTAG connector pin 8 (feeds target board). |
iomaxq610.h复制到[IAR]MAXQinc
lnkmaxq610.xcl复制到[IAR]MAXQconfig
maxq610.sfr复制到[IAR]MAXQconfig
maxq610.ddf复制到[IAR]MAXQconfig
maxq610.menu复制到[IAR]MAXQconfigdevices 
图2. 工作台启动
图3. 建立一个空的工程
图4. 如图所示,保存工程“blinker”
工作空间将显示“blinker”工程。现在,建立一个新文件(File
New
File),将以下文本复制到该文件中。
#include#include void main() { /* * Try to get a 1Hz blink on the LEDs. System clock = 12MHz. * Timer reload = 0x5B8D = 23437. Running at div 256, so we get a timer * interrupt once every 23437*256 cycles = 5,999,872, or roughly 500ms. * We toggle every 500ms, so we get a 1Hz cycle. */ TB0R = 0x5B8D; // reload for timer 0 TB0CN = 0x0416; // timer set to run, enable interrupt, down count, div 256 PD3 = 0x0f; // set port 2 lower nibble to output IC_bit.IGE = 1; // set global interrupt enable while (1) { } }
在这个简单的应用程序中,采用一个定时器中断来启动使评估套件LED不断接通和关断的代码。要重新装入的值在定时器寄存器中断时自动装入该寄存器,大约每500ms周期性中断一次。设置定时器运行之后,将连接LED的端口引脚配置为输出,然后,全局使能中断。应用程序进入无限while循环。中断服务例程(ISR)代码完成应用程序(请参见下面图5)。
main.c (确定代码保存目录与您建立新工程的目录相同)。在工作窗口下,右键单击“blinker”,选择Add
Add main.c。isr.c和clib.r66。C文件含有中断部分,编译器需要利用它来编译程序。r66文件含有应用程序运行需要的启动代码和标准库代码。每次开始新的MAXQ610工程时,都需要重复这一复制步骤。
Add Files,选择isr.c。
Options,打开选项窗口。请按照以下步骤进行:
clib.r66文件。
Make。您首先会被询问保存工作空间。对此,请输入“gettingstarted”。工程应该被正确构建。
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按钮
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
11111010 )。而这种改变并不需要重新编译程序。首先,我们必须加入一个断点。程序运行时,打开
0101
1010isr.c文件,找到定时器中断矢量。双击代码第一行左侧的灰色区,将出现一个红色X。这一X表示加入了一个断点。当程序执行到这一行代码时,程序将停止,其屏幕显示如图10所示。绿色箭头和高亮显示的代码表示已经到达断点,程序暂停在这里。

图10. 断点设置和到达断点
在寄存器窗口中,从下拉列表中选择Port I/O。注意,代码使用了XOR (^)运算符来触发端口3 (P3)最下面的4个引脚,而这些引脚从未明确设置。为改变这一操作,单击PO3中的数值,输入新值0x05。输入后,您将看到,按照0101的模式,2个LED接通,2个LED关断。现在,单击Run。程序开始运行,直至到达断点而再次停止,LED将转换状态,因此,处理器现在输出1010模式。双击红色X,清除断点,然后,单击Go。程序将以交替LED模式不断运行。
在IAR嵌入式工作台中,您可以按照与寄存器一样的方法来观察并改变变量值。对此进行演示时,单击Stop或者选择Debug
Stop Debugging,停止应用程序。现在,修改代码,在主函数中加入变量x,在while循环中嵌入延时循环。如下所示,输入对程序的一些修改。注意,在代码中故意设置了错误,稍后对它进行讨论。
void main()
{
/*
* Try to get a 1Hz blink on the LEDs. System clock = 12MHz.
* Timer reload = 0x5B8D = 23437. Running at div 256, so we get a timer
* interrupt once every 23437*256 cycles = 5,999,872, or roughly 500ms.
* We toggle every 500ms, so we get a 1Hz cycle.
*/
long int x;
TB0R = 0x5B8D; // reload for timer 0
TB0CN = 0x0416; // timer set to run, enable interrupt, down count, div 256
PD3 = 0x0f; // set port 2 lower nibble to output
IC_bit.IGE = 1; // set global interrupt enable
while (1)
{
for (x=0;x<100000;x++)
{
if (x==100000)
PO3 = PO3 ^ 0x01;
}
}
}
这些改变用于偶尔触发端口3最下面一个引脚,因此,3个LED同步闪烁,而1个将独立闪烁。延时循环间隔并不重要,但是必须提供足够的延时才能观察到结果。运行该应用程序(开始调试,然后,运行),您将很快看到和最初的应用程序并没有什么不同;所有LED以1秒的间隔同时接通和关断。暂停应用程序,打开本地变量观察窗口(View
Locals)。如果程序停在主应用程序的while循环(很有可能)中,窗口中将显示变量x (图11)。
前面曾提到上面的代码中有错误。现在,按下Step Over按钮几次,您将看到执行从循环对比(x<100000)跳到条件测试“if”声明(x ==100000),直到递增(x++),然后是本地窗口中x值的变化。在PO3 = PO3 ^ 0x0199999,单击Step Over几次。您将注意到,由于x=0部分被执行,“for”循环终止,然后再次开始。问题很明显—x值永远不会到达“for”循环中的100000,这是因为进行了“less than”测试。停止程序,将“if”声明中的对比值改为99999。重新编译程序,启动调试器,单击Go。LED开始闪烁,LED DS1自己独立闪烁。

图11. 本地变量窗口
IAR Embedded Workbench是IAR Systems AB的注册商标。
IAR是IAR Systems AB的商标。
MAXQ是Maxim Integrated Products, Inc.的注册商标。
SPI是Motorola, Inc.的商标。
凡《网络安全与数据治理》(原《信息技术与网络安全》)录用的文章,如作者没有关于汇编权、翻译权、印刷权及电子版的复制权、信息网络传播权与发行权等版权的特殊声明,即视作该文章署名作者同意将该文章的汇编权、翻译权、印刷权及电子版的复制权、信息网络传播权与发行权授予本刊,本刊有权授权本刊合作数据库、合作媒体等合作伙伴使用。同时,本刊支付的稿酬已包含上述使用的费用,特此声明。