每一个STM32单片机出厂的时候都有全球唯一的ID,当在数据安全性比较高的地方,需要对每一个接入系统的芯片进行身份验证,那么这个芯片自身的ID号就可以作为它的身份信息。

产品唯一的身份标识非常适合:

  • 用来作为序列号(例如USB字符序列号或者其他的终端应用)
  • 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
  • 用来激活带安全机制的自举过程

  96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。

  这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以
半字(16位)或者全字(32位)读取。




  不仅可以读取到芯片的ID,还能读出芯片的存储器容量。

  芯片型号也同样可以读出来。


下面就通过代码来读取这几个数据。

//读取芯片ID
void GetChipID ( void )
{u32 CpuID[3];                          //小端模式CpuID[0] = * ( vu32 * ) ( 0x1ffff7e8 ); //高32位地址CpuID[1] = * ( vu32 * ) ( 0x1ffff7ec ); //中32位地址CpuID[2] = * ( vu32 * ) ( 0x1ffff7f0 ); //低32位地址printf ( "此芯片唯一ID为:0x%x-%x-%x \r\n", CpuID[0], CpuID[1], CpuID[2] );
}
//获取芯片Flash大小
void GetFlashSize ( void )
{u16 stm32_Flash_Size;stm32_Flash_Size = * ( u16 * ) ( 0x1FFFF7E0 ); //闪存容量寄存器printf ( "芯片闪存容量大小为:%x \r\n", stm32_Flash_Size );
}//读取芯片型号
void Main_Chip_Type(void)
{u32 type;type = *( unsigned  int * )( 0xE0042000 );   //MCU IDprintf ( "芯片型号为:0x%x \r\n", type );
}int main ( void )
{NVIC_PriorityGroupConfig ( NVIC_PriorityGroup_2 );uart_init ( 115200 );delay_init();       //延时函数初始化LED_Init();         //初始化与LED连接的硬件接口GetChipID();GetFlashSize();Main_Chip_Type();while(1);}

通过串口打印出芯片的ID

此芯片唯一ID为: 0x66eff51-51578248-87074312
芯片闪存容量大小为:   40
芯片型号为:  0x20036410

然后通过单步调试,直接观察内存中的数据。

然后观察内存中地址0x1FFFF7E0开始的数据

  可以看出0x1FFFF7E0开始的16位数据为0x0040换算为10进制数据就是64,说明当前用的芯片的容量是64K。接下来从0x1ffff7e8地址开始的12个字节,也就是96位存储的就是芯片的ID。内存中ID号存储为低位在前高位在后,而打印出来的数据是高位在前,低位在后。打印的前32位是 06 6e ff 51对应在内存中的存储顺序51应该是第一位,06是最后一位。

  最后在0xE0042000地址查看单片机的型号。

  低12位数据是 0x410,也就是设备编码为0x410,通过对比文档可以看出这个是中容量产品。高16位是0x2003,对比文档可以看出,这个是中容量产品,版本号为Y。

  由于这些ID号都存储在指定的内存地址中,而系统没有提供专用的读取这些ID号的函数,所以读取数据的时候,只能通过指针的方式去读取,首先将数据加一级指针转换为地址,然后加二级指针,表示读取当前地址中存储的内容。这种操作方法在库函数的头文件中使用的比较多。比如在stm32f10x.h中就可以看到对GPIOA的定义。

#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;

将地址值逐个替换后为 #define GPIOA ((GPIO_TypeDef *) 0x4001 0800),相当于在 0x4001 0800 地址处定义了GPIOA的结构体。查阅芯片资料可知,GPIOA的起始地址就是0x4001 0800。

这样操作GPIOA的的时候就和上面读取ID的方法是一样的,相当于直接读写对应地址中的值。

STM32F103单片机读取芯片自身ID相关推荐

  1. STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭

    大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术.一直到今年毕业.对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线.我对 ...

  2. Xilinx ISE系列教程(8):读取FPGA芯片唯一ID号

    文章目录 @[toc] 应用场景 方法1:通过JTAG读取 方法2:调用原语读取 DNA_PORT原语的使用 注意 本文是Xilinx ISE系列教程的第8篇文章. 用过单片机的朋友都知道,单片机芯片 ...

  3. STM32F103单片机软件模拟IIC并读取TMP112数字温度传感器

    本文利用STM32F103系列单片机读取TMP112数字温度传感器的温度信息,TMP112数字传感器采用IIC总线协议通信.STM32自身含有硬件IIC资源,分别是PB6-->SCL.PB7-- ...

  4. 单片机读取obd_OBD_CAN读取代码(stm32f103)

    [实例简介] 用STM32F103单片机做的汽车OBD诊断仪,可以读取整车CAN线上,汽车发动机转速,车速等信息,对CAN通信学习有一定帮助,本代码支持所有标准CAN车型. [实例截图] [核心代码] ...

  5. 三、单片机读取ID卡(EM4100的数据格式)

    目录 一.单片机读取ID卡(工作原理及电路) 二.单片机读取ID卡(产生载波) 三.单片机读取ID卡(EM41000的数据格式) 四.单片机读取ID卡(硬件调试及读码) (一)EM4100的数据格式 ...

  6. STM32F103单片机驱动TM1637数码管显示模块

    最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考. 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637 ...

  7. 只要单片机具有真正唯一ID,就可以让加密坚不可摧

    本帖最后由 smset 于 2013-2-4 16:24 编辑 http://www.amobbs.com/thread-5518980-1-1.html 第一环: ID-->F1(ID) -- ...

  8. 只要单片机具有真正唯一ID,就可以让加密坚不可摧(转)

    源:只要单片机具有真正唯一ID,就可以让加密坚不可摧 http://www.amobbs.com/thread-5518980-1-1.html 第一环: ID-->F1(ID) -----&g ...

  9. 单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)

    CAN总线和RS-485总线作为常用的工业通信总线,在许多工业领域中得到广泛使用.但随着工业应用的不断扩展和网络化的需求增加,它们面临着一些局限性.例如CAN总线虽然具有较高的通信速率和可靠性,但存在 ...

