应用笔记 3561

MAX-IDE入门


摘要 : MAX-IDE是为MAXQ系列微控制器开发的全功能开发和调试环境。MAX-IDE可以配合各种标准MAXQ®评估板工作,提供项目级的开发环境、对于标准MAXQ调试功能的访问、一个集成的宏汇编、以及在线应用装载功能(通过JTAG接口)。

简介

MAX-IDE是为MAXQ微控制器系列提供的功能完备的开发和调试环境。它能够与所有标准MAXQ评估板配合工作,具有以下特性。

  • 用于MAXQ汇编应用的项目级开发环境
  • 集成的MAXQ宏汇编器,包括适用于所有MAXQ微控制器的标准头文件
  • 采用JTAG/TAP接口和ROM引导装载器提供在线应用装载(适用于带有闪存或者EEPROM程序存储器的MAXQ微控制器)
  • 通过JTAG/TAP接口实现在线调试,包括断点、单步运行和存储器/寄存器查看
参考资料
详细信息请参考MAXQ2000评估板数据资料,可从评估板所附的CD或在线获取该数据资料。

安装MAX-IDE

系统要求

  • 操作系统:Windows® 98, Windows NT, Windows 2000, Windows ME或者Windows XP®
  • 至少一个未用的串行COM端口(用于与MAXQ评估板通信),或者一个USB至串口适配器和一个未用的USB端口。

运行安装程序

  1. MAX-IDE的安装包为MAX-IDE.zip
  2. 下载该安装包,解压缩,然后运行setup.exe,将MAX-IDE安装到您的硬盘上。
  3. 在InstallShield对话框中,选择典型安装,安装评估板MAXQ开发所需要的全部文件。
  4. 安装完成后,可以从开始菜单启动MAX-IDE。

MAX-IDE安装的文件

MAX-IDE的主执行程序和帮助文件位于MAX-IDE根目录下,默认路径为{Program Files}\MAX-IDE。其他文件在以下子目录中。

  • Compilers子目录含有MAX-IDE安装的所有编译器和汇编器的可执行程序和数据文件。至少包含标准MAXQ汇编器;也可能会安装一些其它汇编器和编译器,和你的获得渠道有关。
  • Devices子目录含有库、驱动程序和配置文件,用于将应用定位于各种MAXQ微控制器和评估板,并完成它们之间的通信。
Examples子目录含有代码实例(<device directory>/xxx_Demo),以及所有MAXQ微控制器的标准包含文件和库(<device directory>/api)。

设置JTAG接口

JTAG适配板

通过一个专用的JTAG测试访问端口(TAP),MAX-IDE与MAXQ微控制器的引导装载程序和调试引擎接口,这个测试口符合JTAG IEEE标准1149。该接口由以下信号组成(它们通常与端口引脚复用):TMS (测试模式选择)、TCK (测试时钟)、TDI (测试数据输入)和TDO (测试数据输出)。

图1显示了串口-JTAG适配器(包含于所有MAXQ微控制器评估板中)是如何连接PC串行COM口和MAXQ微控制器的JTAG口的。

图1. 用于MAXQ的串口-JTAG接口。
图1. 用于MAXQ的串口-JTAG接口。

JTAG接口信号和电缆

JTAG适配器通过10芯带状电缆和2 x 5、0.100"间距的接插件与MAXQ评估板连接。该电缆传输的信号列在下面表1中。

表1. JTAG接口信号
Pin Number Signal Type Signal Name Signal Description
1 Input to MAXQ TCK JTAG/TAP Test Clock
2 Ground GND Ground
3 Output from MAXQ TDO JTAG/TAP Test Data Out
4 Reference VREF Supplied by MAXQ kit to set the reference level for JTAG signals output by the Serial-to-JTAG board
5 Input to MAXQ TMS JTAG/TAP Test Mode Select
6 Input to MAXQ nRST Open-drain drive, connected to MAXQ reset line
7 None KEY Keyed pin for JTAG cable alignment
8 Power VCC5 +5.0V (±5%) supply provided by JTAG board
9 Input to MAXQ TDI JTAG/TAP Test Data In
10 Ground GND Ground

连接评估板

根据所采用的评估板类型,需要对JTAG适配板、评估板或者两者供电。此处给出两个电路板的简要设置方法(表2);更详细的说明请参考评估板数据资料。注意,无论是JTAG适配板还是MAXQ评估板,所用的电源均为直流电源,中心为正。

表2. 评估板设置
Evaluation Kit JTAG Power Supply Kit Power Supply Jumper Settings JTAG Header
MAXQ2000 5V, ±5% None JTAG—Close JH1, JH2, JH3Kit—Close JU11; Close 1+2 on JU1, JU2, JU3 J4

