您现在的位置:机电论文网>> 嵌入式系统>> 正文内容

LPC21XX系列ARM微处理器ISP升级程序设计

作者: 来源: 发布时间:2011/3/4 17:27:36  点击数:2195
在系统中编程,英文简称ISP,即In System Programming,是Lattice半导体公司首先提出来的一种让我们能在产品设计、制造过程中的每个环节,甚至在产品卖给最终用户以后,具有对其器件、电路板或整个电子系统的逻辑和功能随时进行重组或重新编程的技术。
ISP使得MCU、CPLD等不必从目标板中拔出,通过串口或专用下载电缆就可实现本地或远程下载来实现程序升级。
  飞利浦的LPC2000系列片内含FLASH的ARM7微处理器支持ISP和IAP(In ApplIcation Programming——在应用编程)。
  LPC2000系列微处理器通过其UART0与PC(或其他设备)的COM口联机实现ISP。
  复位时,P0.14为低电平会使LPC2000系列微处理器进入ISP功能模式,否则进入正常工作模式。
  P0.14在复位后默认初始化为高阻模式,用户需要提供外部硬件条件——上拉或接地,使引脚处于一个确定的状态,否则可能导致功能紊乱——非预期的ISP模式或正常工作模式。
  飞利浦提供公用的ISP下载程序,但是在某些情况下,例如为了程序统一性,个性化或固件的保密性,我们有必要设计自己的ISP下载程序。
ISP处理过程
  ISP的整个过程如下图所示:

1. ISP模式的进入
  复位时P0.14的3ms以上持续的低电平是LPC2000系列微处理器进入ISP功能模式的必要条件。PC的串口应设定为8个数据位、1个停止位和无奇偶校验,波特率建议设置为9600bps,由于受ISP处理速度的影响,过高的波特率并不见得会提高ISP处理速度,反而容易导致ISP处理没有响应。
2. 自动波特率检测
  LPC2000系列微处理器在进入ISP模式之后,会自动进行“自动波特率检测”,因为微处理器并不清楚自己所连接的晶振频率和PC程序所设置的串口波特率。在“自动波特率检测”通过之后,微处理器就进入处理PC程序所发送的ISP命令的状态。
自动波特率检测的流程如下图所示:

  PC机先发送一个同步字“?”,若微处理器因为在复位时检测到P0.14为低电平而进入了ISP模式,则微处理器会发送“Synchronized\\r\\n”给PC,PC在接收到“Synchronized\\r\\n”之后,回发“Synchronized\\r\\n”给微处理器,微处理器在收到“Synchronized\\r\\n”之后,发送“Synchronized\\r\\nOK\\r\\n”给PC,PC在收到“Synchronized\\r\\nOK\\r\\n”之后,以ASCII码的形式发送晶振频率(kHz)给微处理器。例如晶振频率为12MHz,则PC发送给微处理器的字串为“12000\\r\\n”。微处理器在接收到晶振频率之后会发送“OK\\r\\n”给PC作为响应。
注意事项:
  (1) 处理器与PC的数据交换过程中,所有数据均以“\\r\\n”作为结尾,十六进制为0x0D,0x0A。
  (2) 任何发送或接收出错之后,只能通过PC软件提示“操作失败”,并要求用户重启(复位/开关电源)微处理器来解决。
  (3) 所有数字均以ASCII码的形式发送。
3.ISP命令处理
  在自动波特率检测之后,PC就可以通过串口发送ISP命令和数据给微处理器了。
ISP命令简介
  LPC2000系列微处理器支持的ISP命令如下表所示,更详细的介绍参见周立功网站的http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf以及《ARM微控制器基础与实战》一书。
ISP命令简单汇总
ISP命令 功能
 U 23130  解锁。在对 FLASH编程、擦除运行之前必须执行该命令。  
 B <波特率><停止位>   设置波特率。
 A <1/0>   回声开关。控制微处理器是否将接收到的数据回发给 PC。  
 W <RAM地址><长度>   PC写数据到微处理器RAM。数据格式为UU码。  
 R <RAM地址><长度>   PC从微处理器RAM读数据。数据格式为UU码。  
 P <起始扇区><结束扇区>   选定即将操作的扇区范围。  
 C <FLASH地址><RAM地址><字节数>   命令微处理器将 RAM中的数据烧写到FLASH中。  
 G <地址><模式>   执行 FLASH或RAM中的代码。  
 E <起始扇区><结束扇区>   擦除选定的扇区。  
 I <起始扇区><结束扇区>   检查指定的扇区是否为空。  
 J   读器件 ID。  
 K   读 BOOT代码版本号。  
 M <地址1><地址2><字节数>   比较 FLASH和/或RAM中的数据。  
  注意事项:
   (1) 处理器与PC的数据交换过程中,所有数据均以“\\r\\n”作为结尾,十六进制为0x0D,0x0A。
   (2) 任何发送或接收出错之后,只能通过PC软件提示“操作失败”,并要求用户重启(复位/开关电源)微处理器来解决。
   (3) 所有数字均以ASCII码的形式发送。
   (4) 所有参数均以空格作为分隔符, 十六进制为0x20。
