采用MAXQ1103评估套件和面向MAXQ30的CrossW
扫描二维码
随时随地手机看文章
引言
MAXQ1103是Maxim集成产品公司的新一代安全微控制器,设计用于金融终端。它运行16位指令,提供一个32位数据通道。微控制器在一个机器周期中执行完成指令,是性能非常高的RISC机。MAXQ1103还具有很多重要的安全特性,包括:
支持DES、3DES、SHA-1、SHA-224、SHA-256、RSA、DSA和ECDSA的密码加速器
真正的硬件随机数发生器
1KB低泄漏电池备电NVSRAM
与外部电路连接的7个防篡改探测输入
环境传感器,例如温度和电压超范围探测器
评估(EV)套件是安全应用原型开发的理想平台。套件提供两个串口,两个智能卡插槽(一个全尺寸,一个SIM卡),一个USB连接器,一个LCD屏,一个16按键键盘以及原型区。
设置MAXQ1103评估套件
评估套件如图1所示。需要采用下面列出的硬件元件来完成本应用笔记所讨论的工作:
MAXQ1103评估套件电路板
JTAG电路板
JTAG电缆(连接MAXQ1103评估套件电路板和JTAG电路板)
9针串行电缆
稳压电源(5V、±5%、300mA、中心正极)
<center>
详细电路图(PDF,14.4MB)
图1.MAXQ1103评估套件
评估套件电路板和JTAG电路板都有很多跳线需要进行配置。如果需要了解跳线及其功能的详细信息,请参考各自的数据手册。对于本应用笔记,请按照以下要求来配置跳线:
在MAXQ1103评估套件电路板上,短接跳线JU1,连接JU5上面的两个引脚(最靠近JU5标签的两个引脚)。现在,所有其他跳线应打开。如果,JU6到JU18的所有跳线都短接,那就OK。这是智能卡通信需要的配置,本应用笔记不涉及。
在JTAG电路板,短接JH1和JH2,打开JH3。
在JTAG电路板和MAXQ1103套件电路板之间连接JTAG电缆。在JTAG电路板上,红色电缆应连接至标有引脚1和引脚2的一侧,以及MAXQ1103套件电路板的TCK-GND一侧。
注意,在早期的MAXQ1103评估套件中,MAXQ1103IC可能采用了插槽。如果是这样,把MAXQ1103插入到IC标记向下的插槽中(无铅指示符“+”应在右上侧)。
在您的PC和JTAG电路板之间连接9针串行电缆。不要将其连接至MAXQ1103评估套件电路板。将电源连接至这两块电路板。
采用CrossWorks编译器进行设计:Blinky
我们不以“HelloWorld”开始,而是构建一个简单的应用程序,该应用程序使MAXQ103套件电路板上的一个LED闪烁。
我们使用的工具包是RowleyAssociates公司提供的CrossStudio。现在,工具包当前版本是面向MAXQ30的CrossWorks(2.0.0.2008063000.2293版),可用于产生本文档的截屏显示。为确定是否是最新版本,请在线访问RowleyAssociates网站,或者通过Maxim支持中心,与我们取得联系。
在建立新方案时,点击FileNewNewProject。在NewProject弹出框中,填写底部的Name和Location框,从ProjectTemplates窗口中选择“ACexecutable”(图2)。我们调用工程BlinkyDemo,将其放到目录C:workmaxqmaxq1103blinky中。
图2.选择“ACexecutable”,填写工程名称和位置
单击Next继续,您将看到ProjectProperties弹出框。选择默认值即可,单击Finish,建立工程(您可以单击Next,选择其他的选项;本工程在这些选项中使用所有默认值)。
在建立工程时,ProjectExplorer框中会出现一个新工程(图3),通常位于应用程序窗口的右上。打开它,您将看到两个文件夹,SourceFiles和SystemFiles。打开SourceFiles,将看到main.c,这是您的应用程序源代码。双击它,打开。
图3.ProjectExplorer窗口
自动生成的源代码非常简单,我们只需要加入几行就可以使我们的闪烁应用程序工作。复制以下应用程序代码(替换main.c文件中当前的所有内容)。
#include
#include
voiddelayms(unsignedlongcount)
{
unsignedintx;
while(count>0)
{
for(x=0;x<2500;x++)
{
__no_operation();
}
count--;
}
}
voidmain(void)
{
//setport0toalloutput
PD0=0xff;
while(1)
{
//togglebits0,1,7
PO0=PO0^0x83;
delayms(500);
}
}
当我们运行这一应用程序时,会看到LEDDS1、DS2和DS3(位于套件电路板MAXQ1103的左下侧)闪烁,接通0.5s,关断0.5s。注意,“delayms”函数并不恰好是一毫秒,而是非常接近,达到了blinky应用程序的目的。
在运行演示实例前,必须首先构建它。选择BuildBuildBlinkyDemo。或者按下F7来构建。如果一切都正确构建,您将在Output窗口看到消息“Buildcomplete”,它旁边有一个对勾(图4)。如果有错,请确定您输入的代码是否正确。
图4.工程构建后的输出
运行应用程序时,单击DebugStepOver。也可以按下F10,或者单击带有向下箭头工具条中的图标(图5)。[!--empirenews.page--]
图5.StepOver按钮
CrossStudio通过JTAG电路板把应用程序下载到MAXQ1103中,Output窗口显示状态消息。应用程序将开始运行,然后,在代码第一行停止(左侧空白区显示黄色箭头)。运行应用程序时,单击“Play”按钮(或者选择DebugGo)。现在,请确定MAXQ1103电路板上的LED正在闪烁。您可能希望能够在一定程度上修改应用程序。使LED按顺序闪烁,或者改变点亮时间,更快或者更慢的闪烁。
使用CrossStudio调试应用程序
现在,让我们了解一下MAXQ1103和CrossStudio工具的调试功能。MAXQ1103有内置JTAG引擎,支持在实际芯片上进行调试,从而不需要昂贵的仿真器或者有可能出错的模拟器。注意,MAXQ1103还提供锁定机制,在元件锁定时,防止JTAG工作。这样,当MAXQ1103微控制器用在敏感应用中时,保证了JTAG调试引擎不会带来安全威胁。
现在,我们返回到最初的Blinky应用程序,在主函数中,把延时从500改到5:
delayms(5);
现在,构建并运行应用程序。注意,LED持续点亮,而不是不断闪烁。这就是简单演示代码第一次编写并运行时的情况。
这样会带来一个基本问题:“灯的确是连续点亮,还是闪烁非常快,而无法察觉呢”?如果灯是连续点亮,那就有必要检查原理图和引脚分配,确定一切OK。如果LED只是很快地闪烁(太快,以至于看不清间隔),那就只需要调整时间,这是可能需要做的工作。为回答这一问题,我们现在使用CrossStudio的调试工具。
按下Pause按钮(或者选择DebugBreak)。在代码停止的地方,出现一个黄色箭头。代码很有可能停止在delayms()函数的‘for’循环中(参见图6)。
图6.在delayms()函数中,代码停止运行
观察右侧的Locals窗口(如果看不到该窗口,单击DebugDebugWindowsLocals)。该窗口将显示变量“x”和“count”的当前值。现在,按下StepOver按钮几次。在Locals窗口中,您应该看到x值增加了(可以连续按下StepOver,直到循环结束,但这可能需要很长的时间)。
现在,已经很容易回答“灯是在闪烁吗”这一问题了?对此,需要在main函数的delayms(5)一行设置断点,单击该代码行左侧的小三角。它将变为红圈(图7)。现在,再次运行应用程序(DebugGo,或者Play按钮)。应用程序会运行到这一点,然后暂停。现在,点击Go若干次后,您会看到,随着您的点击,灯接通和关断。这验证了灯是在闪烁,只是太快,我们的眼睛无法察觉。
图7.加入断点
现在,我们借这个机会了解一下更多的调试功能。按下StepOver按钮几次,按顺序执行三行代码:while(1),PO0=PO0^0x83和delayms(5)。您将看到,当通过PO0行时,灯闪烁。现在,当暂停在delayms(5)行时,按下StepInto按钮(图8),进入delayms()函数(而不是StepOver,这会执行整个函数)。
图8.StepInto按钮
在运行时,还可以改变变量(和寄存器)。清除所有断点(DebugBreakpointsClearAllBreakpoints),单击Go。单击Pause,程序应再次停止在delayms()函数的中间部分。注意“x”和“count”值。现在,把x设置为2499(单击x显示的数值,高亮后输入2499)。执行几次StepOver或者StepInto,您会看到循环结束,“count”值也递减了。
以及您感兴趣的其他调试功能:DebugDisassembly将同时显示C代码和生成的汇编代码。这样,用户可以进入汇编代码,而不是C代码,同时知道对应于C代码的什么位置。
DebugDebugWindowsCallStack将显示应用程序到达当前位置时所调用的函数。如果在delayms()函数中暂停执行,其显示如图9所示。
使用DebugStop停止调试,观察右侧的Targets窗口。确定MaximSerialJTAGAdapter以粗体字显示,观察下面的配置选项。如果您使用串口,而不是默认的COM1,那么,可以在这里改变这一选项。
[!--empirenews.page--]
图9.在delayms()函数中运行时调用堆栈