|
彻底摆脱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代码。代码如下:
- 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有相同的功能,但是代码区不同)烧写进去,然后再将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了。
|
|