本帖最后由 awmc_m 于 2010-1-27 19:22 编辑
word文档.rar
(124.36 KB)
lpc936_isp源码及工具.rar
(4.63 MB)
LPC900ISP相关资料.part1.rar
(3.81 MB)
LPC900ISP相关资料.part2.rar
(2.82 MB)
(各操作截图请查看word文档,发图太累了: )
用过nxp lpc900系列单片机的同志都知道,其出厂自带的isp程序极其难用,一旦烧写失败,即使神仙下凡,想再进isp几乎都不大可能。按其所说的三种方法,不论是三个脉冲还是帧间隔的方法都无济于事。我已经被它折磨了不止一次了,于是打算要找到一个方法,在没有icp编程器的情况下改写它的isp代码(以下所有操作均使用内置rc震荡,使用外置晶体的朋友需要将程序与配置稍作修改)。
搜遍整个网络有关lpc936的isp相关技术文档,耗时一天,终于完成命题,不但不容易烧写失败,而且波特率为115200,速度提升了不少。现特提供我的方法与大家分享,方便没有icp编程器或嫌使用icp调试太麻烦想isp屡试不爽的朋友参考。
新片lpc936在isp代码驻留区(3e00h开始)带了厂家的isp代码,且引导状态字配置为“1”,即上电时便自动进入isp,于是第一次烧写是很容易成功的。当我们将主程序烧写进去后,一般还需将引导状态字配置成“0”,这样程序才会从0000h开始执行。厂家的isp程序串口波特率是自适应的,但是自适应效果相当差,一般情况下还是7200的波特率下烧写成功率高,但是速度太慢,烧写10几k的代码需要近一分钟。
以前为了可以一直使用isp,特别在主程序中加入跳转程序,即作一个判断,在某按键按下(io口为低)的情况下程序自动调转到3f00h处执行isp代码。代码如下:
void (*Excute)();
void goto_isp()
{
Excute=0x3F00;
isp_pin_init();
if(isp_pin==0)
{
Excute();
}
}
但是由于厂家isp程序太烂(怀疑主要原因还是波特率自适应能力太差),常烧写一半后失败,不得不用烧写器(我没有,有也懒得用,拔插太麻烦耗时)。于是想:是否可以将跳转放在isp程序中呢。于是在lpc936的isp程序中加入以下判断:
ISP_START:
MOV 84H,#00H
MOV 85H,#00H ;初始化p0为准双向口
JNB P0.1,STARTJ ;判断p0.1是否为低,为低则进入isp
LJMP 0000H ;为高则跳到0000h执行用户程序
STARTJ: …… ;以下为烧写程序的代码
同时将波特率自适应的程序改为设置波特率为115200(用内置rc震荡的情况下)。将该isp用icp烧写进mcu,并将引导状态字配置为“1”(即从3f00h程序地址启动)。那么在p0.1未按下(为高)的情况下复位,程序便会从3f00h启动,然后跳到0000h执行用户代码。而在p0.1按下(为低)的情况下复位,则进入isp,进行用户程序升级。
以上isp程序编译后生成isp.hex。(此处标记,下文有用)
但是这样修改的isp程序还是要用icp下载,对于没有icp的朋友来说也是很头痛的,于是又想:是否可以通过用户程序来升级isp程序呢?既然新片是很容易烧写成功的,那么先将isp程序改为用户程序(该用户程序与isp有相同的功能,但是代码区不同)烧写进去, |