×
单片机 > 单片机程序设计 > 详情

STM32 之 Unique_Device_ID

发布时间:2020-06-03 发布时间:
|
芯片的独有ID号,可以用来对芯片进行加密。

包含函数:

(1)Main

 
C语言: Codee#14694
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 实验平台 : ST 官方三合一套件 
+ 硬件     : STM32F103C8T6
+ 开发平台 : IAR For ARM 5.40
+ 仿真器   : J-Link
+ 日期     : 2010-10-28
+ 频率     :HSE = 8MHz ,主频 = 72MHz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include "includes.h"
/*******************************************************************************
                             == 变量声明 == 
*******************************************************************************/


/*******************************************************************************
                             == Main 函数 == 
*******************************************************************************/
void main(void)

RCC_Configuration();    //配置系统时钟 
NVIC_Configuration();   //配置 NVIC 和 Vector Table 
SysTick_Config();       //配置SysTick的精确延时

GPIO_Configuration(); 
UART1_Configuration();

LED1_HIGH ; LED2_HIGH ; LED3_HIGH ; LED4_HIGH ; // 初始化让灯全灭

//=== 通过串口发送芯片ID号 ======================================

Uart1_PutString(" The Unique Device ID is : ",27); 
Show_Unique_Device_ID();

while (1);
}

()Unique_Device_ID.c

 
C语言: Codee#14695
#include "includes.h"

void Show_Unique_Device_ID(void)
{
    u32 Dev_Serial0, Dev_Serial1, Dev_Serial2;
    Dev_Serial0 = *(vu32*)(0x1FFFF7E8);
    Dev_Serial1 = *(vu32*)(0x1FFFF7EC);
    Dev_Serial2 = *(vu32*)(0x1FFFF7F0);
   
   // 至此 已经从内存获取了Unique_Device_ID 用3个32位的变量 

    u8 HEX[6] ={'A','B','C','D','E','F'};
    u8 Unique_Device_ID[25];
    Unique_Device_ID[24] = '\0';
    u8 HexTmp, H_HexTmp,L_HexTmp;
   
    for(u8 i=0;i<24;)
    {
      if( 0==i ) HexTmp = (u8)Dev_Serial0; //获取第一个字节
      else if( 2==i ) HexTmp = (u8)( Dev_Serial0 >> 8 ); //获取第二个字节
      else if( 4==i ) HexTmp = (u8)( Dev_Serial0 >> 16 ); //获取第三个字节
      else if( 6==i ) HexTmp = (u8)( Dev_Serial0 >> 24 ); //获取第四个字节
      else if( 8==i ) HexTmp = (u8)Dev_Serial1; //获取第五个字节
      else if( 10==i ) HexTmp = (u8)( Dev_Serial1 >> 8 ); //获取第六个字节
      else if( 12==i ) HexTmp = (u8)( Dev_Serial1 >> 16 ); //获取第七个字节
      else if( 14==i ) HexTmp = (u8)( Dev_Serial1 >> 24 ); //获取第八个字节
      else if( 16==i ) HexTmp = (u8)Dev_Serial2; //获取第九个字节
      else if( 18==i ) HexTmp = (u8)( Dev_Serial2 >> 8 ); //获取第十个字节
      else if( 20==i ) HexTmp = (u8)( Dev_Serial2 >> 16 ); //获取第十一个字节
      else if( 22==i ) HexTmp = (u8)( Dev_Serial2 >> 24 ); //获取第十二个字节
      
      H_HexTmp = HexTmp >> 4; //获取高四位
      L_HexTmp = HexTmp & 0x0F; //获取低四位
   
      // 如果某四位的值大于9 就使用查表的方式 把ABCDEF写进来 呵呵

      if( L_HexTmp > 9 )
        Unique_Device_ID[i+1] = HEX[ L_HexTmp - 10 ];
      else
        Unique_Device_ID[i+1] = L_HexTmp + '0';
      if( H_HexTmp > 9 )
        Unique_Device_ID[i+0] = HEX[ H_HexTmp - 10 ]; //说明一下 貌似论坛过滤了【i】这个符号 所以 我在代码里面+0了 呵呵
      else
        Unique_Device_ID[i+0] = H_HexTmp + '0';
      i += 2;
    } 
   
   // 通过串口发送出去 
   Uart1_PutString( Unique_Device_ID , strlen((char*)Unique_Device_ID));
   Uart1_PutString( "\r\n" , strlen("\r\n"));
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会