控制/MCU
为了实现飞思卡尔公司HCS12系列MCU的在线编程,通过软件架构和可移植性的方法设计了一个通用编程器。通过早期做的很多HCS12系列MCU芯片的编程实验,获得了它们的共性和差异性,通过软件设计的方法实现了对HCS12微控制器的在线编程,并侧重于研究编程器的通用性和高速下载特性。编程器具有通用性和使用便捷性。
随着Flash技术在微处理器上的广泛应用,单片机在开发和应用手段上有了革命性的变化,从传统的仿真器(ICE)到目前流行的JTAG等。设计人员仍然在不断地寻找一种移植性更高、更易操作、费用更低的开发手段。随着微处理器制造工艺的提高,一些高端微处理器(如CPU12/16/32、PowerPC、ColdFire等)内部已经包含了用于调试的微代码,都可以通过BDM等进行调试。由于这种方法省去了仿真器,因此避免了高频操作、交直流电的不匹配等问题,而且随着BDM标准的不断规范和普及,用BDM调试模式进行嵌入式开发已经成为首选。
Freescale公司HCS12系列MCU通用编程器是支持Freescale公司MC9S12系列、MC9S12X系列单片机的BDM调试工具,它可以用于对Freescale公司所有16位MCU的写入和擦除操作。
Freescale公司16位MCU通用编程器是用于Freescale公司16位MCU的BDM调试工具,编程器采用MC68HC908JB8为主控芯片,与目标板以BDM方式进行通信,与PC方则采用USB接口通信,由USB提供电源。编程器系统框图如图1所示。编程器的主要功能是实现对目标芯片Flash的擦除和写入。
编程器采用M68HC908JB8为主控芯片。与PC方通过USB进行通信,与目标板则通过BDM驱动模块以BDM方式进行通信,系统由USB提供电源。
软件系统的设计主要包括:通信程序接口设计、PC方用户程序设计、MCU方擦写程序设计。系统在对目标芯片Flash进行擦除和写入操作时,首先由PC方程序获取用户操作指令,然后调用相应的MCU方擦写程序。通过通信程序接口将需要执行的擦除或写入程序写入目标芯片的RAM区,最后在PC方程序的控制下转向擦写程序所在RAM区的地址执行程序以完成对应操作。
编程器使用USB方式与目标板进行通信。PC方的用户程序与底层MCU方程序进行通信时,通信程序使用Freescale公司提供的相应动态链接库来实现。
BDM通信程序动态链接库主要包含的函数如表1所列。具体实现时只需要直接在PC方用户程序中调用动态链接库的函数即可。
PC方用户程序设计
PC方用户程序界面如图2所示,主程序流程如图3所示。S19是编程器生成的可下载的文件格式。
启动程序后首先检测设备是否已经连接,如果没有连接则返回错误信息,禁止以下的擦除和写入操作。
初始化过程结束,成功进入BDM模式后,系统开始等待用户的操作指令,根据相应的指令作出操作。用户在完成所需操作后按退出,关闭设备并退出主程序。
为了实现编程器对HCS12系列MCU的通用性,“选择芯片芯号”模块的设计致关重要。要详细分析HCS12系列MCU的特性,提取共性和相区别的信息,特别是RAM和ROM区的首尾地址信息,这些信息都需要存放到系统的相应数据库中,以供编程器系统运行时根据所选芯片型号进行读取,作为擦写程序的起始地址数据。
PC方擦除操作程序流程如图4所示。在取得擦除命令后,程序首先载入对应芯片的擦除程序,然后将擦除程序的S19数据写入目标芯片的RAM区中,最后执行GO PC指令,转向芯片中擦除程序所在RAM区中的地址,执行擦除程序。
打开和分析S19操作
执行该操作,首先按行读入打开的S1 9文件,并将S19数据保存到字符串数组中,每读入一行同时验证该行的校验和,数组中一个单元就是S19一行的数据。然后对数据以页为单位进行重新组合,并重新保存到新的字符串数组中,释放先前的数组空间。
写入操作
PC方写入操作程序流程如图5所示。在取得写入命令后,程序首先取一页数据,将数据写入RAM区相应区域,接着判断写入程序是否已经写入RAM区中,若没有则再将对应芯片的写入程序写入RAM区。然后执行GOPC指令转向目标芯片写入程序所在RAM区中的地址处,开始执行写入。写入程序则进入等待写入完成状态,如果等待超时则中途退出;否则,若一页写入完成,则接着进行下一页的写入操作,直到最后一页。
MCU方的擦写程序用于完成对目标芯片Flash的擦除和写入操作。由于在Flash的擦除和写入过程中,Flash是不能读的,故擦除和写入Flash的程序要放在RAM中,也就是说,在Flash的擦除和写入前,要把擦除或写入的可执行代码复制到RAM中去,并让程序在RAM中执行,这一部分操作是由PC方程序完成的。
Flash的擦除和写入操作应按以下步骤进行:
①清除Flash状态寄存器FSTAT中的出错标志位ACCERR和PVIOL,这是由于如果过去的Flash操作中如果有过出错的情况,上面提到的出错标志位将被锁存。与其检查这些标志位是否需要清零,不如清零这两个标志。方法是向状态寄存器FSTAT的这两位写零。
②写Flash配置寄存器FCNFG的b1和b0。以MC9S12DP256为例,这两位表示选择256 KB的Flash中的哪一个64 KB。这里0x00表示PPAGE号为0x3F、0x3E、0x3D、0x3C这64KB,0x01表示PPAGE号为0x3B、0x3A、0x39、0x38这64 KB,0x02表示PPAGE号为0x37、0x36、0x35、0x34这64 KB,0x03表示PPAGE号为0x33、0x32、0x31、0x30这64 KB。
③写PPAGE寄存器。
④检查上一次Flash处理的命令是否执行完成,能否写入新的命令。这是通过Flash状态寄存器FSTAT中的命令缓冲区的标志位CBEIF是否为1,即命令缓冲区是否可以使用来实现的。若不能使用,则等待,直到可以使用。
⑤将要写入的数据字写到相应的地址中,地址必须为偶数地址。对于擦除操作,则被擦除段的任意地址都可以。
⑥向FCMD命令寄存器写命令字0x41表示整体擦除,0x20表示单字节写入。
⑦向Flash状态寄存器FSTAT中的命令缓冲区的标志位CBEIF写1清零。这时状态寄存器中的CCIF位将置位,说明操作成功。
利用MC68HC908JB8作为主控芯片,通过USB与PC方交互通信,以BDM方式与目标芯片进行通信,实现了一种用于Freescale HCS12系列MCU的通用编程器。系统选用MC68HC908JB8 MCU进行设计,不仅是因为这款芯片性价比高,而且在于其USB模块使操作更加方便和可靠,本文所提出的16位通用编程器工作可靠,成本低。读者可以以本系统为蓝本,设计自己的应用于其他系列芯片的编程器,应用到支持BDM标准的其他系列微控制器中。
全部0条评论
快来发表一下你的评论吧 !