ISP命令的响应
  在执行ISP命令之后,微处理器会发送“0\\r\\n”之类的字串给PC作为响应。这里的“0”即为执行结果。“0”表示执行结果正确,非“0”表示执行失败,至于非“0”的具体的含义,参见周立功网站的http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf以及《ARM微控制器基础与实战》一书。
ISP读取器件ID的过程
  这里之所以介绍通过ISP读取器件ID的过程,是因为通过ISP命令来烧写程序相对通过ISP读取器件ID来说复杂很多,而且烧写程序之前往往包含读取器件ID部分。
  下面为对ISP2106读器件ID的完整的过程:   OPEN COM bps:9600, StopBits:1, Parity:No, DataBits:8
  WRITE 0x3F
    ?
  READ 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
    Synchronized\\r\\n
   WRITE 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
    Synchronized\\r\\n
  READ 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
    Synchronized\\r\\nOK\\r\\n
  WRITE 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A
    12000\\r\\n
  READ 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
    12000\\r\\nOK\\r\\n
  WRITE 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A
    U 23130\\r\\n
  READ 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A 0x30 0x0D 0x0A
    U 23130\\r\\n0\\r\\n
  WRITE 0x4A 0x0D 0x0A
    J\\r\\n
  READ 0x4A 0x0D 0x0A 0x30 0x0D 0x0A
    J\\r\\n0\\r\\n
  READ 0x34 0x32 0x39 0x33 0x39 0x38 0x34 0x30 0x35 0x30 0x0D 0x0A
    4293984050
    
  其中WRITE和READ是针对PC而言的。
UU编码简介
  向FLASH中烧写的程序代码是通过UU编码之后传给微处理器的。
  UU编码算法将3字节二进制数据转换成4字节可打印的ASCII字符集。因为Hex格式是将1字节二进制数据转换成2字节ASCII数据,所以UU编码的效率高于Hex格式。
UU编码的编码方法如下:
  因为3字节二进制数据共24Bits,把它们按6Bits分成4份,这样就变成了4个字节,再把新生成的4个字节每个都加上0x20,若这样处理后的数值为0x20,则用0x60取代。用C语言表示的UU编码过程如下:
    #define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))
    outbuf [0] = ENCODE_BYTE ((inbytep [0] & 0xFC) >> 2);
    outbuf [1] = ENCODE_BYTE (((inbytep [0] & 0x03) << 4) +
       ((inbytep [1] & 0xF0) >> 4));
    outbuf [2] = ENCODE_BYTE (((inbytep [1] & 0x0F) << 2) +
       ((inbytep [2] & 0xC0) >> 6));
    outbuf [3] = ENCODE_BYTE (inbytep [2] & 0x3F);
  若原数据字节数不是3的倍数,则以0x00填充。
  数据通过UU编码之后,以UU编码行的形式打包发送。
  UU编码行的第一个字节表示数据的长度,且为UU编码。
  UU编码规定:任何UU编码行的长度都不应超过61个字节(字符),也就是说,一个UU编码最多可以包含45字节原始的二进制数据。
