stud1 发表于 2011-7-9 09:07:14

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

现在在使用LPC1763这款芯片,FLashMagic软件里可以读取到每个芯片的序列号,我在程序里怎么读取到呢,有人做到吗?谢谢告诉我方法。

stud1 发表于 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[]);

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

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

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

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

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

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

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

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

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

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

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

/*********************************************************************************************************
** 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);
}

flyaqiao 发表于 2011-8-16 22:50:30

IAP_ENTER_ADR   这个是IAP的入口地址.出厂固定的,手册上有.

xuchess 发表于 2011-11-17 16:53:23

手册上的iap入口地址是错误的,源码中是对的

aozima 发表于 2011-11-17 16:58:24

LPC的序列号只是器件型号吧,同型号一致。

mon51 发表于 2011-11-18 08:31:25

没有独立的ID吧?

pingpinggu 发表于 2011-11-18 11:00:50

可以用IAP 58命令读

fyyy4030 发表于 2012-9-27 21:48:05

mark!!!!

okeykat 发表于 2014-3-21 14:18:05

标记,很实用

huangxiaowei 发表于 2014-4-16 09:07:23

顶一下
页: [1]
查看完整版本: LPC17xx系列芯片的序列号怎么读取?