在系统中编程,英文简称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模式,则微处理器会发送“Synchronizedrn”给PC,PC在接收到“Synchronizedrn”之后,回发“Synchronizedrn”给微处理器,微处理器在收到“Synchronizedrn”之后,发送“SynchronizedrnOKrn”给PC,PC在收到“SynchronizedrnOKrn”之后,以ASCII码的形式发送晶振频率(kHz)给微处理器。例如晶振频率为12MHz,则PC发送给微处理器的字串为“12000rn”。微处理器在接收到晶振频率之后会发送“OKrn”给PC作为响应。
注意事项:
(1) 处理器与PC的数据交换过程中,所有数据均以“rn”作为结尾,十六进制为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
R
P <起始扇区><结束扇区> 选定即将操作的扇区范围。
C
G <地址><模式> 执行 FLASH或RAM中的代码。
E <起始扇区><结束扇区> 擦除选定的扇区。
I <起始扇区><结束扇区> 检查指定的扇区是否为空。
J 读器件 ID。
K 读 BOOT代码版本号。
M <地址1><地址2><字节数> 比较 FLASH和/或RAM中的数据。
注意事项:
(1) 处理器与PC的数据交换过程中,所有数据均以“rn”作为结尾,十六进制为0x0D,0x0A。
(2) 任何发送或接收出错之后,只能通过PC软件提示“操作失败”,并要求用户重启(复位/开关电源)微处理器来解决。
(3) 所有数字均以ASCII码的形式发送。
(4) 所有参数均以空格作为分隔符, 十六进制为0x20。
ISP命令的响应
在执行ISP命令之后,微处理器会发送“0rn”之类的字串给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
Synchronizedrn
WRITE 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
Synchronizedrn
READ 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
SynchronizedrnOKrn
WRITE 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A
12000rn
READ 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
12000rnOKrn
WRITE 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A
U 23130rn
READ 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A 0x30 0x0D 0x0A
U 23130rn0rn
WRITE 0x4A 0x0D 0x0A
Jrn
READ 0x4A 0x0D 0x0A 0x30 0x0D 0x0A
Jrn0rn
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编码行的形式发送实际数据,且每个数据包都以 “rn”结束,所以在UU编码行长度为61字节的时候,发送器实际发送的数据长度为63字节(61个字节UU编码+2字节“rn”)。
2.在发送20个UU编码行之后,应该发送数据校验和。
数据校验和即为上次校验和计算之后所有发送的原始数据的和。
数据校验和以ASCII码的方式发送,以 “rn”结束。
接收器在收到校验和后与它接收的数据的校验和相比较,如果校验和匹配,接收器就发送“OKrn”,并等待下一次发送。如果校验和不匹配,接收器就发送“RESENDrn”。
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 ?
READSynchronizedrn
WRITE Synchronizedrn
READSynchronizedrn
READOKrn
WRITE 12000rn
READ12000rn
READOKrn
WRITE U 23130rn
READU 23130rn
READ0rn
WRITE P 0 1rn
READP 0 1rn
READ0rn
WRITE E 0 1rn
READE 0 1rn
READ0rn
WRITE W 1073742336 4096rn
READW 1073742336 4096rn
READ0rn
发送4096字节UU编码后的数据
WRITE P 0 0rn
READP 0 0rn
READ0rn
WRITE C 0 1073742336 4096rn
READC 0 1073742336 4096rn
READ0rn
发送4096字节UU编码后的数据
WRITE P 0 0rn
READP 0 0rn
READ0rn
WRITE C 4096 1073742336 4096rn
READC 4096 1073742336 4096rn
READ0rn
发送4096字节UU编码后的数据
WRITE P 1 1rn
READP 1 1rn
READ0rn
WRITE C 8192 1073742336 4096rn
READC 8192 1073742336 4096rn
READ0rn
发送92字节UU编码后的数据
WRITE P 1 1rn
READP 1 1rn
READ0rn
WRITE C 12288 1073742336 4096rn
READC 12288 1073742336 4096rn
READ0rn
实际程序长度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
(综合电子论坛)
上一篇:高效率嵌入式程序开发
下一篇:uC/OS-II在ARM系统上的移植与实现
- 热门资源推荐
- 热门放大器推荐
小广播
热门活动
换一批
更多
最新嵌入式文章
更多精选电路图
更多热门文章
更多每日新闻
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况
更多往期活动
11月17日历史上的今天
厂商技术中心