应用笔记 3698

Rowley CrossWorks和MAXQ2000评估板入门


摘要 : MAXQ2000是功能强大的低成本、低功耗微控制器,具备支持多种应用系统的丰富外设。Rowley Associates提供了强大的MAXQ开发环境CrossWorks,在该工具的支持下,可以用C语言编写复杂应用程序并进行调试。本应用笔记说明了如何设置MAXQ2000评估板以及CrossWorks工具的使用入门。作为应用实例,利用LCD显示一个简单计数器,以演示MAXQ2000评估板和CrossWorks的功能。

概述

MAXQ微控制器开发平台得到Rowley Associates的CrossWorks编程工具的支持。本应用笔记说明怎样使用CrossWorks v.1.0和MAXQ2000评估板来创建、构建和调试面向MAXQ平台的C应用程序。这些说明对以后的CrossWorks版本仍然适用。MAXQ2000微控制器的特性会在下面的“设置”部分进行说明。

设置MAXQ2000评估板

写代码前,必须先连接MAXQ2000评估板。

评估板包括3块电路板,其中一块带有小型LCD屏。图1为连接有LCD子板的最大电路板,这就是实际的MAXQ2000评估板,稍后我们将进行讨论。将LCD连接到MAXQ2000评估板(见图1)上标号为J3的接头上。

图1. 安装了LCD板的MAXQ2000评估板
图1. 安装了LCD板的MAXQ2000评估板

MAXQ2000加载器和调试引擎使用JTAG协议进行通信。因为实际上没有用于个人计算机的商业、通用JTAG适配器,所以Dallas Semiconductor提供了一个串口-JTAG转换电路板,即第三块电路板。使用评估板带的小型10芯电缆,将MAXQ2000评估板上标号为J4的接头与JTAG板上标号为P2的接头连接。见图2。注意,连接器红色一侧对应两个板上的引脚1和2。

图2. MAXQ2000评估板与JTAG板连接
图2. MAXQ2000评估板与JTAG板连接

MAXQ2000评估板上应该有3个跳线。连接头JU1的引脚1和2应使用跳线相连。同样,JU2的引脚1和2,以及JU3的引脚1和2也应使用跳线相连。另外,确保高频晶振安装在Y1上(靠近电路板上的微控制器)。本应用笔记的演示代码假定采用16MHz晶振,评估板上安装了该晶振。JTAG电路板应该也在JH1、JH2和JH3接头上安装了3个跳线。

该设置还需要一个中心为正的5V ±5%直流电源。关于电源要求的更多信息请参考MAXQ2000评估板文档。将电源连接到JTAG板的电源插孔J2上。

最后,将PC串口与JTAG板相连。使用常规的9芯直通串口电缆,将计算机的一个串口与JTAG板的串口相连。注意:不要连接到MAXQ2000评估板上的串口。图3所示为正确连接。

图3. 串口电缆与JTAG板的正确连接
图3. 串口电缆与JTAG板的正确连接

现在可以开始使用CrossWorks工具了。

在CrossWorks中创建MAXQ2000工程

Rowley Associates为MAXQ提供全功能CrossWorks (30天评估许可),可以从www.rowley.co.uk/maxq/index.htm下载。按照提示安装,安装位置和其它选项选择缺省值。注意,Rowley Associates的MAXQ CrossWorks目前只有基于Windows平台的版本。需要发电子邮件给Rowley Associates,索取30天产品激活密钥,才能继续安装。遵循Rowley Associates网站“支持” (Support)栏的指导说明:评估CrossWorks (Evaluating CrossWorks)。

安装完成后,按下列操作运行MAXQ CrossWorks,从开始菜单起,依次选择Rowley Associates Limited,然后CrossWorks MAXQ 1.0,最后CrossStudio。主窗口打开后会显示CrossWorks的功能概要。

创建工程时,首先选择File,然后是New,再选择New Project。在出现的对话框中,从模板中选择C Executable,输入新工程的名称和位置,点击OK (见图4)。

图4. 新工程选项对话窗口
图4. 新工程选项对话窗口

在接下来的工程设置对话框(见图5)中,确认Target Processor选项为MAXQ2000。其它设置可以保留缺省值。点击Finish产生新的MAXQ2000工程。