例如,对一个用十六进制表示的数据“18F09FE518F09FE518F09FE518F09FE5”,(注意该数据实际长度为16字节,因为显示的问题,这里采用HEX表示。)在经过UU编码之后,数据变为“M&/"?Y1CPG^48\\)_E&/"?Y1CPG^6`7R"Y\\/\\?Y1CPG^7`````0````$0```!(”。
LPC2000系列微处理器UU编码发送规则
  LPC2000系列微处理器规定:
  1.发送器(通常为PC)以UU编码行的形式发送实际数据,且每个数据包都以 “\\r\\n”结束,所以在UU编码行长度为61字节的时候,发送器实际发送的数据长度为63字节(61个字节UU编码+2字节“\\r\\n”)。
2.在发送20个UU编码行之后,应该发送数据校验和。
数据校验和即为上次校验和计算之后所有发送的原始数据的和。
数据校验和以ASCII码的方式发送,以 “\\r\\n”结束。
接收器在收到校验和后与它接收的数据的校验和相比较,如果校验和匹配,接收器就发送“OK\\r\\n”,并等待下一次发送。如果校验和不匹配,接收器就发送“RESEND\\r\\n”。
3.在数据发送结束,即使不足20个UU编码行也仍然应该发送数据校验和。
由于FLASH的烧写通常是以4096字节为单位的,所以在每发送4096字节之后也必须发送一个数据校验和。(4096字节=91个UU编码行+1个字节=4×20个UU编码行+11UU编码行+1个字节)
  所以实际发送4096字节数据的过程如下:
    WRITE 63BYTES(1)
    WRITE 63BYTES(2)
    WRITE 63BYTES(3)
    ......
    WRITE 63BYTES(18)
    WRITE 63BYTES(19)
    WRITE 63BYTES(20)
    WRITE CHECKSUM(已发送900字节)
    WRITE 63BYTES(21)
    WRITE 63BYTES(22)
    WRITE 63BYTES(23)
    ......
    WRITE 63BYTES(38)
    WRITE 63BYTES(39)
    WRITE 63BYTES(40)
    WRITE CHECKSUM(已发送1800字节)
    WRITE 63BYTES(41)
    WRITE 63BYTES(42)
    WRITE 63BYTES(43)
    ......
    WRITE 63BYTES(58)
    WRITE 63BYTES(59)
    WRITE 63BYTES(60)
    WRITE CHECKSUM(已发送2700字节)
    WRITE 63BYTES(61)
    WRITE 63BYTES(62)
    WRITE 63BYTES(63)
    ......
    WRITE 63BYTES(78)
    WRITE 63BYTES(79)
    WRITE 63BYTES(80)
    WRITE CHECKSUM(已发送3600字节)
    WRITE 63BYTES(81)
    WRITE 63BYTES(82)
    WRITE 63BYTES(83)
    WRITE 63BYTES(84)
    WRITE 63BYTES(85)
    WRITE 63BYTES(86)
    WRITE 63BYTES(87)
    WRITE 63BYTES(88)
    WRITE 63BYTES(89)
    WRITE 63BYTES(90)
    WRITE 63BYTES(91)
    WRITE 7 BYTES
    WRITE CHECKSUM(已发送4096字节)
  注意上面只包含的PC向微处理器写数据的情况,实际上若没关闭“回声”,微处理器会将上面所有数据回发一次,另外还有校验和响应等。
LPC2000系列微处理器ISP编程完整过程
    WRITE ?
    READ Synchronized\\r\\n
    WRITE Synchronized\\r\\n
    READ Synchronized\\r\\n
    READ OK\\r\\n
    WRITE 12000\\r\\n
    READ 12000\\r\\n
    READ OK\\r\\n
    WRITE U 23130\\r\\n
    READ U 23130\\r\\n
    READ 0\\r\\n
    WRITE P 0 1\\r\\n
    READ P 0 1\\r\\n
    READ 0\\r\\n
    WRITE E 0 1\\r\\n
    READ E 0 1\\r\\n
    READ 0\\r\\n
    WRITE W 1073742336 4096\\r\\n
    READ W 1073742336 4096\\r\\n
    READ 0\\r\\n
    
    发送4096字节UU编码后的数据
    WRITE P 0 0\\r\\n
    READ P 0 0\\r\\n
    READ 0\\r\\n
    WRITE C 0 1073742336 4096\\r\\n
    READ C 0 1073742336 4096\\r\\n
    READ 0\\r\\n
    
    发送4096字节UU编码后的数据
    WRITE P 0 0\\r\\n
    READ P 0 0\\r\\n
    READ 0\\r\\n
    WRITE C 4096 1073742336 4096\\r\\n
    READ C 4096 1073742336 4096\\r\\n
    READ 0\\r\\n
    
    发送4096字节UU编码后的数据
    WRITE P 1 1\\r\\n
    READ P 1 1\\r\\n
    READ 0\\r\\n
    WRITE C 8192 1073742336 4096\\r\\n
    READ C 8192 1073742336 4096\\r\\n
    READ 0\\r\\n
    发送92字节UU编码后的数据
    WRITE P 1 1\\r\\n
    READ P 1 1\\r\\n
    READ 0\\r\\n
    WRITE C 12288 1073742336 4096\\r\\n
    READ C 12288 1073742336 4096\\r\\n
    READ 0\\r\\n
    实际程序长度12,380字节

程序下载:
    LPC21XXISP.rarhttp://www.dragon-2008.com/download/ArmDsp/LPC21XXISP.rar
参考资料:
    1.LPC210X Datasheet
    2.LPC2000系列ARM Flash存储器系统和编程
     http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf
    3.《ARM微控制器基础与实战》
相关连接:
    1.Intel HEX文件格式http://www.dragon-2008.com/ArmDsp/ARTICLE/INTEL-HEX.htm
    2.UU编码简介http://www.dragon-2008.com/ArmDsp/ARTICLE/UUCODE.htm

更多
字体:【】-【】-【】【关闭此页

上一篇:基于FA526处理器SoC平台的Li'   下一篇:嵌入式微控制器MC68HC912B3'


特别声明:机电之家(http://www.jdzj.com )所共享的机电类资料,机电论文、机电类文章、机电企业类管理制度、机电类软件都来自网上收集,其版权归作者本人所有,如果有任何侵犯您权益的地方,请联系我们,我们将马上进行处理。购买的论文都出自原创,保证作者的原创的版权的转让,任何纠纷由法律解决。