新闻  |   论坛  |   博客  |   在线研讨会
NXP LPC900系列单片机ISP编程技术总结
emesjx | 2012-06-27 01:21:27    阅读:6898   发布文章
                     1.   将编译好的用户应用程序下载(编程)到LPC900系列单片机(MCU)内部Flash的方法有三种:
                (1) 在系统编程ISP(In-System Programming)。
                (2) 在电路编程ICP(In-Circuit Programming)。
                (3) 通用或专用编程器编程。
编程器编程是一种传统的并行编程方法,特别适合于DIP封装(如果是表贴的需专用适配器)或量产阶段(批量)的MCU编程,其特点是速度快、可靠性高。其缺点是无法对已焊接的表贴MCU编程,而且成本较高,一台稍好一点的通用编程器至少在千元以上。目前大部分品牌通用编程器(如Xeltek 3000U等)和周立功LPC PRO专用编程器均支持LPC900编程,而且有些编程器借助专用下载线(如Xeltek ISP-Header01、周立功ICP900-ADP)还可完成ICP编程。
ICP和ISP均采用串行编程方法。其中ICP是一种通用标准(规范)编程,硬件连接采用PCL(P0.5)、PDA(P0.4)、RST、VDD和GND 五线制,但要求编程时PCL、PDA、RST和VDD与系统其它电路断开。ICP的加载(启动)是由MCU内部硬件电路完成的,并调用MCU内部IAP(在应用编程,In-Application Programming)实现Flash编程。上位机(PC机)通过专用ICP下载器(如周立功MiniPRO和涛行TX-MiniICP)与目标系统相连,编程软件使用FlashMagic或SmartPRO。
注意:仅老款的LPC932不支持ICP编程,其它LPC900系列的均支持。
关于ICP编程更多的内容可参阅周立功公司的“LPC900系列单片机ICP解决方案”和“LPC900 在电路编程(ICP)规范”。
                2. 与ICP不同,ISP是一种通用非标准串行在线编程,尽管不同IC厂家内部实现ISP编程技术(算法)不同,但外部硬件连接均采用串口(或USB转串口)的RXD、TXD。根据ISP的加载启动(Bootloader)方式不同(LPC900的ISP加载机制可参阅NXP的AN10221-“In-System Programming with the P89LPC932”图2),LPC900的ISP编程方法又可分为三种:
                  (1) RST 3脉冲法。
                   (2) 帧间隔法。
                   (3) 直接跳入法。
“3脉冲法”有点类似ICP,硬件连接也是采用5线制:RXD、TXD、DTR、RTS和GND,其中DTR控制MCU的VDD,RTS控制RST,且要求ISP编程时MCU的VDD和RST应与系统其它I电路断开,具体电路可参阅周立功的“LPC900系列单片机ICPISP使用指南”图1.16。该方法的ISP加载是在MCU加电复位后有内部硬件完成的,因此适用于刚出厂的全新空片编程和已下载运行应用程序的升级编程。就是因编程时要断开VDD和RST板上连接比较麻烦。
“帧间隔法”硬件连接只需RXD、TXD和GND,简称“3线制”,“3线制”是目前大多数IC厂家ISP编程采用的连接方式,如STC51单片机等。简单方便,成本低(仅需20元左右的RS232转TTL电路或用户自己用1片MAX232即可)。其原理是MCU检测到RXD上帧间隔码(连续的低电平,即串口“Break”脉冲)就进入ISP模式。虽然这种检测是由MCU硬件完成的,但应用程序一开始必须对串口进行初始化,其C代码参见上述“使用指南”程序清单1.2。由此可见,原则上“帧间隔法”只适合于应用程序的升级编程。不过,对于刚出厂的全新空片,由于其“引导状态位”=1,加电复位后就自动进入ISP模式,因此上述三种方法都适用的。
“直接跳入法”就是应用程序判断某个开关,如接通(为0),则进入ISP模式,否则状态不变运行用户程序。显然该方法也必须在应用程序中嵌入“开关判断”代码(参见上述“使用指南”程序清单1.4)。一般都用于应用程序的升级编程。
ISP编程的上位机程序可使用FlashMagic或ZlgISP900,其中ZlgISP900上述三种方法都可以,但不支持ICP编程。而FlashMagic支持方法(1)和(2)以及ICP编程,对于“3脉冲法”,编程前必须将其“Advanced Option”中“Hardware Config”的“Use DTR and RTS to enter ISP”勾选上,而“帧间隔法”则不能勾选,此外,除非MCU是全新空片或者确定其引导状态位(Status Bit)为1,否则进行ISP编程之前必须通过ISP菜单中“Start Bootloader”的“Send Break Condition”发送“3脉冲”或“帧间隔”才能使MCU进入ISP模式,而且要求:“Interface”选“None(ISP)”;“Baud Rate”选“7200”(内部RC振晶)。
注意:由于FlashMagic每次发ISP命令前要发2个同步码(大写字符U,原理后面阐述),因此其成功率比ZlgISP900。
                  3. LPC900出厂全新原装空片,其引导状态位(Boot Status Bit)=1,加电复位后MCU自动进入ISP模式,不必再通过“3脉冲法”和“帧间隔法”进入ISP,在接收上位机ISP命令前,上位机必须通过发同步字符“U”让MCU自动跟踪串口通信波特率,上位机收到MCU回送的“U”表示跟踪成功,然后就可进行各种ISP操作了,如读ID,读配置信息,擦除、编程、加密Flash等。