使用MAX-IDE时,请按照以下步骤设置MAXQ评估板和JTAG适配板(图2):

  1. 如上所述将电源接到JTAG适配板。
  2. 如上所述设置评估板和JTAG适配板的跳线。可能还需要根据评估需要设置评估板上其他的跳线或者DIP开关;更详细的信息请参考评估板数据资料。
  3. 连接2 x 5 10芯带状电缆到JTAG适配板上的P2插座和评估板上的对应插座。连接器仅能从一个方向连接;否则,请确定红线连接至两个插座相同编号的引脚。
  4. 使用直通串行电缆将JTAG适配板上的J1连接至PC COM端口。
  5. 打开所有电源。
图2. MAXQ2000评估板和JTAG适配板。
图2. MAXQ2000评估板和JTAG适配板。

在MAX-IDE中建立项目

建立一个新的MAXQ汇编项目

按照以下步骤,在MAX-IDE中建立一个新的MAXQ汇编语言项目:

  1. 从MAX-IDE菜单选择Device → MAXQ JTAG
  2. 选择Project → New Project。建立一个未命名的项目。
  3. 选择Project → Save Project As。选择您希望保存项目(.prj 文件)的位置。
  4. 要建立一个新的汇编代码文件,可选择File → New File。在文件中输入汇编代码后,选择File → Save As,在你的项目目录下保存新建立的.asm文件。下一步,选择Project → Add Files,选择新建的文件,加入到项目中。
  5. 要将已有的汇编代码文件加入到项目中,选择Project → Add Files,然后选择要加入的文件。
  6. 不必将包含文件加入到项目中,汇编过程会自动读入包含文件。
MAXQ2000的一个汇编文件实例如下:

$include (..\api\maxQ2000.inc)

org 0000h

main:
    jump  $

end
以上$include行因包含文件的位置而异。关于$includeorg伪指令的详细信息,请参考本文档的“使用MAX-IDE汇编器”一节。

关于汇编和包含文件的说明
  • 全体MAXQ微控制器共有的系统寄存器(例如累加器、数据指针和循环控制寄存器)已在MAX-IDE汇编器中进行了预定义。外设寄存器因器件而异,必须在包含文件中定义。用于各种MAXQ微控制器的标准包含文件随MAX-IDE一起被安装;上例中的包含文件是用于MAXQ2000的。
  • 预处理伪指令(例如等同、定义和宏)不会在一个项目内的不同文件之间传送。如果一个MAX-IDE汇编项目含有一个以上的汇编文件,各汇编文件必须含有它要用到的预处理伪指令或者文件包含伪指令。
  • 不管项目中有多少汇编文件,每个文件的最后必须有"end"声明。
  • 不要在包含文件中加入"end"声明。
  • 项目中含有多个汇编文件时,所有文件中的所有标识符都为公用的;即,任何汇编文件中的代码都可以调用或引用同一项目中任何其他汇编文件中的例程或标号。

打开一个已有的项目

要打开一个以前建立的MAX-IDE项目,只需从菜单中选择Project → Open Project,然后选择你希望打开的.prj文件。注意,如果JTAG适配板和评估板没有正确连接和上电,打开MAXQ JTAG项目时可能会产生错误信息。

当一个项目已经建立或者打开后,该项目中的汇编代码文件将被列在左侧的面板上。双击文件名可以将其打开,以便在MAX-IDE中进行编辑,如下面的图3所示。

图3. MAX-IDE项目环境
图3. MAX-IDE项目环境

运行和调试代码

编译项目

要编译项目文件,从菜单中选择Debug → Make或者Debug → Build All,或者点击工具条上这些命令的快捷按钮,或者按下F7 (作用与Make相同)。MAXQ编译器运行,如果没有错误,消息窗口中将出现"Compiling...Build Successful."。构建过程中的任何错误将会出现在消息窗口中。

运行项目

项目被成功编译后,可以采用以下方法之一,在调试器中执行该项目。

  1. 选择Debug → Run (F5)后,编译后的项目代码通过JTAG接口被装入MAXQ微控制器并启动运行。程序将持续运行,直到选择了Debug → Stop (Shift+F5)、点击Pause按钮或者程序执行到断点为止。
  2. 选择Debug → Step Into (F11)后,编译后的程序被载入,在源代码的第一行暂停程序执行。
  3. 选择Debug → Run to Cursor (Control+F10)后,编译后的程序被载入,并开始运行,直到程序运行到编辑窗口中光标所在的行,或者遇到断点,先到者为准。如果光标不在源代码行上,选择该选项将导致错误。
断点用来使程序运行到预定位置时暂停下来,可以采用以下三种方法之一设置或清除。

  • 将光标移到您希望建立断点的行,选择Debug → Toggle Breakpoint
  • 将光标移到您希望建立断点的行,点击工具条上的禁行灯图标。
  • 在编辑窗口中,单击您希望建立断点的行号。
