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

2008-8-5 23:57 4084 6 4 分类: MCU/ 嵌入式

作者:龙林 EMAIL:dragon_hn@sohu.com WEB:www.dragon-2008.com


在系统中编程,英文简称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.PNG


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
 WRITE0x3F
  ?
 READ0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
  Synchronized\r\n
  WRITE0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
  Synchronized\r\n
 READ0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
  Synchronized\r\nOK\r\n
 WRITE0x31 0x32 0x30 0x30 0x30 0x0D 0x0A
  12000\r\n
 READ0x31 0x32 0x30 0x30 0x30 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
  12000\r\nOK\r\n
 WRITE0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A
  U 23130\r\n
 READ0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A 0x30 0x0D 0x0A
  U 23130\r\n0\r\n
 WRITE0x4A 0x0D 0x0A
  J\r\n
 READ0x4A 0x0D 0x0A 0x30 0x0D 0x0A
  J\r\n0\r\n
 READ0x34 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.rar


参考资料:
1.LPC210X Datasheet
2.LPC2000系列ARM Flash存储器系统和编程
http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf
3.《ARM微控制器基础与实战》


相关连接:
1.Intel HEX文件格式
2.UU编码简介

文章评论1条评论)

登录后参与讨论

用户461316 2008-8-6 00:24

顶起!!!!!!!
相关推荐阅读
用户461316 2009-08-17 17:57
Zigbee星型网络组网程序段
最近一直在做Zigbee的星型网络的组网试验,由于时间的原因,现在只是在最高的应用层上来编写程序。即协议栈的程序是2430的开发商(无限龙)编写的,我只是调用相应的函数来完成组网的,星型网络组网部分的...
用户461316 2009-08-17 17:14
VB6的标题栏使用上真彩色图标
模块 ModIcon.Bas 代码: Option Explicit Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long...
用户461316 2009-08-17 16:58
AppendToLog一个API方式存取日志文件的模块
'**************************************' 模块名称: AppendToLog' 功能描述:一个很不错的日志文件写入模块,不同于'     open/print/...
用户461316 2009-08-17 16:57
(VB自定义函数)去除字符串中的空格
'去除字符串中的空格(方法一)Public Function DelBlank(SearchString As String)   DelBlank = Replace(SearchString, C...
用户461316 2009-08-17 16:56
(VB自定义函数)对任意输入的汉字,可以得到它的拼音的第一个字母
调用方法:Command1.Caption = getHzPy("你")'//函数入口为汉字串,返回值为该汉字的第一个字母Public Function getHzPy(hzStr As String...
用户461316 2009-08-17 16:54
VB_代码执行速度测试
'**************************************'Windows API/Global Declarations for :[ '     A Simple] code ...
我要评论
1
6
关闭 站长推荐上一条 /2 下一条