由于市场对MCU功能的要求总是不断变化和升级,MCU应用的领域也不断扩展,因此往往需要对最初的设计进行修改。Flash MCU与以往OTP/MASK MCU相比,最大的优点就在于可进行高达上万次的擦写操作,顺应了MCU功能不断修改的需求;另一方面,Flash MCU市场价格也在不断下降。因此,许多OEM已将Flash MCU用于产品的批量生产。对于Flash MCU,基于内部Flash的在线仿真器更接近于程序真实的运行特性,程序调试的效果更好,效率更高。实际上,Flash MCU工作时Flash的延时、读写时充等特性是非常,程序存储在MCU外部仿真板上的SRAM中,由额外的硬件逻辑来模拟Flash的这些特性是费时低效的;同时将Flash和MCU内嵌的其他类型存储器如SRAM、ROM等区分开来也是十分重要的。如果在程序的调试阶段就可以反映出这特性,有且于实现程序从仿真器到商用MCU芯片的无缝转移。
1 关于Flash MCU
Flash MCU的构成如图1所示,主要由CPU核、Flash IP及其控制模块、SRAM IP及基控制模块、WatchDog、PMU(Power Manage Unit,功耗管理单元)、I/O端口以及ISP在线编程接口等组成。不同功能的Flash MCU还包含一些各自独特的应用模块单元,如用于寻呼的Flash MCU所包含的解码模块。对于用来构成在线仿真器的Flash MCU还可能包括仿真接口单元。本文在讨论Flash MCU的在线仿真时,指的都是包含仿真接口的Flash MCU。
Flash存储器几乎拥有现今追求个性化的用户所需要的所有优点:掉电数据不丢失、快速的数据存取时间、电可擦除、容量大、在线(系统)可编程、价格低廉以及足够多的擦写次数的高可靠性等,已成为新一代嵌入式应用的首选存储器。与Flash MCU相比,MASK(掩膜)MCU尽管在大指生产时仍具备一定价格优势,但其升级不便的缺点,随着今后Flash成本的进步降低和MCU功能需求的逐渐增多,将表现得更为显著。
2 基于外部SRAM的MCU在线仿真器
MCU仿真器的一种常见做法是,将用户的待调试程序(以下简称用户程序)存储在MCU外部仿真板的SRAM(以下简称外部SRAM)中,在bond-out MCU的外部结构仿真监控硬件(以下简称外部仿真逻辑),通过监视和控制仿真接口信号即bond-out的信号,来获取MCU的状态,是指将MCU内部的某种信号连接到封装的管脚上,使得外部仿真逻辑可以监视和控制MCU内部的状态。这种非商用芯片专用于构成在线仿真器,当用户程序在仿真器中调试完成后,编程到商用MCU芯片中,应用到用户系统。在商用MCU中,这些仿真接口信号不会出现在芯片封装的管脚上。
在Flash MCU没有被广泛应用之前,仿真器设计公司通常将用户程序和监控程序都存储在外部SRAM中,这种做法基本上可以反映SRAM MCU真实的运行情况,对用户程序的调度效果影响不大。但是对于Flash MCU而言,则存在一定的问题。毕竞SRAM和Flash在工艺和读写时序上相去甚远,CPU运行存储在SRAM和Flash中的程序,情况是完全不同的。有可能出现程序存储的仿真器的外部SRAM中运行良好,但是编程到商用MCU中工作起来却不正常。随着Flash MCU在 MCU市场中的比重越来越大,这一问题显得越来越突出,有必要加以重视。
本文介绍的Flash MCU仿真器的设计方法,几乎不增加MCU的仿真接口信号和芯片设计的复杂程度,就可以接近程序在商用MCU中的运行情况,实现用户程序从仿真器到商用MCU的良好转移。
3 基于MCU内部Flash的在线仿真器的一种设计方法
图2是Flash MCU仿真器系统构成示意图,其中的虚线接口信号是MCU的仿真接口,通常包括仿真使能信号,bond-out MCU中的CPU的地址、数据、读/写和取指等信号,以及少数几个用于仿真的控制信号。仿真接口是Flash MCU与外部仿真逻辑之间的桥梁,使得外部仿真逻辑能够监控MCU的内部状态。
3.1 仿真器的工作原理
仿真器复位后,CPU开始运行存储在MCU内部Flash(以下简称内部Flash)中的用户程序,外部仿真逻辑实时监测仿真接口信号,取得当前CPU运行指令的地址,判断是否断点。一旦遇到断点,外部仿真逻辑停止用户程序的运行,切换程序运行的地址空间,开始运行存储在外部SRA模块的监控程序。监控程序取得MCU的当前状态,并根据软件的调试要求,改变MCU内部的一个或多个寄存器的值,控制MCU的下一步运行。当监控程序完成使命,需要将程序的运行空间切换回用户程序空间,CPU取指从外部回到内部,继续运行用户程序。在用户程序运行过程中,软件通过并口发送的调试指令可以控制外部仿真逻辑,随时打断程序运行,或者单步调试,工作的过程与断点相心。断点、单步及软件中断在下文中断称为程序中断事件。
仿真器工作时,CPU的取指空间需要在内外存储器之间反复切换。CPU地址空间划分示意图如图3所示。总体上,仿真器的工作受图4所示的状态机控制。该状态机共有四个状态:
·用户程序运行态(简称用户态)
仿真器复位后,处在运行用户程序的状态。在该状态下,CPU运行存储在内部Flash中的用户程序;外部仿真逻辑实时监测仿真接口,等待程序中断事件的发生,进入下一状态-跳转态。
用户程序通过MCU的ISP(在线编程接口)编程到内部Flash中,由Flash MCU的专用编程器完成。在设计bond-out MCU时,应该考虑与非bond-out MCU在编程时管脚的一致性。
外部SRAM用来存储监控程序和监时数据。
·跳转态
一旦程序中断事件发生,需要切换CPU的取指空间,跳转到监控程序窗口。
由于在程序中何处中断是不可预知的,因此不可能在用户程序中预先安插好用于空间切换的跳转指令。所以需要一个专门的状态来插入跳转指令码和跳转的目的地址,即监控程序的入口地址,强制CPU运行监控程序。监控程序窗口是划分CPU地址空间时,为仿真功能预留的地址空间,空间大小视所需的监控程序的大小而定,监控程序的大小在一定程序上取决于仿真功能的强弱。
CPU从仿真接口读跳转指令码和跳转地址。MCU外部仿真逻辑同时使能程序空间切换信号,屏蔽MCU的所外部中断,停止MCU中CPU外围模块的时钟,也就相当于屏蔽了MCU的所有内部中断。当程序空间的切换完成后,仿真器进入监控态,运行存储在外部SRAM中的监程序。
·监控态
在监控状态下,CPU运行存储在外部SRAM中的监控程序;继续禁止MCU的所有外部中断,停止MCU中CPU外围硬件模块的时钟。
监控程序的任务是获取MCU当前的状态,接受软件的调试命令,控制MCU的下一步运行。监控程序可以写得很简单,仅仅获取CPU特殊寄存器和外围硬件寄存器的值,实现监视功能。也可以有比较完备的功能,例如接收用户的调试指令,修改其中一些寄存器的值,命使得MCU再次运行时,按照用户的调试要求往下运行。这需要在MCU设计时,保证在CPU外围模块的时钟停止时,也可以读写外部硬件寄存器。至于CPU的5个特殊寄存器;PC、ACC、IDX、CCR和SP,可以通过进入监控程序执行特定的程序段得到。如MOTOROLA的HC6808就可以通过在监控程序开始处加入以下程序段得到这些寄存器的值。对于CPU指令集不支持读取全部特殊寄存器的MCU,可以通过在MCU内部增加测试逻辑得到。PC值即为程序中断处CPU的取指地址。
PSHA ;将ACC的值压入堆栈
TPA ;将CCR的值传送给ACC
STA $2FEB ;将CCR的值存入存储器,地址为$2FEB
PULA ;将ACC弹出堆栈
STA $2FEA ;将ACC有值存入存储器,地址为$2FEA
STHX $5F ;将IDX(H:X)的值存入存储器,地址为$005F
TSX ;将SP的值传送给IDX(H:X)
STHX $5D ;将SP的值存放存储器,地址为$005D
当不再继续调试,给出开始运行的命令,监控程序结束对运行命令的等待,并且将CPU特殊寄存器的值恢复。继续运行监控程序,直到最后一条指令即跳转指令进行返回态。
·返回态
CPU执行监控程序的最后一条指令-跳转指令。外部仿真逻辑在指令码后紧接着插入本次中断事件的中断点地址(进入监控程序之前的用户程序指令地址),CPU的取指空间需要跳回到用户程序空间。取消对外部中断的屏蔽,恢复CPU外围模块的工作时钟,监控程序完成使命,回到用户态,继续运行内部Flash中的用户程序。
3.2 内部仿真逻辑
为了构造合适的MCU的仿真接口,必须在MCU设计时,在MCU内部增加一个仿真接口模块,称为内部仿真接口模块。负责对仿真接口所需的CPU端口信号进行处理(如出于减少bond-out信号线的考虑,将地址和数据总线复用),并产生外部仿真逻辑所需的控制信号如地址锁存信号,接收来自外部仿真逻辑的控制信号如程序文凭间切换使能信号等。
3.3 外部仿真逻辑
外部仿真逻辑如图2左部所示,负责接收计算机通过并口发送的仿真命令,监视MCU的仿真接口,控制仿真器的工作状态。外部仿真逻辑由外部仿真接口模块、断点判断模块、轨迹纪录模块、并口接口模块和外部SRAM读写控制模块等部分组成。各个模块的作用简单介绍如下:
·外部仿真接口模块
该模块是外部仿真逻辑中仿真状态机所在的核心模块。功能包括:接收业自MCU的地址、数据、读/写、取指、地址锁存等信号;根据并口接口模块给出的来自软件的仿真命令,给出仿真控制信号;在程序空间切换时插入跳转指令和地址;将来自MCU的地址和取指信号送给断点判断模块,并接收来自断点判断模块的断点标志信号;产生送给MCU的程序空间切换使能信号;运行监控程序时,给出读写外部SRAM所需信号,并接收读出的数据,将其送给MCU。
·断点判断模块
根据外部仿真接口模块送来的CPU地址,读取断点标志存储器中的相应值。如果读出的标志为有效值,表示当前地址为断地址。接收来自并口接口模块的设置和清除断点命令,将断点存储器的相应位置1或置0。允许设置任意数目的硬件断点。
·轨迹纪录模块
将外部仿真接口模块送来的CPU取指地址,存储在轨迹纪录的存储器中。轨迹纪录的存储器采用的FIFO的方式,所能纪录的轨迹长度是有限的,存满刷新。软件读取该存储器,可以得到CPU的运行轨迹。
·并口接口模块
提供仿真器和计算机并口之间的通信接口,可以针对不同的并口模式设计,以满足不同模式的通信时序要求。
·外部SRAM读写控制模块
仿真过程中,仿真器的不同部分需要分时读写外部SRAM,包括:并口接口模块下装程序到外部SRAM;MCU在监控态从外部SRAM中读取程序指令,存储临时数据等。
对于Flash MCU而言,这种将用户的待调试程序存储在MCU内部的Flash中,将监控程序存储在MCU外部的SRAM中,并在MCU外部构造仿真逻辑,通过对采用bond-out技术的MCU的bond-out管脚进行监控,来实现在线仿真的做法,在芯片设计时不需要做太多的工作,而且可以反映程序真实的运行效果。相对于完全在芯片仿真(on-chip debugger),该方法简单,MCU的设计周期短;而相对于用硬件平台如FPGA仿真,则价格低廉许多,是一种种权衡折衷的方法。作者提取了一个简单的Flash MCU模型,用这种方法完成了仿真器的逻辑设计,用Synopsys DC综合,用Quartus布线Altera APEX 20K200 FPGA中,用ModelSim5.4进行了后仿真,完成了仿真验证。结果证明这样的做法是可行的。