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