最新文章

  1. Python字符串必须知道的7个函数
  2. ubuntu优化服务器网络连接数,ubuntu下解决高并发socket最大连接数限制,tcp默认1024个连接...
  3. OpenWrt 之 MT7628 使用GPIO中断
  4. 在内存中动态生成缩略图
  5. 学习TeXworks编辑器(二)TAB补全详解与自定义补全命令总结
  6. php的数据结构_php数据结构有哪些
  7. 理光m2554进入维修_理光DX2432C,基士得耶6201供墨检测代码,看完马上解决代码故障...
  8. java jackson_Jackson 框架的高阶应用
  9. 多个文件进行合并取前10个数(多线程方式)
  10. Ae:Keylight(1.2)(中英对照)
  11. Android当前任务管理器不显示应用进程
  12. 经纬财富:乐山稳健投资之道,积小胜为大胜
  13. 百度网盘mac损害计算机,Mac 电脑百度网盘一直闪退怎么办?解决办法
  14. 《如果梵高生在中国》笔记
  15. ida的一些工具下载
  16. 计算机lg符号,网上总出现LG的符号,是什么意思
  17. 田园风光别样滋味——郧西县河夹镇龙窝村首届山野葡萄采摘节
  18. [宣誓贴] 九日集训 (第四轮)
  19. 2020湖湘杯-CRYPTO-LFSRXOR
  20. android分屏资源适配,Android N 分屏适配

热门文章

  1. Java学习笔记(13)——Java注释
  2. 11.2.3 退出Vim编辑器
  3. 整理的几个常用的数据库维护的脚本
  4. 微软Windows Server 2008认证体系详细介绍
  5. laravel框架之自帶登錄註冊
  6. 叠加多个装饰器——day13
  7. springMVC 返回json乱码问题
  8. 用 as with ,和 ROW_NUMBER() 做分页查询
  9. [转]webkit webApp 开发技术要点总结
  10. 夜间排障某省某电信公司后台数据库故障