搜索
bottom↓
回复: 11

LPC17xx系列芯片的序列号怎么读取?

[复制链接]

出0入0汤圆

发表于 2011-7-9 09:07:14 | 显示全部楼层 |阅读模式
现在在使用LPC1763这款芯片,FLashMagic软件里可以读取到每个芯片的序列号,我在程序里怎么读取到呢,有人做到吗?谢谢告诉我方法。

出0入0汤圆

 楼主| 发表于 2011-7-9 12:56:13 | 显示全部楼层
找了一个上午,终于在ZLG的例程里找到个源码。但还是没看懂IAP_ENTER_ADR定义的位置是怎么来的。

#define IAP_ENTER_ADR   0x1FFF1FF1                                      /* IAP入口地址定义              */

/*
*  定义IAP命令字
*/                                    
#define IAP_Prepare             50                                      /* 选择扇区                     */
                                                                        /* 【起始扇区号、结束扇区号】   */                    
#define IAP_RAMTOFLASH          51                                      /* 拷贝数据 FLASH目标地址       */
                                                                        /* RAM源地址    【、写入字节数  */
                                                                        /* 系统时钟频率】               */
#define IAP_ERASESECTOR         52                                      /* 擦除扇区    【起始扇区号     */
                                                                        /* 结束扇区号、系统时钟频率】   */
#define IAP_BLANKCHK            53                                      /* 查空扇区    【起始扇区号、   */
                                                                        /* 结束扇区号】                 */
#define IAP_READPARTID          54                                      /* 读器件ID    【无】           */
#define IAP_BOOTCODEID          55                                      /* 读Boot版本号【无】           */
#define IAP_COMPARE             56                                      /* 比较命令    【Flash起始地址  */
                                                                        /* RAM起始地址、需要比较的      */
                                                                        /* 字节数】                     */

/*
*  定义IAP返回状态字
*/
#define CMD_SUCCESS                                0
#define INVALID_COMMAND                            1
#define SRC_ADDR_ERROR                             2
#define DST_ADDR_ERROR                             3
#define SRC_ADDR_NOT_MAPPED                        4
#define DST_ADDR_NOT_MAPPED                        5
#define COUNT_ERROR                                6
#define INVALID_SECTOR                             7
#define SECTOR_NOT_BLANK                           8
#define SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION    9
#define COMPARE_ERROR                              10
#define BUSY                                       11


/*
*  定义CCLK值大小,单位为KHz
*/
#define IAP_FCCLK            (25000)

/*
*  定义函数指针  
*/
void (*IAP_Entry) (INT32U ulParam_tab[], INT32U ulPesult_tab[]);

INT32U  GulParamin[8];                                                  /* IAP入口参数缓冲区            */
INT32U  GulParamout[8];                                                 /* IAP出口参数缓冲区            */
/*********************************************************************************************************
** Function name:       sectorPrepare
** Descriptions:        IAP操作扇区选择,命令代码50
** input parameters:    ucSec1:           起始扇区
**                      ucSec2:           终止扇区
** output parameters:   GulParamout[0]:    IAP操作状态码,IAP返回值     
** Returned value:      GulParamout[0]:    IAP操作状态码,IAP返回值                     
*********************************************************************************************************/
INT32U  sectorPrepare (INT8U ucSec1, INT8U ucSec2)
{  
    GulParamin[0] = IAP_Prepare;                                        /* 设置命令字                   */
    GulParamin[1] = ucSec1;                                             /* 设置参数                     */
    GulParamin[2] = ucSec2;                           
    (*IAP_Entry)(GulParamin, GulParamout);                              /* 调用IAP服务程序              */
   
    return (GulParamout[0]);                                            /* 返回状态码                   */
}