图5. 新工程设置对话窗口
图5. 新工程设置对话窗口

随后,需要输入足够的代码,让MAXQ2000评估板做一些有趣的事情。如果工程管理器窗口没有打开,选择View,然后选择Project Explorer打开它。现在可以在工程管理器窗口内双击打开main.c文件。输入下列代码(先将main.c原来的代码删除)。
#include <MAXQ2000.h>

void main(void)
{
  int i = 0;
  int j = 0;
  int k = 1;

  LCRA = 0x03E0;    // Set LCD configuration
  LCFG = 0xF3;     // Set up all segments as outputs, normal operation
             //  mode, and enable display.
  while (1) {
   for (i = 0; i < 500; i++) {
     for (j = 0; j < 500; j++) {
      // delay loop
     }
   }
   k = (k << 1);
   if (k == 64) {
     k = 1;
   }
   LCD0 = k;
   LCD1 = k;
   LCD2 = k;
   LCD3 = k;
  }
}
输入上述代码后,确认MAXQ2000评估板和串口-JTAG板按照上述说明连接完毕和上电。CrossWorks窗口底部的状态栏应指示MAXQ Serial to JTAG,旁边有一黄灯。但是,如果指示Disconnected,旁边带有灰灯,就要通过选择Target,随后选择菜单中的Connect MAXQ Serial to JTAG来连接串口-JTAG板。

一旦串口-JTAG板连接就绪后,选择Build,然后选择菜单的Build and Run,以创建并执行工程代码。在输出窗口应出现以Verify Completed为结尾的一串消息;MAXQ2000评估板上的LCD段显示器应该随着代码的运行而显示变换信息。

上述代码演示了MAXQ CrossWorks的多种功能。第一,MAXQ2000的所有寄存器都在包含文件MAXQ2000.h中预先定义。CrossWorks出厂时在目录%Program Files%\Rowley Associates Limited\CrossWorks MAXQ 1.0\include下包含该文件。工程编译时自动搜索该目录,所以不必将MAXQ2000.h复制到包含工程的目录下。

工程里包含MAXQ2000.h文件后,代码就可以直接通过C语言访问所有MAXQ2000内部寄存器,如上所述,这些寄存器为LCRA、LCFG、LCD0、LCD1、LCD2和LCD3。MAXQ2000支持的全部系统和外设寄存器列表参见MAXQ2000用户指南补充资料 (English only)。

注意:名称中包含内置括号的寄存器,如A[0]和DP[0],在CrossWorks中必须用带下划线的名称引用,如A_0和DP_0。另外,可能不能直接用C代码设置独立的寄存器位,例如,不允许出现IMR.0 = 0的情况。

MAXQ2000评估板的功能

在进一步了解CrossWorks调试器之前,我们再创建一个更复杂的应用程序,来展示MAXQ2000评估板的一些功能。本实例代码可以下载

本应用程序在LCD上显示运行的计数器值,象秒表一样进行连续递增或递减计数。计数器值达到19999 (LCD可显示的最大值)时反转。MAXQ2000评估板上的两个按钮编程为本应用程序的控制开关:
  • 按SW5使计数器值复位至0000。
  • 按SW4使计数器反向。如果原先递增计数,将变为递减计数,反之亦然。如果计数值低于0,就反转到19999。
要改变应用程序代码,右键单击工程管理器窗口内的main.c,在弹出菜单中选择Remove。下一步,右键单击Source Files,选择Add Existing File。选择从上述链接下载的demo2000.c文件。文件添加到工程后,选择Build,再选择菜单中的Build and Run。新的应用程序将编译、下载并在MAXQ2000评估板上运行。应用程序开始运行后,检查确认除SW6.2和SW6.5打开外,板上所有DIP开关都应关闭。

现在可以演示MAXQ2000评估板的一个更有用的性能,即复位(RESET)按钮。在MAXQ2000评估板的左下侧有一个标注为SW2和RESET的开关。按下此按钮,观察LCD屏。读数应该立即从0重新开始。该RESET按钮连接至MAXQ2000的复位引脚。如果需要重新启动应用程序,就按此按钮。

