[文档下载] 新唐M05XBN全球96位唯一ID码读取方法

[复制链接]
2616|9
 楼主| 断桥残雪_98 发表于 2015-8-27 22:28 | 显示全部楼层 |阅读模式
:loveliness:最近我搞软件加密时用到全球唯一ID码时,发现不知道从何读取,可是发现我的烧录器上可以读出来,我想想这个芯片肯定有ID码,于是开始查资料,找来找去,没有发现有明确的读取方法,经过几天的资料查询,终于找到了,这是个好东西,现在来分享给大家,希望对学这个的大侠们有所帮助,

RED_UID.rar

213.02 KB, 下载次数: 213

捉虫天师 发表于 2015-8-28 07:43 | 显示全部楼层
  1. #include "SmartM_M0.h"


  2. #define PAGE_SIZE               512


  3. #define FLASH_START_ADDRESS          0x00000000
  4. #define FLASH_SIZE              0x00010000

  5. /****************************************
  6. *函数名称:ISPTriger
  7. *输    入:无
  8. *输    出:无
  9. *功    能:ISP执行
  10. ******************************************/
  11. VOID ISPTriger(VOID)
  12. {
  13.     ISPTRG |= ISPGO;
  14.     while((ISPTRG&ISPGO) == ISPGO);
  15. }
  16. /****************************************
  17. *函数名称:ISPEnable
  18. *输    入:无
  19. *输    出:无
  20. *功    能:ISP使能
  21. ******************************************/
  22. VOID ISPEnable(VOID)
  23. {
  24.     ISPCON |= ISPEN|CFGUEN|LDUEN;
  25. }
  26. /****************************************
  27. *函数名称:ISPDisable
  28. *输    入:无
  29. *输    出:无
  30. *功    能:ISP禁用
  31. ******************************************/
  32. VOID ISPDisable(VOID)
  33. {
  34.     ISPCON &= ~(ISPEN|CFGUEN|LDUEN);
  35. }
  36. /****************************************
  37. *函数名称:FMC_Erase
  38. *输    入:unPage 页地址
  39. *输    出:无
  40. *功    能:数据区擦除
  41. ******************************************/
  42. VOID FMC_Erase(UINT32 unAddr)
  43. {
  44.     PROTECT_REG(
  45.        
  46.     ISPEnable();
  47.     ISPCMD = PAGE_ERASE;

  48.     ISPADR = unAddr;
  49.     ISPTriger();

  50.     ISPDisable();     

  51.     )       
  52. }
  53. /****************************************
  54. *函数名称:FMC_Write
  55. *输    入:pucBuf 写数据缓冲区
  56.                       unSize 写数据大小
  57. *输    出:无
  58. *功    能:数据区写
  59. ******************************************/
  60. VOID FMC_Write(UINT32 unAddr,UINT8 *pucBuf,UINT32 unSize)
  61. {
  62.     UINT32 i;   
  63.     PROTECT_REG(
  64.     ISPEnable();
  65.     ISPCMD = PROGRAM;

  66.                 for(i=0; i<unSize; i+=4)
  67.                 {
  68.                                 ISPADR = (i+unAddr);
  69.                                 ISPDAT = *(UINT32 *)(&pucBuf[i]);
  70.                                 ISPTriger();
  71.                                
  72.                 }

  73.     ISPDisable();   

  74.     )               
  75. }
  76. /****************************************
  77. *函数名称:FMC_Read
  78. *输    入:pucBuf 读数据缓冲区
  79.                   unSize 读数据大小
  80. *输    出:无
  81. *功    能:数据区读
  82. ******************************************/
  83. VOID FMC_Read(UINT32 unAddr,UINT8 *pucBuf,UINT32 unSize)
  84. {
  85.     UINT32 i;
  86.     PROTECT_REG(
  87.     ISPEnable();

  88.     ISPCMD = READ;

  89.     for(i=0; i<unSize; i+=4)
  90.     {
  91.             ISPADR = (i+unAddr);
  92.       ISPTriger();
  93.                 *(UINT32 *)(&pucBuf[i])=ISPDAT;
  94.     }
  95.    
  96.     ISPDisable();   

  97.     )
  98. }

  99. UINT32 Read_UID(UINT32 unAddr)
  100. {
  101.     UINT32 UIDX;
  102.     PROTECT_REG(
  103.     ISPEnable();

  104.     ISPCMD = READ_UID;

  105.             ISPADR =unAddr;
  106.       ISPTriger();
  107.                 *(UINT32 *)(&UIDX)=ISPDAT;
  108.    
  109.     ISPDisable();   

  110.     )
  111.         return  UIDX;
  112. }



  113. /****************************************
  114. *函数名称:main
  115. *输    入:无
  116. *输    出:无
  117. *功    能:函数主体
  118. ******************************************/
  119. INT32 main(VOID)
  120. {
  121.           /*1.MCU频率初始化,频率为50MHz*/
  122.           McuInit(MCU_FREQUENCY);
  123.           /*2.串口初始化,波特率为115200bps*/
  124.                 UartInit(115200);
  125.           Delayms(1000);
  126.           while(1)
  127.                 {                       
  128.     printf("\r\nCPU ID = %X\r\n",Read_UID(0X00));//全球唯一ID码64-96位
  129.     printf("\r\nCPU ID = %X\r\n",Read_UID(0X04));//全球唯一ID码32-64位
  130.     printf("\r\nCPU ID = %X\r\n",Read_UID(0X08));//全球唯一ID码0-32位
  131.                                  Delayms(1000);                       
  132.                                
  133.                 }
  134. }


