114327|9

275

帖子

4848

TA的资源

五彩晶圆(初级)

楼主
 

彻底摆脱nxp p89lpc936单片机isp烦恼 [复制链接]

用过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代码。代码如下:

  1. void (*Excute)();
  2. void goto_isp()
  3. {
  4. Excute =0x3F00;
  5. isp_pin_init();
  6. if(isp_pin==0)
  7.   {
  8.    Excute();
  9.   }
  10. }
复制代码


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


  1. ISP_START:  
  2.     MOV  84H,#00H  
  3.              MOV 85H,#00H  ;初始化p0为准双向口
  4.     JNB  P0.1,STARTJ     ;判断p0.1是否为低,为低则进入isp
  5.     LJMP 0000H           ;为高则跳到0000h执行用户程序
  6. STARTJ:   ……                    ;以下为烧写程序的代码
复制代码


同时将波特率自适应的程序改为设置波特率为115200(用内置rc震荡的情况下)。将该isp用icp烧写进mcu,并将引导状态字配置为“1”(即从3f00h程序地址启动)。那么在p0.1未按下(为高)的情况下复位,程序便会从3f00h启动,然后跳到0000h执行用户代码。而在p0.1按下(为低)的情况下复位,则进入isp,进行用户程序升级。

以上isp程序编译后生成isp.hex。(此处标记,下文有用)

但是这样修改的isp程序还是要用icp下载,对于没有icp的朋友来说也是很头痛的,于是又想:是否可以通过用户程序来升级isp程序呢?既然新片是很容易烧写成功的,那么先将isp程序改为用户程序(该用户程序与isp有相同的功能,但是代码区不同)烧写进去,然后再将isp程序通过用户程序烧写进isp代码驻留区(有点乱,理理!)。

isp程序修改为用户程序如下:


  1. ORG      3E00H      更改为          ORG     0E00H
  2. ORG      3F00H      更改为          ORG     0F00H
  3. 在程序开头加入:
  4. ORG     0000H
  5. LJMP     0F00H

复制代码


并将之前io口检测程序(用p0.1作判断)删除。

将修改后的程序保存为main_isp.asm。编译后生成main_isp.hex。

以下硬件只需要新的lpc936,串口,用作isp判断的按键,复位键,单片机电源即可。

先用ZlgISP_900这个isp下载工具下载,该软件会占用串口,而且步骤麻烦,不好用。但是用flash magic无法进入isp模式,所以用厂家自带的isp还得用zlgisp这个工具。待自己的isp程序烧写成功后便可使用flash magic了。
此帖出自单片机论坛

最新回复

不错  详情 回复 发表于 2022-11-27 14:06
点赞 关注(1)
 

回复
举报

275

帖子

4848

TA的资源

五彩晶圆(初级)

沙发
 
打开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,选择串口,设置波特率为115200,ic选89lpc936,接口为None(ISP)。
3、将需要升级的hex文件导入。按start按钮下载至完成。
4、不要复位,进入ISP------Boot vector and status bit…,boot vector为0x3F,且选择status bit=1。选择完成后点“reprogram”按钮将配置位烧写进单片机。
5、复位单片机,即可以工作了。
如果您想省略上面的第四步,请在自己的主函数开头加入以下函数:


  1. sbit isp_pin=P0^1;
  2. void (*Excute)();
  3. void main1();
  4. void goto_isp()
  5. {
  6. Excute =0x3F00;
  7. P0M1   =0;
  8. P0M2   =0;
  9. if(isp_pin==0)
  10.   {
  11.    Excute();
  12.   }
  13. }
  14. void main()
  15. {
  16. goto_isp();
  17. while(1)
  18. {
  19.   main1();
  20. }
  21. }
  22. void main1()
  23. {
  24. 原主函数;
  25. }
复制代码
但是一旦您未进行第4步,而且主程序中没有加入判断跳转,那么对不起,请用icp修改配置,使程序从isp区启动,按住isp键复位升级。

另外,还可以在主程序中采用串口帧检测的方法进入isp,同时还可以在isp完成后通过软件写寄存器A2H的方法进行复位。这样就可以通过串口控制进行升级了,适合远程控制升级。有兴趣的可以自己实验。

其他lpc922以上带isp功能的单片机也可参考这个方法升级isp,不同的是程序大小及isp驻留区域。


lpc936_isp源码及工具.rar (4.63 MB, 下载次数: 4509)

LPC900ISP相关资料.rar (6.64 MB, 下载次数: 5547)

[ 本帖最后由 老夫子 于 2010-2-5 12:04 编辑 ]
此帖出自单片机论坛
 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
这么好的贴都没人顶啊,那咱就多顶几次 顶顶顶顶顶顶顶
此帖出自单片机论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

4
 
疑问:用你的ISP源码 编译出来的code有8192字节,放在ISP memory中根本放不下啊
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
其实厂家ISP有设置波特率的功能,NXP的ISP没有楼主想象中的烂。

另外,因为ISP必定要用到UART,可以在用户程序中初始化UART,让用户程序在接到特定命令时进入ISP。
此帖出自单片机论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(中级)

6
 
楼主是强人啊,
此帖出自单片机论坛
 
个人签名www.weboch.com.cn
NXP MCU RFID Logic automotive  IC & solution
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
向高手问好!请问你会解密NXP芯片吗?型号是LPC932A1FA.
此帖出自单片机论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

8
 
不错资料
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 

楼主优秀啊

此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 

不错

此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表