LPC900单片机进入ISP问题
LPC900单片机(包括P89LPC920, P89LPC921, P89LPC922等型号)进入ISP,通常有好几种方法:
1. 用“三个脉冲”方法
2. 用串口的帧间隔检测法
3. 直接跳入法
下面是在ZLG论坛上看到的一个用户遇到的问题:
快要被ISP弄晕了。呵呵。
ZLG网站上关于ISP的资料我全看了,但还是没法进入ISP。
我用的型号是LPC921FDH, 采用内部RC时钟,外部复位信号。P0.0上有跳线,用来判断是否进入ISP。
最开始,我把新的没用过的芯片焊在板子上,这时应该上电就进入ISP,用Flash Magic验证,也是可以进入ISP的。这个没问题。
然后我就写了一个代码:
main.c如下:
void main()
{
unsigned char i, j;
/* init I/O pins */
#if (ENABLE_DEBUG || ENABLE_ISP)
/* debug or ISP mode */
P0M1 = 0xEF;
P0M2 = 0×1E;
P1M1 = 0×2E;
P1M2 = 0xDD;
P3M1 = 0×00;
P3M2 = 0xFF;
#else
/* normal mode. For final released code */
P0M1 = 0xEE;
P0M2 = 0×1F;
P1M1 = 0×2C;
P1M2 = 0xDF;
P3M1 = 0×00;
P3M2 = 0xFF;
#endif
#if ENABLE_ISP
enterISP();
#endif
P0 = 0xf1;
while(1)
{
for(i = 0; i < 240; i++)
{
for( j =0; j < 240; j++)
{
}
}
P0 ^= 0×0E;
}
}
其中有个enterISP函数,是用汇编写的,也就是ZLG资料里面的帧间隔初始化代码:
?PR?enterISP?ISP SEGMENT CODE
PUBLIC enterISP
RSEG ?PR?enterISP?ISP
enterISP:
JB P0.0,?C0002
ANL SSTAT,#0FAH ;clear BR bit, SSTAT.2
MOV BRGCON,#00H ;shut-off baud rate generator
ORL AUXR1,#40H ;set EBRR bit, let UART detect ISP signal
MOV SCON,#50H ;set UART mode = 1
MOV BRGR1,#05H ;set UART baud rate. Fosc = 7.3728MHz, baud rate = Fosc / ((BRGR1,BRGR0)+16) = 4800
MOV BRGR0,#0F0H
MOV BRGCON,#03H ;turn-on baud rate generator
?C0003:
SJMP ?C0003
?C0002:
RET
这段代码的意思就是,检测P0.0的值,若为0,初始化帧间隔检测,然后死循环;否则跳出,执行正常的程序。
这里有两个问题:
1. ZLG资料里面, 设置波特率为:BRGR1 = #90H, BRGR0 = #00H, 我不知道这里的时钟是频率是多少,
如果是12MHz的话,那么波特率算出来应该是:12000000/(0×9000 + 16) = 325 bps,这个正确吗?
反正这里我是按照内部RC时钟频率为7.3728MHz,设置成4800bps
2. 初始化帧间隔检测之后应该干什么呢?我这里的处理是死循环,等着上位机发帧间隔信号来。
我把这段程序编好后,用labtool-48uxp烧进单片机,用zlgISP_900程序,无法进入ISP。显示“超时,无法进入ISP”
我确认了以下关键点是没问题的:
1. 程序是没问题的。P0.0=1时,我的用户程序能正确运行。而P0.0=0时,用户程序没有运行,肯定是进入了
帧间隔检测代码段。
2. labtool-48uxp烧写的时候,肯定没有误擦除ISP驻留代码。
3. boot vector为1F, boot status改为0, (因为要从0×0000开始运行)
4. 电路连接也是没问题的,我用示波器看了, 使用zlgISP_900的时候,LPC921 UART的RXD上能收到上位机发的信号。
============ 分割线 ==============
后面我烦了,又看到可以直接调用ISP代码,即跳转到0×1F00。于是我修改了程序,把初始化帧间隔检测的代码
直接改成跳转到0×1F00,仍然不行。
可见该用户考虑到了很多因素,但是还有一条需要注意,LPC900各个型号的boot vector有所区别,比如LPC921的boot vecotr应该是0×0F,而不是其datasheet上默认的0×1F,这也许是那个用户进不了ISP的原因。