/*********************************************************************************************************
** Function name:       ramCopy
** Descriptions:        复制RAM的数据到FLASH,命令代码51
** input parameters:    ulDst:             目标地址,即FLASH起始地址。以512字节为分界
**                      ulSrc:             源地址,即RAM地址。地址必须字对齐
**                      ulNo:              复制字节个数,为512/1024/4096/8192
** output parameters:   GulParamout[0]:    IAP操作状态码,IAP返回值     
** Returned value:      GulParamout[0]:    IAP操作状态码,IAP返回值                     
*********************************************************************************************************/
INT32U  ramCopy (INT32U ulDst, INT32U ulSrc, INT32U ulNo)
{  
    GulParamin[0] = IAP_RAMTOFLASH;                                     /* 设置命令字                   */
    GulParamin[1] = ulDst;                                              /* 设置参数                     */
    GulParamin[2] = ulSrc;
    GulParamin[3] = ulNo;
    GulParamin[4] = IAP_FCCLK;
    (*IAP_Entry)(GulParamin, GulParamout);                              /* 调用IAP服务程序              */
   
    return (GulParamout[0]);                                            /* 返回状态码                   */
}

/*********************************************************************************************************
** Function name:       sectorErase
** Descriptions:        扇区擦除,命令代码52
** input parameters:    ucSec1             起始扇区
**                      ucSec2             终止扇区92
** output parameters:   GulParamout[0]:    IAP操作状态码,IAP返回值
** Returned value:      GulParamout[0]:    IAP操作状态码,IAP返回值                     
*********************************************************************************************************/
INT32U  sectorErase (INT8U ucSec1, INT8U ucSec2)
{  
    GulParamin[0] = IAP_ERASESECTOR;                                    /* 设置命令字                   */
    GulParamin[1] = ucSec1;                                             /* 设置参数                     */
    GulParamin[2] = ucSec2;
    GulParamin[3] = IAP_FCCLK;
    (*IAP_Entry)(GulParamin, GulParamout);                              /* 调用IAP服务程序              */
   
    return (GulParamout[0]);                                            /* 返回状态码                   */
}

/*********************************************************************************************************
** Function name:       blankChk
** Descriptions:        扇区查空,命令代码53
** input parameters:    ucSec1:              起始扇区
**                      ucSec2:              终止扇区92
** output parameters:   GulParamout[0]:    IAP操作状态码,IAP返回值
** Returned value:      GulParamout[0]:    IAP操作状态码,IAP返回值                     
*********************************************************************************************************/
INT32U  blankChk (INT8U ucSec1, INT8U ucSec2)
{  
    GulParamin[0] = IAP_BLANKCHK;                                       /* 设置命令字                   */
    GulParamin[1] = ucSec1;                                             /* 设置参数                     */
    GulParamin[2] = ucSec2;
    (*IAP_Entry)(GulParamin, GulParamout);                              /* 调用IAP服务程序              */

    return (GulParamout[0]);                                            /* 返回状态码                   */
}

/*********************************************************************************************************
** Function name:       parIdRead
** Descriptions:        扇区查空,命令代码54
** input parameters:    无
** output parameters:   GulParamout[0]:    IAP操作状态码,IAP返回值
** Returned value:      GulParamout[0]:    IAP操作状态码,IAP返回值                     
*********************************************************************************************************/
INT32U  parIdRead (void)
{  
    GulParamin[0] = IAP_READPARTID;                                     /* 设置命令字                   */
    (*IAP_Entry)(GulParamin, GulParamout);                              /* 调用IAP服务程序              */

    return (GulParamout[0]);                                            /* 返回状态码                   */
}

/*********************************************************************************************************
** Function name:       codeIdBoot
** Descriptions:        扇区查空,命令代码55
** input parameters:    无
** output parameters:   GulParamout[0]:    IAP操作状态码,IAP返回值
** Returned value:      GulParamout[0]:    IAP操作状态码,IAP返回值                     
*********************************************************************************************************/
INT32U  codeIdBoot (void)
{  
    GulParamin[0] = IAP_BOOTCODEID;                                     /* 设置命令字                   */
    (*IAP_Entry)(GulParamin, GulParamout);                              /* 调用IAP服务程序              */

    return (GulParamout[0]);                                            /* 返回状态码                   */
}