初始化MAXQ2000的LCD控制器

MAXQ2000提供一个液晶显示(LCD)硬件控制模块,可运行在全偏压、1/2偏压和1/3偏压模式下,实现静态、x2、x3或x4复用显示方式。也就是说,在x4复用显示器上,MAXQ2000-RAX (COM0到COM3,SEG0到SEG32)上可专用于LCD驱动功能的37条线最多可驱动132个LCD段(33段X 4个公共信号)。

每个打开的LCD段都需要连续的电压波形来驱动,该电压波形由连接该段的段线和公用信号线提供。驱动电压波形使各段按要求打开或关闭,而不会产生可能损坏LCD的直流偏压。MAXQ2000的LCD控制器在后台自动产生这些电压波形。也就是说,当LCD的显示段发生改变时,只需要修改LCD控制器的寄存器内容。

如上例,第一步是初始化用于控制显示的LCD控制器寄存器。
void initLCD(void)
{
  LCRA = 0x03E0;    // Set LCD configuration
  LCFG = 0xF3;     // Set up all segments as outputs, normal operation
             //  mode, and enable display.
}
LCRA寄存器控制3项重要功能:显示形式,本例中为静态;VADJ和地之间的可调电阻,用来修改显示对比度;以及LCD段驱动波形的频率。LCFG寄存器控制LCD控制器的开/关,并控制哪些两用引脚作为端口引脚使用,哪些用作LCD段。

向显示器写入数值

各LCD段分别由一个LCD控制显示寄存器的一位进行控制,与使用的LCD类型和多路复用方式无关。此位置高就打开(黑)该段;清除此位就关闭(透明)该段。我们的MAXQ2000评估板所用的LCD段与存储器映射关系,如图6所示。

图6. LCD段与LCD显示存储寄存器位的映射关系
图6. LCD段与LCD显示存储寄存器位的映射关系

LCD的各位占用一个LCD显示存储寄存器,各个位的分布形式相同。因此,我们可以使用查找表,找到各位0到9的段寄存器值,并将该数值写到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
};


/******************************************************************************
 * Returns the value that will need to be placed in one of LCD0-LCD3 to display
 * a digit 0-9. No bounds checking is done here. If you ask for a digit other
 * than 0-9, you will get a bogus display.
 */
int getLCDDigit(int digit)
{
  return PATTERNS[digit];
}
这些程序准备好后,我们可以采用以下方法,向显示器写入计数器值(4位,特殊情况下“1”对应第5位):
int show(int value)
{
  if (value >= 10000)
   LCD4 = 0x40;
  else
   LCD4 = 0;
  LCD3 = getLCDDigit((value / 1000) % 10);
  LCD2 = getLCDDigit((value / 100) % 10);
  LCD1 = getLCDDigit((value / 10) % 10);
  LCD0 = getLCDDigit((value) % 10);
  return 0;
}

去抖按钮输入

按钮SW4和SW5是本应用程序的另外两个人机交互元件,分别通过DIP开关部件SW6与端口引脚P5.2和P7.1相连。(RESET开关不需要编程支持,它直接与MAXQ2000低电平有效复位引脚连接)。

所有MAXQ2000端口引脚(对应JTAG 接口的P4.0到P4.3除外)的上电缺省模式都为输入模式,端口引脚和VDDIO之间具有内部弱上拉。SW4和SW5开关的连接方式是当按下时将端口引脚拉到地,因此端口引脚已经是我们需要的配置方式了。端口引脚状态可以非常简单地通过检查端口引脚输入位(SW4为PI5.2,SW5为PI7.1)来获得;位值为0时表示按钮按下,为1时表示按钮松开。