注意,可以将断点设在没有源代码的行上,但是这不会起作用。MAXQ微控制器支持一次设4个断点;如果选择Run to Cursor,这将占用一个断点,因此,在这种情况下,只能设置3个断点。

选择Debug → Stop,或者单击工具条上的Stop图标,将完全停止程序运行。但是,如果停止在第一行(Step Into)、光标行(Run to Cursor)或者设置了断点的行,接下来还可以使用单步模式运行程序。也可以通过单击Pause按钮进入单步模式。在该模式下,以绿色箭头标志当前运行所处的位置,可使用下列命令:

  • Debug → Step Into (F11), Debug → Step Over (F10)和Debug → Step Out(Shift+F10),在汇编调试模式下,这些命令的作用相同,即执行单个指令,将执行点转至下一指令。
  • Debug → Run,从当前位置开始运行,直到下一个断点,如上所述。
  • Debug → Run To Cursor,从当前位置开始运行,直到光标所在的行,如上所述。
注意,运行在汇编语言调试模式时,Debug菜单下的High-Level DebugLow-Level Debug设置不起作用。

显示和编辑处理器寄存器

程序装入并执行了至少一条指令后,就可以利用调试器来查看和编辑MAXQ微控制器的寄存器。选择Window → Show → Registers将显示寄存器组。随着调试器中代码的执行,这些寄存器中的数值将随之更新。双击可写寄存器的数值区可以对其进行编辑,可以输入十六进制、十进制或二进制的新值。

使用MAXQ2000评估板时应注意:如果装配了LCD子板,不要手动编辑PO0, PD0, PO1, PD1, PO2, PD2, PO3或者PD3寄存器的值。当带有LCD时,这些引脚上的静态输出会损坏LCD。

显示和编辑处理器存储器

程序装入并至少执行一条指令后,就可以查看和编辑MAXQ微控制器的内部存储器了。选择Window → Show → Memory将显示内部存储器。通过显示窗口中的下拉列表,你可以选择查看代码、数据或者堆栈存储器。代码和堆栈区用16位宽显示,数据区用8位宽显示。数据和堆栈区的存储器值可以编辑,双击某个存储器位置并输入新值即可。

使用MAX-IDE汇编器

MAX-IDE提供一个多道汇编器,用于开发MAXQ汇编语言应用程序。该汇编程序含有一个单道预处理器,能够使用包含文件、符号等式、条件汇编和宏。汇编器和预处理器完全集成在MAX-IDE环境中。

有关如何使用宏以及其他预处理伪指令的举例,请参考'Macro'实例项目。

一般语法

MAXQ汇编器和预处理器均对大小写不敏感。汇编语句遵循以下格式:

[label:]   [opcode   [parameter [, parameter]]]    [;comment]
如以下代码:

main:
move   Acc, A[2]             ; copy A[2] to active accumulator
标志符(例如上面的'main'标号)可以含有字符[a-zA-Z_?$0-9],但是不能以0-9数字开始。其长度可以达到127个字符。

请参考MAXQ系列用户指南,了解MAXQ微控制器系列的体系结构、指令集、寻址模式和核心寄存器的详细说明。

源文件

项目编译时,MAX-IDE项目窗口列出的所有汇编源文件(.asm)将按照窗口中文件列出顺序进行汇编。没有提供链接器,因此,在汇编多个文件时,就如同它们被合并到单个文件中进行汇编一样。

源文件可以包含伪指令、等同/定义、宏、条件汇编模块和声明等。任何源代码文件的最后一行必须为END伪指令:

end

包含文件

不必刻意添加包含(.inc)文件到项目中。它们可以由“include”伪指令自动读入和解析,就如同包含文件的全部文本被加入到源文件中“Include”伪指令所在的位置一样。

(source file):                        (equates.inc):
$include(equates.inc)        --->     MASK1  equ  0FFh
                                      MASK2  equ  0FEh
(resume parsing in source    <---
file)
包含文件可以含有“include”伪指令、等同、宏和DB/DW数据声明,但是不能含有汇编子程序。包含文件不必结束于END伪指令。

MAX-IDE为每种MAXQ微控制器提供标准包含文件,在其中定义了该类微控制器的外设寄存器组,以及应用ROM所提供函数的地址。这些包含文件可用于所有汇编语言项目;它们位于MAX-IDE主安装目录的Examples子目录中。

常数

语句或等同说明中作为立即数的常数可以采用以下四种格式之一。

  • 十进制(默认)—以非字符或'd'结尾。例如:10, 07d
  • 二进制—以'b'结尾。例如:01b, 1101101b
  • 十六进制—以0-9数字开始,以'h'结尾。例如:10h, 09FFEh
  • 单字符—转换为一个字节的ASCII值。例如:'A'
