|
< align=center><FONT size=3><STRONG></STRONG></FONT> </P><P align=center><STRONG><FONT size=5>飞思卡尔HCS12系列单片机模块应用及程序下载调试</FONT></STRONG></P><P align=center><STRONG>清华大学Freescale单片机/DSP应用开发研究中心 安鹏 马伟</STRONG></P><P><FONT size=3><STRONG>摘 要:</STRONG>本文对邀请赛选用的主控芯片MC9S12DG128单片机的一些外围接口模块作了介绍,包括功能上的描述和例程及初始化的过程,对一些参赛队伍中遇到的Flash锁死问题也提供了解决的方案。</FONT></P><P><FONT size=3><STRONG>关键字:</STRONG> MC9S12DG128;CodeWarrior;TBDML;Flash解密 </FONT></P><P><FONT size=3> 本次智能车邀请赛采用的MC9S12DG128(以下简称DG128)是Freescale公司推出的S12系列单片机中的一款增强型16位单片机,片内资源丰富,接口模块包括SPI、SCI、IIC、A/D、PWM等,在汽车电子应用领域具有广泛的用途。DG128在Flash存储控制及加密方面也有很强的功能,加解密可配合第三方软件使用。 </FONT></P><P><FONT size=3> DG128单片机采用增强型16位HCS12 CPU,片内总线时钟最高可达25MHz;片内资源包括8K RAM、128K Flash、2K EEPROM; SCI、SPI、PWM串行接口模块;脉宽调制模块(PWM)可设置成4路8位或者2路16位,逻辑时钟选择频率宽。它包括两个8路10位精度A/D转换器,控制器局域网模块(CAN),增强型捕捉定时器并支持背景调试模式。DG128有112-pin和80-pin两种封装形式,80-pin封装的单片机没有引出用于扩展的端口,只引出了一个8路A/D接口。 </FONT></P><P><FONT size=3>常用接口模块及外部应用 </FONT></P><P><FONT size=3> PWM(Pulse Width Modulate)模块:PWM脉宽调制波是一种可用程序来控制波形占空比、周期、相位的波形。它在电机驱动、D/A变换等场合有着广泛的应用。本次大奖赛使用的电机驱动芯片为MC33886,其输入信号即为一路PWM信号。MC33886根据PWM信号的周期和占空比来控制电机的转向和速度。大奖赛中使用的舵机也是用PWM来控制的。PWM信号的周期大于某一域值后可驱动舵机工作,保持周期、调节PWM的占空比即可调节舵机的转动方向。在没有电机、舵机的具体参数的情况下,可写一个可调周期、占空比的PWM输出程序进行测试。 </FONT></P><P><FONT size=3> A/D(Analog/Digital)模块:A/D模数转换模块内部可分为三个部分:IP总线接口、转换模式控制/寄存器列表、自定义模拟量。IP总线接口负责该模块与总线的连接,实现A/D模块和通用I/O的目的。转换模式控制寄存器列表中有控制该模块的所有的寄存器。自定义模拟量负责实现模拟量到数字量的转换。为了与外部信号同步进行A/D转换,A/D有一个外部触发转换通道,用户可以选择触发方式(沿触发、电平触发)。</FONT></P><P><FONT size=3> A/D模块设有时钟分频机制。需要用户注意的是,A/D模块的最大转换时钟为2MHz,最小转换时钟为500KHz,用户需要查看自己芯片的内部总线时钟,必须使得分频以后的转换时钟处于两者之间,否则可能得不到正确的转换结果。用户可以设定转换结果为有符号或是无符号数。比如,对于Vrh为5.12v,Vrl为0v时,输入5.12V,8位有符号的结果是-$7F,无符号的结果是$FF。A/D模块允许设置顺序转换,最大的顺序转换序列长度是8。 </FONT></P><P><FONT size=3> 大奖赛中车模对跑道的识别有可能会用到A/D模块,识别电路的前端数据采集系统有很多种实现方案,如红外发光二极管或是CMOS摄像头来进行数据采集。 </FONT></P><P><FONT size=3>Codewarrior软件使用</FONT></P><P><FONT size=3> 大赛中采用Codewarrior 3.1 for HCS12作为推荐的程序编译软件。CodeWarrior for S12” 是面向以HC12或S12为CPU的单片机嵌入式应用开发的软件包。包括集成开发环境IDE、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C交叉编译器、汇编器、链接器以及调试器。在Codewarrior软件中可以使用汇编语言或C语言,以及两种语言的混合编程。 </FONT></P><P><FONT size=3> 工程建立以后,需要定义装载地址。default.prm文件用于定义目标代码的装载地址,用户应当根据使用单片机的内存分配情况修改这个文件。CodeWarrior 自动生成的 .prm 文件默认MC9S12DG128 的RAM 在: </FONT></P><P><FONT size=3> RAM = READ_WRITE 0x0400 TO 0x1FFF; </FONT></P><P><FONT size=3> 这个默认区间必须修改,因为在这一空间有 1K 的I/O 寄存器空间 和2K EEPROM 空间。使用默认定义会丢失1K RAM 和 2K EEPROM。 </FONT></P><P><FONT size=3> 我们在监控程序中修改RAM空间: </FONT></P><P><FONT size=3> RAM = READ_WRITE 0x2000 TO 0x3FFF; </FONT></P><P><FONT size=3> 当然也可以修改到: </FONT></P><P><FONT size=3> RAM = READ_WRITE 0x1000 TO 0x2FFF。 </FONT></P><P><FONT size=3> 建议用户采用我们的定义。 </FONT></P><P><FONT size=3> 另外,我们使用: </FONT></P><P><FONT size=3> STACKTOP 替代 STACKSIZE </FONT></P><P><FONT size=3> 因为STACKSIZE 0x100 在RAM低端留 0x100 空间,而使用 STACKTOP 0x3F00 可以将SP定义到RAM 高端。但是如果采用这种定义的方法,需要在前面定义RAM的时候,定义修改为:RAM=READ_WRITE 0x2000 TO 0x3EFF。 这样,工程连接的时候才不会出现错误。 </FONT></P><P><FONT size=3> 另外还需要对于工程文件中 Start12.c中函数 : <BR>void __interrupt 0 _Startup(void) 中 <BR>#ifdef _HCS12_SERIALMON <BR>....... <BR>....... <BR>#endif </FONT></P><P><FONT size=3> 两句宏命令注释掉,使得其中的对于EEPROM,RAM起始位置控制寄存器初始化语句有效。这样,下载后程序可以运行正常。 </FONT></P><P><FONT size=3> 上述修改在大奖赛的官方网站上已有详细说明。 </FONT></P><P><FONT size=3> 利用监控程序下载用户程序:</FONT></P><P><FONT size=3> 监控程序(Monitor)的主要功能是对应用系统硬件及底层软件进行调试,也称为Debug程序,是最基本的调试工具。MC9S12DG128的Flash有128K,RAM有8K,而监控程序源代码占用不到3K FLASH,占用23字节RAM。这对用户程序的空间影响并不大。异步串行口是要用来做与PC通讯服务的,监控程序可以用,应用程序当然也可以使用。 </FONT></P><P><FONT size=3> 下载用户程序至片内资源是监控程序的基本功能。清华大学Freescale MCU & DSP应用研发中心开发的基于MC9S12DG128的监控程序代码小于4KB,起始地址为$F000处,它把$FF80的中断向量表移到EF80处,顺序不变。用户可以使用$EF80处的中断向量表,此中断向量表和MC9S12DG128手册上的中断向量表顺序相同,只是从$FF80移到了$EF80。监控程序起来时,如果串口在4秒内没有收到数据,就会检查$EFFE-$EFFF(用户复位向量表)是否为FFFF,如果不是,说明FLASH中有用户程序。程序自动调转到$EFFE-$EFFF所指向的用户程序。如果程序起来4秒内串口接到数据或者$EFFE-$EFFF为$FFFF,则进入DEBUG监控程序。 </FONT></P><P><FONT size=3> 该监控程序中F命令下载程序到FLASH中,可识别S1或S2格式的S19文件。按“F”键后,开发板上的单片机等待接收来自串行口的数据文件。然后选择“发送” -→“发送文本文件”,找到要下载的*.S19文件,按“打开(O)”,这样,就把文件下载到FLASH中去了。注意,文件类型应选“所有文件”。待再次出现提示符说明程序已下载完成。</FONT></P><P><FONT size=3> 从PC寄存器的地址处,开始运行程序。可以用Ctrl P 命令修改PC指针到拟运行程序的起始地址。如果是汇编的代码从下载地址开始执行即可;但如果是C语言编译生成的代码,需要加29后的地址再执行。这是因为工程是从START12.C开始执行,然后再执行用户的main.c。这是codewarrior内部规定的。用户只需要知道就可以了。用户程序的入口地址是用户在default.prm文件中定义的代码地址加上29。</FONT></P><P><FONT size=3> 然后键入“G”命令。这时便可以执行用户程序了。如果用户程序中无法从主循环中跳出,需要停止用户程序的时候按一下复位键即可。 </FONT></P><P><FONT size=3>5 利用“BDM for S12(TBDML)”调试程序 </FONT></P><P><FONT size=3> 当用户在监控程序的帮助下,熟悉了S12单片机的性能和结构,并能初步开始软硬件的设计后,就可以脱离监控程序了,尤其是对于一个完整的项目,就更要直接对硬件进行调试而脱离监控程序。S12系列单片机采用BDM(Background Debug Mode,背景调试模式)调试方式。在BDM模式下主要可以实现3方面的功能: </FONT></P><P><FONT size=3> 应用程序的下载与在线更新 </FONT></P><P><FONT size=3> 单片机内部资源的配置与修复 </FONT></P><P><FONT size=3> 应用程序的动态调试 </FONT></P><P><FONT size=3> 本中心提供面向S12系列单片机的BDM工具,即“BDM for S12(TBDML)”。该工具的硬件由本中心设计,软件采用Daniel Malik设计的TBDML(forums.freescale.com)。本文仅从用户的角度,讲述“BDM for S12(TBDML)”的使用方法以及常见问题的解决办法。详情请登陆本中心网站,并下载最新版本的“BDM for S12(TBDML)”用户手册。 </FONT></P><P><FONT size=3>5.1 BDM for S12(TBDML)硬件设置说明: </FONT></P><P><FONT size=3> BDM for S12(TBDML)设计了跳线开关,允许用户对BDM for S12(TBDML)进行一些特定的设置,以此满足用户的特定要求。打开BDM for S12(TBDML)硬件包装盒,可以看到有3个跳线可以进行设置,分别是J4、J5和J6。 </FONT></P><P><FONT size=3> BDM引脚定义(跳线J4)</FONT></P><P><FONT size=3> 跳线J4用于选择BDM电缆的信号定义。 </FONT></P><P><FONT size=3> 默认状态为J4闭合。 </FONT></P><P><FONT size=3> 当J4闭合(有跳线)时,BDM电缆的信号定义如图1所示; </FONT></P><P><FONT size=3> 当J4断开(无跳线)时,BDM电缆的信号定义如图2所示。 </FONT></P><P><FONT size=3> 注意:图3是Motorola(Freescale)对HC/S12 BDM的定义,即引脚1为BKGD信号,在这种定义方式,一旦BDM插头被接反,则目标CPU的BKGD引脚会被短接到VDD上,由此将会造成芯片烧毁。因此,BDM for S12(TBDML)建议用户在设计目标S12系统时,采用J4断开,即图2所示的BDM电缆信号定义方式。为兼容过去的BDM定义,BDM for S12(TBDML)设计了图1所示的BDM兼容模式。 </FONT></P><P><FONT size=3> 目标板供电方式选择 ( 跳线J5和J6) </FONT></P><P><FONT size=3> 默认状态是目标板由+5V外部电源供电。跳线J5、J6用于选择目标板的工作电压,以及供电方式。J5、J6跳线具体设置如表1所示。 </FONT></P><P><FONT size=3>表1 跳线J5、J6设置目标板工作电压</FONT><FONT size=3><BR> <TABLE cellSpacing=0 cellPadding=0 border=1><TBODY><TR><TD vAlign=top width=82><P align=center>设置类型</P></TD><TD vAlign=top width=96><P align=center>跳线J5</P></TD><TD vAlign=top width=96><P align=center>跳线J6</P></TD><TD vAlign=top width=140><P align=center>目标板工作电压</P></TD><TD vAlign=top width=168><P align=center>目标板供电方式</P></TD></TR><TR><TD width=82><P align=center>1(默认)</P></TD><TD width=96><P align=center>闭合</P><P align=center>(有跳线)</P></TD><TD width=96><P align=center>断开</P><P align=center>(无跳线)</P></TD><TD width=140><P align=center>+5V</P></TD><TD width=168><P align=center>自供电</P></TD></TR><TR><TD width=82><P align=center>2</P></TD><TD width=96><P align=center>闭合</P><P align=center>(有跳线)</P></TD><TD width=96><P align=center>闭合</P><P align=center>(有跳线)</P></TD><TD width=140><P align=center>+5V</P></TD><TD width=168><P align=center>由BDM供电(不推荐,因为USB供电不足)</P></TD></TR><TR><TD width=82><P align=center>3</P></TD><TD width=96><P align=center>断开</P><P align=center>(无跳线)</P></TD><TD width=96><P align=center>闭合</P><P align=center>(有跳线)</P></TD><TD width=140><P align=center>+3.3V</P></TD><TD width=168><P align=center>自供电</P></TD></TR><TR><TD width=82><P align=center>4</P></TD><TD width=96><P align=center>断开</P><P align=center>(无跳线)</P></TD><TD width=96><P align=center>断开</P><P align=center>(无跳线)</P></TD><TD width=308 colSpan=2><P align=center>无效</P></TD></TR></TBODY></TABLE></FONT></P><P><BR><FONT size=3>5.2 安装和使用BDM for S12(TBDML): </FONT></P><P><FONT size=3> BDM for S12(TBDML)在PC上的配套软件是Freescale的CodeWarrio for S12的V4.1以上的版本。用户可调用该软件自带的Hiwave.exe程序,并通过BDM for S12(TBDML)来调试MC9S12各种型号单片机。当然,初次使用BDM for S12(TBDML)时,用户还需要在PC上安装相应的驱动程序和动态链接库。具体的使用方法,请参阅用户手册。 </FONT></P><P><BR><FONT size=3>5.3 使用BDM for S12(TBDML)的常见问题及解决办法。 </FONT></P><P><FONT size=3> 车模大赛启动之处,中心在为广大参赛选手提供培训的同时,按照Freescale的安排,为各参赛队提供了S12开发系统、BDM调试功能、车模等等一系列完整的参赛资源。时隔数月,从反馈信息来看,各参赛队基本上都能熟练地使用BDM for S12(TBDML)。但也有个别队伍遇到了一些问题,中心也及时进行了解答和总结,这里简单汇总了各种问题,以期对参赛队伍有所帮助。 </FONT></P><P><FONT size=3>【常见问题之一】正确安装了BDM for S12(TBDML)的驱动程序和动态链接库后,并用BDM连接了目标单片机后,在Hiwave.exe的【TBDML HCS12】菜单中,没有出现“Flash...”项,无法对目标单片机进行调试。 </FONT></P><P><FONT size=3>解决办法:首先,用户应该确保目标板供电正常,BDM for S12(TBDML)默认的电源工作方式是目标板自供电;如果,还有问题,用户应该打开BDM的包装小盒,查看跳线J4是否已经短接,原因见上文。 </FONT></P><P><FONT size=3>【常见问题之二】驱动程序安装正常,跳线也没有问题,目标板也供电了,但BDM还是不工作。 </FONT></P><P><FONT size=3>解决办法:出现这一问题,最大的可能是,用户的CodeWarrio版本不对,没有利用CodeWarrio V4.1以上的版本进行调试。安装高版本的CodeWarrio即可解决问题。 </FONT></P><P><FONT size=3>【常见问题之三】BDM调试目标板基本正常,能够下载程序、擦除FLASH、设断点调试,但是,在某次使用中FLASH突然被“锁死”,之后目标板无法继续使用。 </FONT></P><P><FONT size=3>解决办法:Freescale 公司的HCS12 系列单片机具有片内FLASH 的加密功能,对于加密或保护后的FLASH,用户是无法通过BDM 调试工具对其FLASH 进行诸如程序擦除、读取等操作。同时,如果用户在利用BDM 调试单片机时操作不当,同样会使单片机出现FLASH 无法读取、擦除和下载等问题。我们的监控程序在$F000 到$$FFFF,这一段加了保护,但并没有加密。即使对加了密的S12,也可以使用我们生产地串行接口地BDM 工具方便的解锁和擦除。在2005 年第4 期《电子产品世界》杂志中,我中心曾经撰文讲述了HCS12 单片机Flash 保护和加解密的原理和注意事项。在决定擦除保护了的程序时,请想好在出现单片机被锁定的情况下有没有能力解锁。对于FLASH没有进入“保护模式”的单片机,如果利用BDM for S12 (TBDML)调试单片机,当用户点击【TBDML HCS12】菜单下的【Flash…】命令时,会出现如图12所示的正常情况。从图中可以看出,当前目标板的单片机的FLASH_C000存储区域已下载有程序,状态为“Programmed”;其余模块为空,状态为“Blank”。因此,可以继续对该单片机的FLASH进行读取、擦除Erase和下载Load等操作。但是,在出现上述FLASH加密问题后,HCS12系列单片机就进入了“FLASH保护模式”,即Secure Mode。这时,如果利用BDM for S12(TBDML)调试单片机,当用户点击【TBDML HCS12】菜单下的【Flash…】命令时,图12中部分FLASH区域的状态就会显示为“Skipped”。此时,用户便无法再对FLASH进行正常操作。因此,需要解除FLASH的“保护模式”(Secure Mode),执行Unsecure的操作。BDM for S12(TBDML)提供了Unsecure的功能,具体的操作过程较为复杂,请参阅用户手册。 </FONT></P><P><FONT size=3>6 结语 </FONT></P><P><FONT size=3> 上面提到的问题是在应用过程中发现的比较普遍的问题。在设计之前最好能完整地阅读帮助文档以及芯片的数据手册,了解各个工作状态,很多可能出现的问题其实在数据手册里已有明确的说明。这样做在程序设计的前期可能会影响一些进度,但到后期调试阶段会带来极大的方便。至于工具使用上的问题Freescale单片机/DSP应用开发研究中心会及时在大赛的官方网站上做出相应的说明,请大家留意。 </FONT></P><P><FONT size=3><STRONG>参考文献</STRONG> <BR>1、 邵贝贝,单片机嵌入式应用的在线开发方法,北京:清华大学出版社,2004 <BR>2、 MC9S12DT128,Device User Guide,Freescale semiconductor,2005.10 </FONT></P><P><FONT size=3> <BR></FONT></P> |
|