捉虫天师 发表于 2015-8-28 07:45 | 显示全部楼层
代码结构性很强,短小精悍,可以弄个头文件,到时候用了,直接调用这个函数就行了,可以用于芯片加密。
mana1199 发表于 2015-10-23 17:30 | 显示全部楼层
天灵灵地灵灵 发表于 2015-10-23 22:14 | 显示全部楼层
  • UINT32 Read_UID(UINT32 unAddr)
  • {
  •     UINT32 UIDX;
  •     PROTECT_REG(
  •     ISPEnable();
  •     ISPCMD = READ_UID;
  •             ISPADR =unAddr;
  •       ISPTriger();
  •                 *(UINT32 *)(&UIDX)=ISPDAT;
  •     ISPDisable();
  •     )
  •         return  UIDX;
  • }
  • 就这一个函数啊,怎么前面那几个是干啥的,,血多了?

wahahaheihei 发表于 2015-10-24 13:57 | 显示全部楼层
FMC这个函数相关的都是什么东西啊,没有看到在程序里使用锕
huangcunxiake 发表于 2015-10-25 14:51 | 显示全部楼层
    printf("\r\nCPU ID = %X\r\n",Read_UID(0X00));//全球唯一ID码64-96位
    printf("\r\nCPU ID = %X\r\n",Read_UID(0X04));//全球唯一ID码32-64位
    printf("\r\nCPU ID = %X\r\n",Read_UID(0X08));//全球唯一ID码0-32位
----------------------
怎么先读高位啊。这排列顺序是如何的。
643757107 发表于 2015-10-25 14:53 | 显示全部楼层
应该是高位在前的排列方法,楼上的。
 楼主| 断桥残雪_98 发表于 2015-10-29 12:13 | 显示全部楼层
wahahaheihei 发表于 2015-10-24 13:57
FMC这个函数相关的都是什么东西啊,没有看到在程序里使用锕

那些是官方的库里的,只要调用就好了
 楼主| 断桥残雪_98 发表于 2015-10-29 12:15 | 显示全部楼层
天灵灵地灵灵 发表于 2015-10-23 22:14
  • UINT32 Read_UID(UINT32 unAddr)
  • {
  •     UINT32 UIDX;

  • 这些是要相互调用的
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    5

    主题

    39

    帖子

    0

    粉丝
    快速回复 在线客服 返回列表 返回顶部