1、关于电子签名
数字签名主要用来存放芯片唯一身份标识(UID)、产品型号、FLASH 容量、SRAM 容量、芯片封装引脚数等信息,
可以通过 SWD 或者 CPU 读取。数字签名相关信息在出厂时编程,用户固件或外部设备可通过读取数字签名来对
芯片的合法性进行验证。
2、UID
可以看出存储地址为0x0001 2660 - 0x0001 2669,共80bit,10个字节。
3、产品型号寄存器
可以看出存储地址为 0x0001 2610 - 0x0001 2625,共 22 字节。
4、FLASH 容量寄存器
可以看出存储地址为0x0001 2628 - 0x0001 262B,共 4 字节。
5、SRAM 容量寄存器
可以看出存储地址为0x0001 262C - 0x0001 262F,共 4 字节。
6、引脚数量寄存器
可以看出存储地址为0x0001 2626 - 0x0001 2627,共 2 字节。
7、程序读取
#define UID 0x00012660
#define PRODUCT_TYPE 0x00012610
#define FLASH_SIZE 0x00012628
#define RAM_SIZE 0x0001262C
#define PIN_NUM 0x00012626
struct McuInfo_t
{
uint8_t UniqueId[10];
uint8_t ProductType[22];
uint8_t FlashSize[4];
uint8_t RamSize[4];
uint8_t PinNum[2];
}McuInfo;
void GetMcuInfo(void)
{
printf("\r\nUnique Id:[");
for(uint8_t i=0;i<sizeof(McuInfo.UniqueId)/sizeof(McuInfo.UniqueId[0]);i++)
{
McuInfo.UniqueId[i]=*(uint8_t*)(UID+i);
printf(" %02x",McuInfo.UniqueId[i]);
}
printf("]\r\n\r\n");
printf("Product Type:[");
for(uint8_t i=0;i<sizeof(McuInfo.ProductType)/sizeof(McuInfo.ProductType[0]);i++)
{
McuInfo.ProductType[i]=*(uint8_t*)(PRODUCT_TYPE+i);
printf(" %02x",McuInfo.ProductType[i]);
}
printf("]\r\n\r\n");
printf("Flash Size:[");
for(uint8_t i=0;i<sizeof(McuInfo.FlashSize)/sizeof(McuInfo.FlashSize[0]);i++)
{
McuInfo.FlashSize[i]=*(uint8_t*)(FLASH_SIZE+i);
printf(" %02x",McuInfo.FlashSize[i]);
}
printf("]\r\n\r\n");
printf("Ram Size:[");
for(uint8_t i=0;i<sizeof(McuInfo.RamSize)/sizeof(McuInfo.RamSize[0]);i++)
{
McuInfo.RamSize[i]=*(uint8_t*)(RAM_SIZE+i);
printf(" %02x",McuInfo.RamSize[i]);
}
printf("]\r\n\r\n");
printf("Pin Num:[");
for(uint8_t i=0;i<sizeof(McuInfo.PinNum)/sizeof(McuInfo.PinNum[0]);i++)
{
McuInfo.PinNum[i]=*(uint8_t*)(PIN_NUM+i);
printf(" %02x",McuInfo.PinNum[i]);
}
printf("]\r\n\r\n");
}
8、串口打印
可以看出UID获取到的全是FF,这明显是不对的。
9、JLINK在线读取
在线读取UID:
可以看出全是FF;
读取其他参数:
可以看出,是正确的。
所以,到底是手册写错了,还是芯片本身就没有UID???
|