然而,因为这些开关是机械结构的,所以单次按下操作可能造成多次0到1的转换。为避免这种情况发生,可以使用已有的主循环和延迟作为功能模块,实现一些简单的去抖操作。
while(1)
{
  for (i = 0; i < 32000; i++)
  {
   // just a delay loop
  }
  show(counter);

  if (((PI5 & 0x04) == 0) && (debounce1 == 0)) {
   inc *= -1;
   debounce1 = 20;
  }

  if (((PI7 & 0x02) == 0) && (debounce2 == 0)) {
   counter  = 0;
   debounce2 = 20;
  }

  counter += inc;
  if (counter  > 19999) { counter = 0;   }
  if (counter  < 0)   { counter = 19999; }

  if ((debounce1 > 0) && ((PI5 & 0x04) == 0x04)) { debounce1--; }
  if ((debounce2 > 0) && ((PI7 & 0x02) == 0x02)) { debounce2--; }
}
当开关由高变低时,设置一个去抖计数器。开关的高状态必须保持20个主计数器计数周期,才会接受下一次高向低的转换。去抖计数器除提供开关去抖功能外,还保证了按钮一直按下时不会重复功能操作;开关必须松开以重新按下。

使用CrossWorks调试器

因程序已经在MAXQ2000上运行,我们可以检查CrossWorks调试系统的功能。向MAXQ2000加载代码的JTAG接口还支持许多硬件调试功能。包括以下一些示例:
  • 指令单步执行
  • 执行地址断点(可以同时有4个有效断点)
  • 直接读写寄存器
  • 代码和栈存储器浏览
  • 数据存储器浏览和直接编辑
MAXQ2000 (以及其它MAXQ微控制器)在底层支持这些调试性能,可以进行在系统调试,而几乎不会对提供给应用程序的处理器资源产生任何影响。采用了完成该功能的专用JTAG接口,与主机系统通信就不必再使用其它接口(如MAXQ2000上的UART口)。另外,断点机制完全在后台运行,只要调试器不停止MAXQ2000,它将一直全速运行。在MAXQ2000运行时,甚至可以加入、删除或修改断点,完全是后台方式。

CrossWorks使用这些硬件调试功能提供C和汇编级源代码调试,具有完备的调试功能,如设置断点、观察变量和寄存器,以及存储器浏览和编辑模式。要进行程序调试,首先选择Build,接着选择菜单中的Build and Debug。将进行应用程序编译、下载到MAXQ2000评估板,最终在main()函数(见图7)内停止运行。

图7. CrossWorks调试模式
图7. CrossWorks调试模式

在图7中可看到CrossWorks调试器的多项功能。
  • 页面左边有一个黄色箭头表示当前的执行位置。所有可执行位置(不包括注释、空白区和一些括号)由左边的蓝色三角形示出。
  • 局部变量和它们的值也在应用代码的右侧示出。这些值可通过点击数值和输入新值来进行编辑。
屏幕最下方的MAXQ Serial To JTAG标记右边的红灯表示应用程序停止。此时,有多种选择来继续执行。
  • Step Into (F11)执行一行,可以单步执行代码。如果该行含有函数调用,将单步进入该函数,转到该函数的开始位置。
  • Step Over (F10)也是执行一行,如果该行不包括函数调用的话。如果有函数调用,则连续执行该函数(执行该函数,而不是跳过它),并在该函数调用的下一行停止。
  • Step Out (Shift+F11)只能在某一函数(不是最上层函数main())内使用。该功能将连续执行完该函数的其余部分,停在调用该函数行的下一行。
  • Run to Cursor (Control+F10)执行到光标所在位置。光标必须处在可执行代码行上,才能使用该功能。
也可以选择Go (F5),以正常速率运行程序。这时,可正常运行而脱离调试控制。程序运行时,底部的MAXQ Serial To JTAG标志旁的指示灯为绿色,指示应用程序在自由运行,但是必要时调试器可以中断并停止程序运行。有两种主要方法来暂停应用程序运行和重新进行调试控制。
  • Break命令(Control+".")将使应用程序立即停止运行,无论当时处在什么位置。
  • 左键单击任何可执行代码行的蓝色三角标记,可在应用程序的相应位置设置断点。这样蓝色三角形会变成红色圆圈。应用程序运行到断点后会停止运行,并重新进入调试模式。程序停止或运行时可以设置或清除多达4个断点。(注意,因为不同的步进调试功能占用一个断点,如果采用单步调试模式,只能设置3个断点)。
最后,选择Stop (Shift+F5)可终止调试过程,使应用程序恢复自由运行。

