轉載請註明出處。算法
STM32的全系列MCU中均有一個96位的惟一設備標識符。在ST的相關資料中,對其功能的描述有3各方面:編程
在資料中對其特性的描述是:96 位的惟一設備標識符提供了一個對於任何設備和任何上下文都惟一的參考號碼。用戶永遠不能改變這些位。96 位的惟一設備標識符也能夠以單字節/半字/字等不一樣方式讀取,而後使用自定義算法鏈接起來。安全
想要讀取惟一ID,就須要知道它的存儲地址,在不一樣系列的MCU中地址是有差異的,咱們查詢MCU的資料並總結以下:測試
測試DEMO以下:ui
/*******獲取產品惟一ID*********/ #ifdef __STM32F00x_H #define ID_ADDR1 0x1FFFF7AC /*STM32F0惟一ID起始地址*/ #endif #ifdef __STM32F10x_H #define ID_ADDR1 0x1FFFF7E8 /*STM32F1惟一ID起始地址*/ #endif #ifdef __STM32F2xx_H #define ID_ADDR1 0x1FFF7A10 /*STM32F2惟一ID起始地址*/ #endif #ifdef __STM32F3xx_H #define ID_ADDR1 0x1FFFF7AC /*STM32F3惟一ID起始地址*/ #endif #ifdef __STM32F4xx_H #define ID_ADDR1 0x1FFF7A10 /*STM32F4惟一ID起始地址*/ #endif #ifdef __STM32F7xx_H #define ID_ADDR1 0x1FF0F420 /*STM32F7惟一ID起始地址*/ #endif #ifdef __STM32L0XX_H #define ID_ADDR1 0x1FF80050 /*STM32L0惟一ID起始地址*/ #endif #ifdef __STM32L1XX_H #define ID_ADDR1 0x1FF80050 /*STM32L1惟一ID起始地址*/ #endif #ifdef __STM32L4xx_H #define ID_ADDR1 0x1FFF7590 /*STM32L4惟一ID起始地址*/ #endif #ifdef __STM32H7xx_H #define ID_ADDR1 0x1FF0F420 /*STM32H7惟一ID起始地址*/ #endif char ID[40]; /*-----------------------------獲取設備ID-------------------------------------*/ void GET_ID(void) { uint8_t temp[12]; uint32_t temp0,temp1,temp2; temp0=*(__IO uint32_t*)(ID_ADDR1); //產品惟一身份標識寄存器(96位) temp1=*(__IO uint32_t*)(ID_ADDR1+4); temp2=*(__IO uint32_t*)(ID_ADDR1+8); temp[0] = (uint8_t)(temp0 & 0x000000FF); temp[1] = (uint8_t)((temp0 & 0x0000FF00)>>8); temp[2] = (uint8_t)((temp0 & 0x00FF0000)>>16); temp[3] = (uint8_t)((temp0 & 0xFF000000)>>24); temp[4] = (uint8_t)(temp1 & 0x000000FF); temp[5] = (uint8_t)((temp1 & 0x0000FF00)>>8); temp[6] = (uint8_t)((temp1 & 0x00FF0000)>>16); temp[7] = (uint8_t)((temp1 & 0xFF000000)>>24); temp[8] = (uint8_t)(temp2 & 0x000000FF); temp[9] = (uint8_t)((temp2 & 0x0000FF00)>>8); temp[10] = (uint8_t)((temp2 & 0x00FF0000)>>16); temp[11] = (uint8_t)((temp2 & 0xFF000000)>>24); memset(ID,0,40); sprintf(ID,"%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X",temp[0],temp[1],temp[2],temp[3],temp[4],temp[5],temp[6],temp[7],temp[8],temp[9],temp[10],temp [11]); }