(1)由于全新空片MCU加电复位后已自动进入ISP模式,因此ZlgISP900上述三种方法均可进行ISP编程。FlashMagic也不需“Send Break Condition”。
(2)FlashMagic每次发ISP命令前要发2个同步字符“U”,而ZlgISP900只在执行“进入ISP模式”命令时发同步字符“U”。
(3)同步字符“U”的十六进制代码是0x55,在MCU的RXD上(加上“起始位”)实际上就是一串方波,便于MCU自动跟踪测算波特率。由于MCU是自动跟踪上位机串口通信波特率的,因此FlashMagic 或 ZlgISP900的波特率选择不是很重要的,不过一般建议选择7200或9600。
                    4. 下载用户应用程序到MCU时要注意,必须先将配置参数中引导状态位设置为0,否则即使成功下载应用程序,复位后也无法正常运行,因状态位=1,加电复位后MCU会自动进入ISP模式的。
ZlgISP900开始运行后或在读入加载文件(*.hex)后总是自动将引导状态位置为1(也许是个小Bug?),因此必须在读入文件后,先将“安全级别”改为“弱级”,再进入“查看配置信息”,去掉“引导向量=0x1”前的“√”去掉,并点击“设置配置信息至缓冲区”,然后才能将应用程序和配置信息下载到MCU。FlashMagic在下载应用程序时会自动将引导状态位置为0的。
如果使用ZlgISP900在下载应用程序时将状态位置为1了,唯一的办法就是将状态位设置为0后重新下载一次配置信息。
                         5. 虽然ISP编程方法(“3脉冲法”除外)简单方便,而且成本很低,但许多LP900的用户发现其成功率很低,特别是对刚买来焊上的新片,成功率更低。归纳起来有如下三大类故障:
                  (1) 第一次编程成功了,但用户程序没有正常运行。
                  (2) 已下载用户程序并正常运行,但无法再进行ISP编程。
                  (3) 使用ZlgISP900时,点击“进入ISP”后显示“成功进入ISP状态”,但无法进行ISP操作,如读ID显示出错;使用FlashMagic进行ISP操作时显示通信失败,并显示“Failed Autobaud”。这种情况对于刚焊上的空片出现最多。
对于这三种情况,首先要解决的是所使用的MCU是不是买的全新原装产品,现在市面上有很多“翻新片”,性能很差,工作不稳定。其次是尽量使用物理串口,因为USB转串口工作不稳定,其驱动程序也容易出问题。
第一类故障一般都是下载应用程序时没有将状态位置为0。解决办法很简单,只要重新将状态位置为0写入MCU即可。
第二类故障稍复杂些,如果是使用“帧间隔法”,最有可能的原因是没有将“帧间隔法”初始化代码嵌入到应用程序中,另一种可能性是编程时不小心把MCU的ISP程序所占扇区(LPC933是扇区3,其它是扇区7)给擦除掉了,如果出现这种情况,唯一的办法就是将ISP程序源码(可从网上下载到)嵌入到用户程序工程中重新编译,并使用ICP或编程器下载到MCU中。
第三类故障出现最多,情况也最复杂,这也是国内很多用户不愿意使用LPC900的原因之一,特别是以前使用过其它MCU的(如STC的51系列单片机),ISP下载很方便,很可靠。尽管NXP和FlashMagic官方网站或论坛上指出出现这种故障的原因大部分是用户使用不当引起的(参见“http://forum.flashmagictool.com/index.php?topic=3628.0”),但据笔者多年开发经验来看,还是NXP LPC900的ISP程序(或者是FlashMagic、ZlgISP900?)在设计上不够完善引起的,特别是ISP程序中的“自动跟踪波特率”(Autobaud)在设计上可能有点小Bug,经常失败!(Failed Autobaud),导致串口无法正常通信。
对于这种故障,笔者有点小经验:就是先运行FlashMagic或ZlgISP900使MCU进入ISP模式(如果是全新空片已进入ISP模式就不必运行了!),退出程序后再运行“串口调试助手”,自动重复发送同步字符“U”(0x55),当正确接收到字符“U”时表示MCU波特率跟踪成功,然后再运行FlashMagic或ZlgISP900便可进行ISP操作了,注意波特率要选择与“串口调试助手”一致(一般是9600)。
参与讨论
登录后参与讨论
推荐文章
最近访客