在调试模式下,有3种不同方法查看应用程序:
  • 源代码模式(Control+T, S)仅以C代码形式显示程序。
  • 汇编模式(Control+T, A)以汇编语言方式显示。单步执行和断点功能可以用于单个汇编行。
  • 交错模式(Control+T, I) (见图8)在同一个窗口内同时显示C和汇编代码。
图8. 在交互模式下进行调试
图8. 在交互模式下进行调试

使用寄存器窗口

应用程序在调试模式下停止运行时,可以查看并直接编辑MAXQ2000的寄存器(见图9)。要打开该显示窗口,选择Debug,再选择菜单中的Debug WindowsRegisters (1,2,3,4)。可快速浏览4个不同寄存器窗口;通过点击左上部的组(Groups)图标,可以配置窗口以显示不同组的寄存器。

图9. 寄存器窗口
图9. 寄存器窗口

使用Call Stack (堆栈使用)窗口

另一个调试窗口显示了应用程序当前的堆栈使用情况(见图10)。该窗口列出了到达代码当前执行点的所有调用函数。当前正在执行的函数显示在列表最后,调用当前函数的上一个函数显示在上一行。依次类推,一直按这一显示模式进行显示,最后是main()显示在第一行。要打开此窗口,选择Debug,再选择Debug Windows,最后选择Call Stack,或者按下Control+Alt+S

图10. Call Stack窗口
图10. Call Stack窗口

使用变量和观察窗口

Debug和Debug Windows菜单中还提供其它调试窗口。Locals和Globals窗口分别显示局部变量(当前函数或显示范围内)值和全局变量值。局部变量显示窗口见上面图7。还有一个Watch窗口,不仅可以用来显示变量值,而且可以显示任意C表达式的值(见图11)。然而,这些表达式中不能有MAXQ2000寄存器。可以定义4个Watch窗口,每个都有独自的变量和表达式列表。

图11. 观察(Watch)窗口
图11. 观察(Watch)窗口

查看代码和数据存储器

存储器窗口(选择Debug,再选择Debug Windows,最后选择Memory (1,2,3,4))可以进行配置,以显示任意代码段和数据存储器的当前值。这些值在每步执行后或者停在断点处时都将更新(见图12)。另外,可直接点击数据存储器值并输入新值进行编辑。

图12. 数据存储器窗口
图12. 数据存储器窗口

支持选项

MAXQ平台提供多种支持选项。Dallas Semiconductor开发者管理着一个在线讨论论坛(English only),回答用户提出的问题。该论坛也是开发者的新闻发布窗口,它包含最新的可用工具信息和其它感兴趣的问题。

对不适合公开讨论的问题,可以通过Maxim支持中心联系我们。

为获取通用新闻和信息,以及了解MAXQ2000、MAXQ平台和未来MAXQ器件的基本信息,请参考MAXQ主页

故障排除

使用任何新器件时都会碰到一些常见问题。通过检查本文档前半部分的操作说明,许多问题可以迎刃而解(如电路板连接和工程配置)。下面是另外一些常见问题和解决方法。

Problem Possible Solution
When I compile my application, I get an "undeclared identifier" error each place I use a MAXQ2000 register. Make sure you have the line

#include <MAXQ2000.h>

at the start of your application.
When I select Connect MAXQ Serial to JTAG, I get a "Device is not responding" error. Make sure: that both boards are connected and powered up; that the JTAG cable connects with the red wire going to pin 1 on both sides; and that jumpers P2 (on the Serial-to-JTAG board) and JU11 (on the MAXQ2000 board) are both closed.
When I select Connect MAXQ Serial to JTAG, I get a "Cannot open serial link" error. Make sure no other software is using the COM port you have selected. Often, PDA software will own the serial port from the time you boot your computer. You can either choose a different COM port, or turn off your PDA software.
The LCD segments are scrambled when I run the demo application. Make sure that the LCD daughterboard is hanging off the top side of the MAXQ2000 Evaluation kit, not in the position where it hangs downward over the center of the board.

结论

MAXQ2000是功能强大的低成本、低功耗微控制器,具备支持多种应用系统的丰富外设。在Rowley Associates提供的MAXQ开发环境CrossWorks的支持下,可以用C语言编写复杂应用程序,并借助这个强大的工具进行调试。这样,可快速向市场推出高质量的产品。