永发信息网

请教怎么用st-link API或者dll读出stm32或者8的唯一ID

答案:2  悬赏:20  手机版
解决时间 2021-01-31 15:08
  • 提问者网友:沉默菋噵
  • 2021-01-30 17:53
请教怎么用st-link API或者dll读出stm32或者8的唯一ID
最佳答案
  • 五星知识达人网友:天凉才是好个秋
  • 2021-01-30 18:18
STM32 设备电子签名
电子签名存储在 Flash 区。可以使用 JTAG/SWD 或 CPU 对其进行读取。它包含出厂前编程   
的标识数据,这些标识数据允许用户固件或其它外部设备将其接口与 STM32F4xx 微控制器  
的特性自动匹配。
唯一设备 ID 寄存器(96 位)
唯一设备标识符最适合:
● 用作序列号(例如 USB 字符串序列号或其它终端应用程序)
● 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以    
提高 Flash 中代码的安全性
● 激活安全自举过程等
96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远 
不能改变这些位。
96 位的唯一设备标识符也可以以单字节/半字/字等不同方式读取,然后使用自定义算法连接 
起来。
以下程序可以直接读取设备ID,但是根据你STM32芯片型号不同可能地址(0x1FFF7A10)会不同,需要查看手册最后的“设备电子签名”章节
nsigned int mcuID[] ={0,0,0};

void cpuidGetId(void)
{
    mcuID[0] = *(__IO u32*)(0x1FFF7A10);
    mcuID[1] = *(__IO u32*)(0x1FFF7A14);
    mcuID[2] = *(__IO u32*)(0x1FFF7A18);
}
全部回答
  • 1楼网友:拜訪者
  • 2021-01-30 19:53
不知道还有没有人需要这个。在haplswim.dll里有个未公开的api:hreadbyte,可以读取任意地址的值。给出代码吧(以stm8l101为例):typedef int (*hbeforeread)(void);typedef int (*hreadbyte)(int,int,int,byte*);hbeforeread phbeforeread;hreadbyte phreadbyte;hinstance dll = loadlibrary("c:\\program files\\stmicroelectronics\\st_toolset\\stvp\\haplswim.dll");phbeforeread = (hbeforeread)getprocaddress(dll, "hbeforeread");phreadbyte = (hreadbyte)getprocaddress(dll, "hreadbyte");byte uid ;if((*phbeforeread)() == true){ for(int i=0;i<12;i++){ (*phreadbyte)(4, 0x4925+i, 1, uid+i); }}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