如何獲取STM32的設備唯一ID


轉載請注明出處。

STM32的全系列MCU中均有一個96位的唯一設備標識符。在ST的相關資料中,對其功能的描述有3各方面:

  • 用作序列號(例如 USB 字符串序列號或其它終端應用程序)
  • 在對內部 Flash 進行編程前將唯一 ID 與軟件加密原語和協議結合使用時用作安全密鑰以提高 Flash 中代碼的安全性
  • 激活安全自舉過程等

在資料中對其特性的描述是:96 位的唯一設備標識符提供了一個對於任何設備和任何上下文都唯一的參考號碼。用戶永遠不能改變這些位。96 位的唯一設備標識符也可以以單字節/半字/字等不同方式讀取,然后使用自定義算法連接起來。

想要讀取唯一ID,就需要知道它的存儲地址,在不同系列的MCU中地址是有差別的,我們查詢MCU的資料並總結如下:

測試DEMO如下:

/*******獲取產品唯一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]);
    
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM