打印

彻底摆脱nxp p89lpc936单片机的isp烦恼,让你一劳永逸

[复制链接]
9015|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
awmc_m|  楼主 | 2010-1-27 18:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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震荡,使用外置晶体的朋友需要将程序与配置稍作修改)。
    搜遍整个网络有关lpc936isp相关技术文档,耗时一天,终于完成命题,不但不容易烧写失败,而且波特率为115200,速度提升了不少。现特提供我的方法与大家分享,方便没有icp编程器或嫌使用icp调试太麻烦想isp屡试不爽的朋友参考。
    新片lpc936isp代码驻留区(3e00h开始)带了厂家的isp代码,且引导状态字配置为“1”,即上电时便自动进入isp,于是第一次烧写是很容易成功的。当我们将主程序烧写进去后,一般还需将引导状态字配置成“0”,这样程序才会从0000h开始执行。厂家的isp程序串口波特率是自适应的,但是自适应效果相当差,一般情况下还是7200的波特率下烧写成功率高,但是速度太慢,烧写10k的代码需要近一分钟。
    以前为了可以一直使用isp,特别在主程序中加入跳转程序,即作一个判断,在某按键按下(io口为低)的情况下程序自动调转到3f00h处执行isp代码。代码如下:
        void (*Excute)();
        void goto_isp()
        {
              Excute=0x3F00;
              isp_pin_init();
              if(isp_pin==0)

                    {

                           Excute();
                    }
         }
    但是由于厂家isp程序太烂(怀疑主要原因还是波特率自适应能力太差),常烧写一半后失败,不得不用烧写器(我没有,有也懒得用,拔插太麻烦耗时)。于是想:是否可以将跳转放在isp程序中呢。于是在lpc936isp程序中加入以下判断:
       ISP_START:
                                 MOV     84H,#00H

                                 MOV     85H,#00H        ;
初始化p0为准双向口

                                 JNB       P0.1,STARTJ  ;
判断p0.1是否为低,为低则进入isp

                                 LJMP    0000H              ;为高则跳到0000h执行用户程序
       STARTJ:             ……                ;以下为烧写程序的代码

    同时将波特率自适应的程序改为设置波特率为115200(用内置rc震荡的情况下)。将该ispicp烧写进mcu,并将引导状态字配置为“1”(即从3f00h程序地址启动)。那么在p0.1未按下(为高)的情况下复位,程序便会从3f00h启动,然后跳到0000h执行用户代码。而在p0.1按下(为低)的情况下复位,则进入isp,进行用户程序升级。
    以上isp程序编译后生成isp.hex。(此处标记,下文有用)
    但是这样修改的isp程序还是要用icp下载,对于没有icp的朋友来说也是很头痛的,于是又想:是否可以通过用户程序来升级isp程序呢?既然新片是很容易烧写成功的,那么先将isp程序改为用户程序(该用户程序与isp有相同的功能,但是代码区不同)烧写进去,
评分
参与人数 1威望 +1 收起 理由
handlike + 1

相关帖子

沙发
awmc_m|  楼主 | 2010-1-27 18:53 | 只看该作者
本帖最后由 awmc_m 于 2010-1-27 19:19 编辑


然后再将isp程序通过用户程序烧写进isp代码驻留区(有点乱,理理!)。
    isp程序修改为用户程序如下:
        ORG      3E00H      更改为          ORG     0E00H
        ORG      3F00H      更改为          ORG     0F00H
    在程序开头加入:
        ORG     0000H
        LJMP     0F00H
    并将之前io口检测程序(用p0.1作判断)删除。
    将修改后的程序保存为main_isp.asm。编译后生成main_isp.hex。
    以下硬件只需要新的lpc936,串口,用作isp判断的按键,复位键,单片机电源即可。
    先用ZlgISP_900这个isp下载工具下载,该软件会占用串口,而且步骤麻烦,不好用。但是用flash magic无法进入isp模式,所以用厂家自带的isp还得用zlgisp这个工具。待自己的isp程序烧写成功后便可使用flash magic了。
    打开zlgisp_900:
    将安全级别设置为“弱级”,这样做是为了可以修改引导状态字:
    选择方法二 三个脉冲的方法(这个其实无所谓),选择芯片为lpc936,波特率为7200,将main_isp.hex文件导入,点击第4步中的“查看配置信息”,按下图配置,特别要将“引导向量=0x1”复选框中的钩钩去掉(即引导状态字为0),那样当你烧写后才会从用户程序区开始执行。最后点击“设置配置信息至缓冲区”即配置完成。
    在第4步中点最长的框框进行编程便将main_isp.hex烧写进单片机的用户区。此时单片机就具有了升级isp代码的功能了。接下来我们就可以使用flash magic来下载了。
    打开flash magic:
    选择串口(将之前的zlgisp关闭,因为它会占用串口),设置波特率为115200,ic选89lpc936,接口为None(ISP)。
    进入option-------advanced options:
    将protect ISP Code前复选框中的钩钩去掉(允许改写isp代码),点ok确认退出。
    将上文提到的修改后的isp程序isp.hex导入,复位单片机即进入了isp。进入第5步点击start按钮进行下载,下载完成后,不要复位,进入ISP------Boot vector and status bit…
    按下图选择:boot vector为0x3F,且选择status bit=1。(这是配置程序从3f00h启动,即上电启动ISP。),选择完成后点“reprogram”按钮将配置位烧写进单片机。(每次下载完用户程序后,flash magic会默认修改该配置,使得程序从用户区启动,所以要特别注意如果您需要从ISP区启动,每次在下载完用户程序后仍然需要进行此项操作。至今我未找到可避免的方法或设置项,希望了解的朋友告知。)
    至此,不使用icp编程器的情况下改写isp程序完成。
    以下是使用该isp升级程序的方法:
        1、按住isp按键,我用的是p0.1,然后复位。
        2、打开flash magic,选择串口,设置波特率为115200ic89lpc936,接口为NoneISP)。
        3、将需要升级的hex文件导入。按start按钮下载至完成。
        4、不要复位,进入ISP------Boot vector and status bit…boot vector0x3F,且选择status bit=1。选择完成后点“reprogram”按钮将配置位烧写进单片机。
        5、复位单片机,即可以工作了。

    如果您想省略上面的第四步,请在自己的主函数开头加入以下函数:
        sbit isp_pin=P0^1;
        void (*Excute)();
        void main1();
        void goto_isp()
        {
                 Excute=0x3F00;
                 P0M1=0;
                 P0M2=0;
                 if(isp_pin==0)

                   {

                         Excute();
                    }
         }
        void main()
         {

                goto_isp();

                while(1)

                {
                        main1();

                 }
          }
        

        void main1()
        {
                 原主函数;
        }
    但是一旦您未进行第4步,而且主程序中没有加入判断跳转,那么对不起,请用icp修改配置,使程序从isp区启动,按住isp键复位升级。
    另外,还可以在主程序中采用串口帧检测的方法进入isp,同时还可以在isp完成后通过软件写寄存器A2H的方法进行复位。这样就可以通过串口控制进行升级了,适合远程控制升级。有兴趣的可以自己实验。
    其他lpc922以上带isp功能的单片机也可参考这个方法升级isp,不同的是程序大小及isp驻留区域。

使用特权

评论回复
板凳
huangqi412| | 2010-1-27 19:31 | 只看该作者
MARK,顶一把。

使用特权

评论回复
地板
arm86| | 2010-1-27 20:48 | 只看该作者
同3楼

使用特权

评论回复
5
古道热肠| | 2010-1-27 21:39 | 只看该作者
用Keil公司出品的MCB900评估板电路,FlashMagic触发LPC900单片机执行下载程序成功率较高,选4800bps时,一次联机成功率可达90以上。
用ISP最怕的是搞错配置字,比如选中看门狗时钟做为主时钟,那只能用ICP重新刷机了。
下面文档详细的介绍了使用FlashMagic软件和MCB900电路完成LPC900系列单片机ISP程序的功能。有动手动力的网友完全可以自制。

ISP下载器图.jpg (31.32 KB )

ISP下载器图.jpg

涛行LPC900系列单片机ISP程序编程器使用说明书.pdf

1.01 MB

使用特权

评论回复
6
古道热肠| | 2010-1-27 21:41 | 只看该作者
楼主的这想法不错,让ISP功能优先执行,比想方设法触发它实用多了。

使用特权

评论回复
7
lxl_0598| | 2010-1-28 08:54 | 只看该作者
学习了,刚好用的是lpc900系列

使用特权

评论回复
8
micropower| | 2010-1-28 12:04 | 只看该作者
暂时用不上,只是来围观.

使用特权

评论回复
9
gx_huang| | 2010-1-28 12:43 | 只看该作者
做批量产品还是ICP比较好,起码程序空间会大一些,代码保护会好一些。

使用特权

评论回复
10
cat_li| | 2010-1-28 16:33 | 只看该作者
呵呵,目前还用不到

使用特权

评论回复
11
Simon21ic| | 2010-1-28 17:47 | 只看该作者
直接用ICP不是更加方便?

使用特权

评论回复
12
awmc_m|  楼主 | 2010-1-28 21:23 | 只看该作者
直接用ICP不是更加方便?
Simon21ic 发表于 2010-1-28 17:47

icp编程需要icp接口,而且调试时还需要经常拔插,还有个导入文件的过程,这样调试影响效率。
而isp只需要用到串口,一般调试我们就是连着串口的,所以不需要任何拔插,用flash magic下载,只要hex文件目录不变就不需要重新导入文件。
还有已装配的产品升级,有些产品本身就带串口,那么就可以直接用这个串口来进行升级,不需要开盖,对用户来说,也不需要因此买个icp编程器。

使用特权

评论回复
13
古道热肠| | 2010-1-29 22:31 | 只看该作者
IAP升级应用程序的意义在于可以通过多渠道获取最新固件,比哪有SD卡的播放器.可以通过SD卡来升级应用程序,因为IAP是自定义的,因而还可对升级的内容进行加密.

使用特权

评论回复
14
fourwave| | 2010-9-20 15:31 | 只看该作者
本帖最后由 fourwave 于 2010-9-20 15:43 编辑

老帖子,新发现的,真不错,顶楼主,功德无量

使用特权

评论回复
15
ayb_ice| | 2010-9-20 16:12 | 只看该作者
我就直接换MCU,直接上有硬件调试接口的MCU,比如C8051F,MSP430,S08....

使用特权

评论回复
16
handlike| | 2010-9-20 22:30 | 只看该作者
一直用LPC900系列,这块一直没有深入研究,受教了。
这款MCU除了仿真做的不太好外,其它的非常棒。

使用特权

评论回复
17
rossi_lao| | 2010-9-20 23:07 | 只看该作者
lpc900系列,在上电时会有死机情况出现,请问如何解决。
供电是24V用lm2594-3.3直接输出3.3V给单片机和其他芯片供电的。

使用特权

评论回复
18
liaoyj| | 2013-11-19 10:09 | 只看该作者
顶楼主。弱弱地问一句LPC900系列下载不是用Zlisp_900软件吗?怎么又冒出一个flash magic下载?求楼主指教小菜鸟。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

368

帖子

0

粉丝