MCU 系列产品内置两个不同长度的唯一设备序列号,分别为 96 位的 UID(Unique device ID)和 128 位的UCID(Unique Customer ID),这两个设备序列号存放在闪存存储器的系统配置块中,它们所包含的信息在出厂时编写,并保证对任意一个 MCU 微控制器在任何情况下都是唯一的,用户应用程序或外部设备可以通过CPU 或 JTAG/SWD 接口读取,不可被修改。
UID 为 96 位,通常用来做为序列号或作为密码,在编写闪存时,将此唯一标识与软件加解密算法相结合,进一步提高代码在闪存存储器内的安全性,也可用于激活带安全功能的自举程序(Secure Bootloader)。
UCID 为 128 位,具体根据芯片厂商序列号定义,它包含芯片生产及版本相关信息。
void GetUID(uint8_t *UIDbuf)
{
uint8_t num = 0;
uint32_t* uid_addr = (void*)0;
uint32_t temp = 0;
if (0xFFFFFFFF == *(uint32_t*)(0x1FFFF270))
{
uid_addr = (uint32_t*)UID_BASE;
}
else
{
uid_addr = (uint32_t*)(0x1FFFF270);
}
for (num = 0; num < UID_LENGTH;)
{
temp = *(__IO uint32_t*)(uid_addr++);
UIDbuf[num++] = (temp & 0xFF);
UIDbuf[num++] = (temp & 0xFF00) >> 8;
UIDbuf[num++] = (temp & 0xFF0000) >> 16;
UIDbuf[num++] = (temp & 0xFF000000) >> 24;
}
}
void GetUCID(uint8_t *UCIDbuf)
{
uint8_t num = 0;
uint32_t* ucid_addr = (void*)0;
uint32_t temp = 0;
if (0xFFFFFFFF == *(uint32_t*)(0x1FFFF260))
{
ucid_addr = (uint32_t*)UCID_BASE;
}
else
{
ucid_addr = (uint32_t*)(0x1FFFF260);
}
for (num = 0; num < UCID_LENGTH;)
{
temp = *(__IO uint32_t*)(ucid_addr++);
UCIDbuf[num++] = (temp & 0xFF);
UCIDbuf[num++] = (temp & 0xFF00) >> 8;
UCIDbuf[num++] = (temp & 0xFF0000) >> 16;
UCIDbuf[num++] = (temp & 0xFF000000) >> 24;
}
}
产品在量产出售时都会贴一个产品识别码用于标注出货和售后,具体结构可参考如下:
在实际软件开发中,有一些数据你希望保存在mcu中,不被轻易擦除更改,可能你第一想到的是内部Flash,但当系统重新烧录时flash里面的数据会被覆盖或者擦除,这是你不愿看到的,所以这里我给大家介绍一个寄存器来存储少量数据,不易丢失。
BKP 寄存器是 16 位的可寻址寄存器。备份存储器位于备份域里,电源 VDD 关闭后由 VBAT 供电维持。BKP 共有 42 个 16 位的寄存器,可用来存储并保护用户应用数据。这 84 个字节不受系统待机模式唤醒或系统复位的影响。
此外,BKP 控制寄存器具有入侵检测功能。当系统发生复位,为保护备份域防止意外操作,所有的写操作都被禁止。如需使能,首先设置寄存器RCC_APB1PCLKEN.PWREN 和 RCC_APB1PCLKEN.BKPEN 位打开电源和后备接口时钟,然后设置PWR_CTRL.DBKP 位使能对备份寄存器的写操作。
功能描述:掉电备份、入侵检测
入侵检测事件会清除所有备份数据寄存器内容。配置 BKP_CTRL.TP_EN 位可使能TAMPER 管脚的检测功能。需要注意的是,入侵检测信号是电平检测信号与BKP_CTRL.TP_EN 位的逻辑与,因此入侵检测应该在TAMPER 管脚使能前配置。当检测到入侵事件时,BKP_CTRLSTS .TEF 位被置‘1’。如果入侵检测中断使能(BKP_CTRLSTS.TPINT_EN位置’1’),会产生一个中断。为避免软件在入侵检测管脚上仍然有入侵事件时对备份数据寄存器进行写操作,当清除入侵事件后,应关闭入侵检测引脚TAMPER 的检测功能。备份数据寄存器操作结束后再对 BKP_CTRL.TP_EN 位置‘1’。BKP_CTRL.TP_ALEV位用于设定入侵检测事件的有效电平。当BKP_CTRL.TP_ALEV=0或1,如果TAMPER引脚在使能之前已经为高或低,尽管 TAMPER 引脚上没有上升或下降沿信号,仍会发生一个额外的入侵事件。因此,TAMPER 引脚应该在片外连接到正确的电平。
因篇幅问题不能全部显示,请点此查看更多更全内容