LPC17xx系列芯片的序列号怎么读取?
现在在使用LPC1763这款芯片,FLashMagic软件里可以读取到每个芯片的序列号,我在程序里怎么读取到呢,有人做到吗?谢谢告诉我方法。 找了一个上午,终于在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);
} IAP_ENTER_ADR 这个是IAP的入口地址.出厂固定的,手册上有. 手册上的iap入口地址是错误的,源码中是对的 LPC的序列号只是器件型号吧,同型号一致。 没有独立的ID吧? 可以用IAP 58命令读 mark!!!! 标记,很实用 顶一下
页:
[1]