引 言:
LPC900系列Flash单片机提供从8脚到28脚的封装形式,可以满足各种对成本和电路板空间有限制而又要求高性能、高可靠性的应用需要,同时具有高速率(6倍于传统MCS51单片机),低功耗(完全掉电模式下耗电低于1 μA),高稳定性,小封装,多功能(内嵌众多流行的功能模块)等特点。P89LPC932就是该家族中的重要一员,其集成了8 KB的Flash程序存储器、512B的静态数据存储器、512B的E2PROM、I2C总线、SPI总线、增强型UART接口、模拟比较器、看门狗、4个中断优先级、双DPTR,并支持/编程等功能。
1 P89LPC932进行ISP编程的基本方式
1.1内部程序存储器的三种编程方式
P89LPC932内部集成的8 KB程序存储器编程的三种方式分别是:在系统编程(ISP);程序运行时编程(IAP);通过并行方式编程。
一般来说,ISP编程是指依靠某种外部工具(除了常规的并行编程器以外)去直接给处理器内部集成的程序存储器编程。这里所指的外部工具常见的有很多种,不同的处理器供应厂商可能提供不同的方案。例如,根据编程 接口的不同,就有JTAG、单线、串口、SPI口等多种方式。尽管编程方式有所不同,但其原理都是类似的,就是依靠外部条件触发处理器,令其脱离正常执行的内部常规用户应用程序代码的进程,转而执行保存在其程序存储空间内某个固定位置处的控制擦除程序存储器及给程序存储器编程的代码(或是处理器外部提供的执行代码),然后通过某种与PC计算机的通信方式,将用户指定的某个在PC上编译完成的嵌入式处理器可运行的二进制代码文件编程入嵌入式处理器内的程序存储器。这种编程方式只需要常规的硬件配置(某些处理器可能需要某些叫做下载线的简单硬件电路)支持,而不需要特别的编程器(指并行编程器)支持,所以即使处理器芯片已经焊接到了电路板上也可以实现编程,这也就是ISP的真实含义。P89LPC932是利用其自身的异步串行口来实现ISP编程的,不需要特别的下载线或下载器,触发LPC932进入ISP编程模式的方法将在下文详细解释。
IAP编程方式与ISP编程方式类似,但它不是由外部条件来触发的,而是在处理器正常执行用户设计的应用程序代码时,直接调用执行擦除及编程功能的固化例程。和ISP编程方式一样,IAP编程方式也只需要常规的硬件配置来支持。P89LPC932的ISP编程实际上就是通过调用芯片的IAP服务子程序实现编程的,其IAP服务子程序保存在FF00H~FFFFH地址空间中,不占用用户程序空间。
并行方式编程需要使用一台外部专业编程设备。换句话说,这种编程环境并不是用户最终应用时的硬件环境。用户在使用这种编程方式时,通常必须将处理器芯片单独放到并行编程器上进行编程(如果处理器芯片已经焊接到电路板上,则必须先将处理器芯片从电路板上取下来)。处理器芯片编程完成后才能放回到电路板上,再上电令处理器运行,才能看到用户新写入代码的运行结果。这是最传统的编程方式(经典的AT89C51就主要使用这种方式编程),但它既繁琐,又不能满足现今远程升级的实际需求,因而已逐渐被方便快捷的ISP、IAP等在线编程方式所取代。
综合来说,ISP模式是最容易使用的,因为它允许处理器在被焊接到用户目标电路板上再进行编程,也不需要复杂的代码设计,该特性允许用户在生产出硬件产品后再升级产品软件。一般来说,增加校准信息数据和现场安装最新的软件版本是较常见的升级操作。不仅如此,ISP编程还特别适用于用户产品研发阶段。显然,用户可以非常方便快捷地更改自己的程序代码并立即看到新代码的运行结果。P89LPC932使用串口作为ISP编程模式的主通信接口,使得这一系列处理器较那些依靠JTAG、SPI等通信接口作ISP编程接口的处理器要方便。因为一般的嵌入式系统都会配置异步串行口,这样,在系统编程就不需要特殊的ISP编程器,而JTAG、SPI等及其类似的编程方式一般都需要专用的接口适配器或下载线来配合,这些都可能会增加用户的投资和成本。
P89LPC932芯片实现ISP编程是依靠在出厂时预置的一段,这段代码存储在P89LPC932代码空间内7号扇区的高端512B地址处(P89LPC932内部的8 KB程序存储器被组织成8个扇区,每个扇区有1 KB)。这段代码提供了设备底层操作代码(执行如擦除、编程等操作)和串口通信之间的接口。如果用户需要使用ISP编程模式,则必须注意,千万不要擦除或覆盖包含ISP预置代码的那个扇区,也就是7号扇区(1C00~1FFFH),因为P89LPC932的擦除操作是以扇区为基本单位的。
如图1所示,用P89LPC932实现的硬件连接很简单,它只需使用VDD电压即可执行擦除和编程算法,不需要特殊的高编程电压,所以,芯片外部只需要1片TTL和RS232电平相互转换的芯片(常见的芯片包括Maxim的MAX202、MAX232等,其他公司如TI、Sipex、Linear都有类似功能的芯片产品)即可实现P89LPC932内异步串行口和用户个人计算机上的RS232串口的连接。在用户个人计算机上运行一个简单的终端仿真程序就可以实现ISP编程,不过还有一种更简单的方法,就是运行一个现成的免费程序,比如Flashmagic,就可以实现这个目的,这个程序集成了所有针对Philips LPC900系列处理器的ISP功能。P89LPC932内部的ISP代码能够自动检测其片上异步串行口与用户个人计算机通信的波特率,进而实现在用户个人计算机控制下的代码下载及编程。综上所述,P89LPC932的这种ISP编程模式不需要外部编程器,但是需要一定的外部电路(串口通信电路),需要保留ISP驻留代码,需要在用户的应用程序代码中添加ISP引导初始化程序(如检测初始化),且ISP加密字的第2位(禁止ISP/擦除)不能置位。
图1 P89LPC932 ISP模式硬件连接图
1.2进入ISP模式的方法
触发P89LPC932进入ISP模式的4种方法分别是:通过检测状态位触发进入ISP模式(全新芯片最初上电时的默认状态);通过检测中止控制符信号触发复位后进入ISP模式(最实用而且常用的方法);上电时在复位引脚上检测到特定脉冲后触发进入ISP模式(即硬件激活进入ISP模式);直接调用ISP代码实现进入ISP模式。
1.2.1通过检测状态位触发进入ISP模式
P89LPC932复位时,是否进入ISP模式会受一个状态位的控制,这个状态位保存在Flash存储器里的一个保留位置,不过这个位置并不在P89LPC932可以寻址的程序存储器空间内。在复位信号的下降沿,处理器将检查该状态位的值,如果其值为0,处理器将从地址0000H处开始取指令执行,这里通常存储着用户的应用程序代码。如果该状态位的值不是0,则处理器将从另一个确定的地址处开始执行此处的代码,这个地址(16位)的高8位由复位向量指定,低8位固定为00H。也就是说,引导向量的值将作为程序计数器(PC)的高字节,低字节为00H。如果用户使用的是一片新芯片,芯片中的状态位值在出厂时就被设置为1,而被预编程为1EH。因此,新芯片在复位后将直接从1E00H地址处开始执行代码。因为从1E00H开始处的代码,正好就是Philips公司给芯片预置的ISP。如果用户希望从0000H地址处开始执行代码,则状态位的值可以通过并行编程器去清零。实际上,通过ISP代码的自身功能也可以给状态位清零;如果用户往P89LPC932内部的程序存储器写入自己的应用程序代码后给状态位清零,则下次芯片复位后处理器将直接执行用户代码。另外,ISP代码也有修改启动向量值的功能,用户可以修改它的值,也就是把芯片复位后取代码执行的地址修改了(假如LPC932被触发进入ISP模式的话),而用户自己编写的启动代码就放在那里,这种设计通常是用来执行某些特殊功能的。不过,如果用户修改了启动向量的值,使它不再是1EH,则用户就再也不能使用LPC932出厂时预置的启动代码了。如果启动向量被修改而指向一个不包括任何启动代码的地址,用户则不得不使用一台并行编程器来给这枚芯片编程,以恢复它的启动向量值;否则,用户将无法再使用这种ISP编程方法。
1.2.2通过检测中止控制符信号触发芯片复位后进入ISP模式
通过异步串行口检测到中止控制符信号触发芯片复位后进入ISP模式是进入ISP模式的第二种方式。中止控制符信号就是指在异步串行口的接收脚上出现长达一帧长度的低电平,这里一帧的长度与异步串行口的工作模式有关。例如,在异步串行口的“模式一”中,一帧相当于10个比特的传输时间。一般地,当一个中止控制符信号发出时,异步串行口的接收脚将会持续相当于很多帧时间的低电平。不过,在第一帧的时候,中止控制符信号就会被检测到。注意,如果用一个机械开关来拉低异步串行口的接收脚,以创造一个中止控制符信号,同时,处理器被配置为允许串行中断,则异步串行口的接收中断标志必须在其中断服务全程中被处理,否则,处理器将进入一种不确定的状态。