分享

LPC系列的ISP协议的学习点滴

 戴维图书馆 2014-05-16

LPC系列的ISP协议的学习点滴

(2013-09-09 19:33:07)
分类: LPC

     很久很久以前做的ISP在线下载设备,设备都投入使用了学习中总结的点点滴滴却因为自己一拖再拖到现在才想起来整理一下。贴出来主要是留作以后自己查询使用,能够对别人有所帮助也是极好地。LPC系列的ISP协议的学习点滴

     1)使用串口调试ISP协议时如果一直不能正常收到返回,经常收到的是乱码。比如“?Synchronized”。原因是ISP命令发送时需要按一定的顺序发送的。首先设置上位机(PC机)串口,8个数据位,1个停止位,无奇偶校验。顺序如下:

上位机发送:“?<CR><LF> (同步)

      接收:Synchronized<CR><LF>” (响应)

      发送:Synchronized<CR><LF>

      接收:OK<CR><LF>

      发送:XXX <CR><LF> ”(设备的晶振频率,单位KHZ,如果运行10MHZ则应当发送10000)

      接收:OK<CR><LF>

之后就可以发送需要的ISP命令了。这里晶振频率应当大于等于10MHZ,Boot代码没有使用片内PLL。

     2)执行扇区擦除命令擦除扇区0和扇区1不会成功,因为这里保存着BootBlock

     3)如果想在PC机上看自己转换的UU码是否正确需要将转换后的文件保存成TXT格式不能保存成UUE格式,因为UUE格式在机子上是以压缩文件格式显示的,而解压后就是转换前的文件了,等于什么都没有改变过。

     4)转换后的UU码需要校验和,这个校验和是没有转换之前的相应的十六进的格式的数据的累加和(计算累加和时要注意别定义的太小发生和溢出现象)。

     5)我做的时候发现需要将十六进制文件先转换成十进制文件之后再转换成UU码才能转换成功,中间如果不进行二进制的转换而直接转换成UU码是不能成功的。

     6)在使用串口调试助手,或者串口精灵发送调试数据的时候最好不要使用黏贴的方式在发送窗口黏贴需要发送的UU码而是使用选择发送文件的方式,做成文件发送,因为黏贴的方式可能是串口调试助手的BUG,超过4行的UU码会发送出错。

     7)在ARM中使用J-Link调试软件需要在ADS的debug中添加JLINKRDI.DLL否则不能调试

     8)ADS的设置中有一个DebugRel settings这个需要注意。这里有一个介绍说“在标签Output 中,Linktype 中提供了三种链接方式。Partial 方式表示链接器只进行部分链接,经过部分链接生成的目标文件,可以作为以后进一步链接时的输入文件。Simple 方式是默认的链接方式,也是最为频繁使用的链接方式,它链接生成简单的 ELF 格式的目文件,使用的是链接器中指定的地址映象方式。Scattered 方式使得链接器要根据 scatter 格文件指定的地址映象,生成复杂的ELF 格式的映象文件,这个选项一般很少用到。”可是如果使用周立功的模板的话就可以省下这个设置直接使用分散加载就可以了,ZLG的分散加载文件men_a/b/c.scf的相关认识:

今天才明白ZLG的这个men_b.scf文件原来是ADS分散加载文件,不知道这是不是ZLG自创的一种文件加载模式,但以前用的都是统一加载,这个分散加载文件的作用应该就是简化了debug seeting中的相关设置,正因为在这个所谓的文件加载文件中将文件的相关加载地址做了详细的规定,所以在debug seeting中才选择了scattered设置,这个设置就是为用户有自己独特的文件加载文件而设置的一种文件加载方式,所以选择这个选项则用户只要制定所需要的加载文件,也就是这个.scf文件就不用设置相关的RO/RW和后边的系统文件选项了。ZLG之所以这样设置个人觉得只是为了减少人机交互,也就是使程序编写,尤其是调试更加傻瓜式,用户不需要知道文件加载的过程,不需要知道自己的文件在微处理器中加载到了哪了,怎样运行的,只要下载一个相应板子的加载文件这些就都解决了。可是我个人并不喜欢这种模式,这种方式不仅仅是使用户更傻瓜,对于系统文件的运行更加模糊,而且这会使开发者多写一个加载文件,而不是在debug seeting中设置几个地址那么简单了。各有利弊吧,这个所谓的分散加载文件的出现使程序员的工作加大,而大大简化了用户的使用。这也许也是一种发展方向,没有人能低档的住这种向“傻瓜式”前进的脚步。

下面详细分析一下这个分散加载文件:

ROM_LOAD 0x40000000                   //加载区起始地址,因为我在RAM中调试所以此//处是RAM首地址,对应setting中的RO base