以下运算符也可被用于常数和等同说明;在常数被解析之前,这些表达式在预处理阶段被赋值。

   move    Acc, #(1+1)         ; 2 : Addition
   move    Acc, #(4-1)         ; 3 : Subtraction
   move    Acc, #(2*2)         ; 4 : Multiplication
   move    Acc, #(25/5)        ; 5 : Division (truncated to integer)

   move    Acc, #(MIN(6,7))    ; 6 : Minimum of two values
   move    Acc, #(MAX(6, 7))   ; 7 : Maximum of two values
   move    Acc, #'A'           ; ASCII value of 'A'

   move    Acc, #(550h | 055h) ; 555h  : Logical OR
   move    Acc, #(550h & 055h) ; 050h  : Logical AND
   move    Acc, #(550h ^ 055h) ; 505h  : Logical XOR
   move    Acc, HIGH(#1234h)   ; 12h   : Select high byte of word
   move    Acc, LOW(#1234h)    ; 34h   : Select low byte of word
   move    Acc, NOT(#0000h)    ; FFFFh : Bitwise negation
   move    Acc, #001h << 7     ; 080h  : Shift left
   move    Acc, #080h >> 7     ; 001h  : Shift right

等同

等同说明,即EQU伪指令,用来在任何使用常数的地方代替数字常数。可以使用任何格式和上面所提到的常数运算符。标号不被认作常数。

ONE equ 01
TWO equ 02

   move    Acc, #ONE
   move    Acc, #(ONE+TWO)
等同也可以被后面的等同说明引用。

ONE equ 01
TWO equ ONE+ONE

定义

定义伪指令支持C风格的直接文本替换,不需要额外的处理,常用于包含文件中定义外设寄存器。替换文本被限制为单行;不支持接续符。不支持C风格的宏。

#define PO[0] M0[0]

move    Acc, PO[0]           ; Parses as 'move Acc, M0[0]'

数据声明

DB和DW伪指令用于在十六进制文件的当前位置插入原始数据字节(包括来自于字符串值的数据字节)或字。

db   055h, 0AAh, 055h, 0AAh    ; byte values
dw   0AAAAh, 05555h            ; word values
db   "MAX-IDE Environment "    ; byte value for each char (padded to even count)
注意,这些数据将被插入到代码空间中。因此,如果DB声明出现在两组指令之间,那么定义的字节数必须是偶数,以免发生字对齐汇编错误。

条件汇编

只有符合某些布尔条件时,才对某块代码进行汇编。具有以下格式。

IF (<boolean statement>)
   statements
   ...
ENDIF
布尔表达式可以由常数、等同或者以下布尔运算符组成:=, !=, <, <=, > 和 >=。在条件汇编代码块中只能有代码和包含语句,而不能有宏或者等同说明。

DEBUG equ 0
DOINC equ 1

IF (DEBUG != 0)
   call RoutineDbg
ENDIF

IF (DEBUG = 0)
   call Routine
ENDIF

IF (DOINC = 1)
$include(defines.inc)
ENDIF

一段代码所执行的功能可以用宏来表示,每当该功能被调用时,它被当地展开并汇编。它们具有以下格式。

<identifier> MACRO [[PARAM <parm1>] [whitespace AND/OR comma] [<parm2>] ...]
[LOCAL <local1> [whitespace AND/OR comma] [<local2>] ...]
<macro assembly statements, local labels>
...
ENDM
最简单的一类宏仅是在其被引用时,将其代码插入。所插入代码中的等同、定义和嵌套的宏调用等均按常规方式处理。

ThreeNops MACRO
   nop
   nop
   nop
ENDM

ThreeNops        -->      nop
                          nop
                          nop

宏可以具有一个或多个参数,在引用宏时传递数值给它们。这些数值被传递给展开后的代码。下面的宏采用一个参数为任一可写寄存器(Acc除外)提供'INC'功能,只需占用一级堆栈空间。

Inc MACRO PARAM Register
   push    Acc
   move    Acc, Register
   add     #1
   move    Register, Acc
   pop     Acc
ENDM

Inc LC[0]        -->         push Acc
                             move Acc, LC[0]
                             add  #1
                             move LC[0], Acc
                             pop  Acc

宏也可以含有局部标识符,代码展开后对其重新命名,这样每次引用宏时它们各不相同。

LoopN MACRO PARAM Count
LOCAL L1
   move    LC[0], Count
L1:
   djnz    LC[0], L1
ENDM
在引用这个宏时,插入其代码时标号'L1'将被更改为一个不同的临时标号。