/*********************************************************************************************************
** Function name:       dataCompare
** Descriptions:        校验数据,命令代码56
** input parameters:    ulDst:             目标地址,即RAM/FLASH起始地址。地址必须字对齐
**                      ulSrc:             源地址,即FLASH/RAM地址。地址必须字对齐
**                      ulNo:              复制字节个数,必须能被4整除
** output parameters:   GulParamout[0]:    IAP操作状态码,IAP返回值
** Returned value:      GulParamout[0]:    IAP操作状态码,IAP返回值                     
*********************************************************************************************************/
INT32U  dataCompare (INT32U ulDst, INT32U ulSrc, INT32U ulNo)
{  
    GulParamin[0] = IAP_COMPARE;                                        /* 设置命令字                   */
    GulParamin[1] = ulDst;                                              /* 设置参数                     */
    GulParamin[2] = ulSrc;
    GulParamin[3] = ulNo;
    (*IAP_Entry)(GulParamin, GulParamout);                              /* 调用IAP服务程序              */

    return (GulParamout[0]);                                            /* 返回状态码                   */
}

/*********************************************************************************************************
** Function name:       main
** Descriptions:        通过RTC中断将芯片从深度掉电中唤醒,深度掉电唤醒后复位。短接JP17,全速运行以后,
**                      蜂鸣器会响一声
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{   
    INT8U ucErr;
    INT32U i;

        targetInit();                                                       /* 初始化目标板,切勿删除       */
    pinInit();                                                          /* 引脚初始化                   */
      
    IAP_Entry = (void(*)())IAP_ENTER_ADR;                               /* 初始化函数指针IAP_Entry      */

    zyIrqDisable();                                                     /* 在IAP操作前必须关闭所有中断  */
   
    parIdRead();                                                        /* 读器件ID                     */
    codeIdBoot();                                                       /* 读Boot版本号                 */
   
    sectorPrepare(1,1);                                                 /* 准备扇区1                    */
    sectorErase(1,1);                                                   /* 擦除扇区1                    */
    blankChk(1,1) ;                                                     /* 查空扇区1                    */
   
    sectorPrepare(1,1);                                                 /* 选择扇区1                    */
    ramCopy(0x00001000, 0x10002000, 512);                               /* 写数据到扇区1                */
        ucErr = dataCompare(0x00001000, 0x10002000, 512);                   /* 比较数据                     */
   
    zyIrqEnable();
   
    if (ucErr == CMD_SUCCESS) {                                         /* 成功,蜂鸣一声               */           
        BEEPON();
        for (i=0; i<0x3FFFFF; i++);
        BEEPOFF();
    } else {                                                            /* 失败,一直蜂鸣               */           
        BEEPON();
    }   
    while (1);
}

出0入0汤圆

发表于 2011-8-16 22:50:30 | 显示全部楼层
IAP_ENTER_ADR   这个是IAP的入口地址.出厂固定的,手册上有.

出0入0汤圆

发表于 2011-11-17 16:53:23 | 显示全部楼层
手册上的iap入口地址是错误的,源码中是对的

出0入0汤圆

发表于 2011-11-17 16:58:24 | 显示全部楼层
LPC的序列号只是器件型号吧,同型号一致。

出0入20汤圆

发表于 2011-11-18 08:31:25 | 显示全部楼层
没有独立的ID吧?

出0入0汤圆

发表于 2011-11-18 11:00:50 | 显示全部楼层
可以用IAP 58命令读

出0入0汤圆

发表于 2012-9-27 21:48:05 | 显示全部楼层
mark  !!!!

出0入0汤圆

发表于 2014-3-21 14:18:05 | 显示全部楼层
标记,很实用

出0入0汤圆

发表于 2014-4-16 09:07:23 | 显示全部楼层
  顶一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 16:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表