{

    ROM_EXEC 0x40000000            //执行区,对应setting中的inage entry point

    {

        Startup.o (vectors, +First)     //放置中断向量表,对应setting中设置inmag //beging place section 设置为vectors

        * (+RO)                              //其他代码映像文件

    }

 

    IRAM 0x40003000                      //变量区,对应setting中的RW

    {

        Startup.o (MyStacks)            //用户堆栈区

        * (+RW,+ZI)                        //其他文件变量

    }

 

HEAP +0 UNINIT                             //系统堆栈空间,"+0"表示接着上一段"ERAM"的结//尾,继续安排存储区

    {

        Startup.o (Heap)

    }

 

    STACKS 0x40004000 UNINIT     //系统堆栈起始位置

    {

        Startup.o (Stacks)

    }

}

.scf文件中的设置对应setting中的设置

".scf"文件中的"+RW"对应".s"源文件中的"READWRITE".
".scf"文件中的"+ZI"对应".s"源文件中的"NOINIT".
".scf"文件中的"+RO"对应".s"源文件中的"READONLY".

在".s"源文件中有:
AREA area_name CODE/DATA,READONLY/NOINIT/READWRITE
END

     9)附送ISP命令返回状态汇总:

状态码 解释

CMD_SUCCESS 命令被成功执行。   
INVALID_COMMAND 无效命令   
SRC_ADDR_ERROR 源地址没有以字为边界    
DST_ADDR_ERROR 目标地址的边界错误    
SRC_ADDR_NOT_MAPPED 源地址没有位于存储器映射中。计数值必须考虑可用性。   
DST_ADDR_NOT_MAPPED 目标地址没有位于到存储器映射中。计数值必须考虑到可用性。 6  COUNT_ERROR 字节计数值不是4的倍数或是一个非法值。    
INVALID_SECTOR 扇区号无效或结束扇区号小于起始扇区号。   
SECTOR_NOT_BLANK 扇区非空。   
SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 为写操作准备扇区命令未执行。     10 COMPARE_ERROR 源和目标数据不相等。    
11 BUSY Flash 编程硬件接口忙。   
12 PARAM_ERROR 参数不足或无效参数。   
13 ADDR_ERROR 地址没有以字为边界。   
14 ADDR_NOT_MAPPED 地址没有位于存储器映射中。计数值必须考虑可用性。   
15 CMD_LOCKED 命令被锁定。    
16 INVALID_CODE 解锁代码无效。    
17 INVALID_BAUD_RATE 无效波特率设定。    
18 INVALID_STOP_BIT 无效停止位设定。   
19 CODE_READ_PROTECTION_ENABLED (在英文手册上找到的)

       10)LPC2上正常运行的是用户程序,因为ADS的JTAG调试的原因,与ADS调试链接之后就不会在乎P0.14引脚是否拉低了,一律进入调试程序也就是运行了用户程序。

    11)SSP通信暂时放弃,因为咨询了以前用过的人说SSP通信不是很通用的一种通信形式,最通用的是SPI通信,而且,SSP通信要比SPI通信复杂得多,所以不建议使用。

    12)ADS调试时报错“DEB Warning 00067 on object”显示某个文件改变,现在的修改于已有的文件时间不符。这个错误的解决办法是修改计算机时间。就是WINDOWS下的时间与现在时间相符,之后再ADS中“project->remove object code”就可以了

    13)对于ADS单步执行运行正常,全速执行则不能正常运行的问题:

(1)是在JLINK中CPU复位时间设置的太短了!见下图,把它改为2000MS就正常了!

(2)而之前的为什么用IAR单步执行能成功,原因是IAR的调试器做了处理,使得每一次调试的时候对PC指针的LSB做了一个奇偶变换;当全速运行的时候,调试器不管用了,直接由CPU接管,这个时候将函数地址加载给PC的值的LSB为偶数,当然导致程序跑飞了。

(3)这种情况大多是时序不匹配,程序全速时跑得太快了,仔细看Datasheet,在关键点加延时。

     14)为什么在RAM中能够正常运行在FLASH中不能正常运行?

    存储器加速寄存器设置不同,也就是寄存器MAMTIM此寄存器主要是决定MAM取指周期为多少个处理器时钟。我设置的是1个,而在数据手册中明确的写着“当处理器时钟为小于20M时使用1个处理周期,在20M到40M之间时使用2个处理周期,大于40M使用3个处理周期”而我的板子上的晶振是12M的,所以我就认为是小于20M了,可是,错了,这里说的是“处理器时钟”!!是的,处理器时钟不是晶振时钟,而是经过PLL锁相环之后的微处理器时钟,也就是说是Fcclk我设置的是4倍的晶振时钟,也就是说超过了40M应该是3个处理周期。

    为什么在RAM中运行时是正确的呢?因为,存储器加速器指的是从FLASH中读取数据的加速设置,在RAM中运行程序,不涉及到FLASH当然也就没有错了,但是现在是在FLASH中运行的所以这个值设置错了也就不能正常运行了

     15)如果在ADS调试在FLASH中调试时出现软件中断错误,或者运行到主函数是,停止无论运行,停止,单步按钮均无效时,下面调试窗口显示“program terminated normally ”时,就使用ISP在线下载工具擦除一下FLASH在重新连接调试运行就可以正常了。这可能就是所谓的FLASH锁住了吧。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多