|
1、TI CC1310 sub1G的SDK开发之唯一识别号MAC地址读 & N+ l( ]% G% x7 v, I( a, j& Z: P
TM32微控制器有一个96位的产品唯一身份标识,在任何情况下都是唯一且不允许修改这个96位的产品唯一身份标识,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。
1 C+ l9 E$ W1 L: w7 w: E
想要读取唯一ID,就需要知道它的存储地址,在不同系列的MCU中地址是有差别的,我们查询了部分MCU的资料并将其总结如下:
8 h3 [ v- b C) B, G. n- //读取FlashSize
. ^) {( f- \9 E+ @* M - - H; K; d c$ k3 z1 f# F
- uint16_t cpuGetFlashSize(void)4 w( ^; L: z* m8 K0 {
- {+ y T9 Z" s8 j) B
- * O, f# J2 w6 J1 E% u K
- return (**(volatile u16*)(0x1FFF7A22));
& d: A! s# U5 ? - // return (*(volatile u32*)(0x1FFF7A20))>>16;* f, @# E# L, B% b' z! e/ W
- }
* t' U/ q2 V* F0 G3 y - % @- }( `) I9 A
- //读取ChipID
+ L5 J5 D' I9 X# G" ?# g( R q6 I ^ - 2 b6 b7 q! \0 M+ Q# {9 g2 s* y! T( L
- void cpuidGetId(void)
& v; S; x3 \$ Z4 W - {
6 l4 T6 [- `0 c- Y+ g - mcuID[0] = *(volatile u32*)(0x1FFF7A10);
6 R6 ~7 O5 T$ s. a: y a: E* `9 v" ` - mcuID[1] = *(volatile u32*)(0x1FFF7A14);9 _* Q& `# d( z6 ?/ n" p5 m
- mcuID[2] = *(volatile u32*)(0x1FFF7A18);
: E: V5 d' k9 r6 r - }1 [: G f: g' {8 G
-
( c% o/ X/ E/ g8 q1 K
1 ~4 `( R8 D* e+ J- b* P" `% u- Send_data3 = ((CpuID[0]) >> 24)|0x00;. {3 C- e0 U: T/ E7 @
- Uart1Write(&Send_data3, 1); z* r( L$ [) \$ m( r
- $ i+ u* v- I+ W A# G- p5 f- u; l7 b
- Send_data3 = (CpuID[0] >> 16)|0x00;) r/ T ]7 }+ r5 u6 O- q; a! {
- Uart1Write(&Send_data3, 1);% m8 {0 K1 F; |$ P
-
) o' K1 L D4 R( q6 o - Send_data3 = (CpuID[0] >> 8)|0x00;
* l6 H9 s+ t" N5 z; D4 a - Uart1Write(&Send_data3, 1);" U# E( T; g& A5 J: ^
-
, Q( [- i- V& ~) ^) I - Send_data3 = (CpuID[0] )|0x00;
9 h, p" b" |" V - Uart1Write(&Send_data3, 1);9 I% W8 K) X2 h8 G2 r6 I/ P/ l( n
- " X' s3 e3 s$ G: R. F
- Send_data3 = ((CpuID[1]) >> 24)|0x00;- `- P, B8 q, Q# }: W
- Uart1Write(&Send_data3, 1);- t2 `0 e3 j. r* k, }- e( H# C
-
5 X/ l% k" S- ]! T: j& @ - Send_data3 = (CpuID[1] >> 16)|0x00;
0 O& v& ^) Y B+ D6 r% k - Uart1Write(&Send_data3, 1);* q% L: \% y: p( ?0 }$ B
-
, j! N. N8 x7 L: d: b - Send_data3 = (CpuID[1] >> 8)|0x00;+ f' X- `+ a' b
- Uart1Write(&Send_data3, 1);2 i. d0 \) j9 n) _" u' E
-
- }; K* c) }' A' F$ U5 H$ a; g4 } - Send_data3 = (CpuID[1] )|0x00;6 x, A6 U2 G, R$ [. B
- Uart1Write(&Send_data3, 1);
0 e* E# t. \8 B' @1 C -
6 r- Y5 s7 y! X - Send_data3 = ((CpuID[2]) >> 24)|0x00;6 t+ J( ]0 c A6 Z& R! O- s
- Uart1Write(&Send_data3, 1);0 G7 s/ ?6 _5 a( Q; m; S' ? z& c; V
- ; L% N2 l4 a! W9 i
- Send_data3 = (CpuID[2] >> 16)|0x00;
* i, K8 M, h$ N& P) {+ L - Uart1Write(&Send_data3, 1);
5 G4 X' v* J, I9 q% a. S - & p& t, |4 l% \) e0 @, w
- Send_data3 = (CpuID[2] >> 8)|0x00; u2 @/ r; _. X8 L
- Uart1Write(&Send_data3, 1);. z K3 e+ c3 Q7 b8 n
-
2 u. x; N! I) `2 ] - Send_data3 = (CpuID[2] )|0x00;
' S3 q& G0 }, B( j3 @ a - Uart1Write(&Send_data3, 1);
复制代码' \8 C# d7 C U' [
通过串口发送到PC就可以看到了。 串口发送程序; printf("CPUID IS 0X%X %X %X.\r\n", mcuID[0], mcuID[1], mcuID[2] );
( _; @3 a, [, H g8 f1 L# Sprintf("Flash size is %d KB\r\n",cpuGetFlashSize());
# z& [; F" ~# @( B- B0 w4 }3 l也可以通过 STLink Utility 查看 * ]5 r4 K& v' |0 a$ q' h5 I
4 e# s2 m1 }2 Y! M' a# Y# V
利用STM32的ID编码结合来进行产品加密,产品唯一的身份标识非常适合:5 N3 r: k2 H! @' G% u, l
● 用来作为序列号(例如USB字符序列号或者其他的终端应用)
( w3 \* w, V" W5 U● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
e5 R# M) H/ o● 用来激活带安全机制的自举过程: E) n K% S7 V$ {
96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。+ ~- F& B6 C2 d/ I' j( T* ^
这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。
/ a8 i) h$ e3 A0 O4 r基地址:0x1FFF F7E8
% F8 q/ o$ ?" ^" g1 m/ s- S% A
2 m2 I) k! }' R" Q
每个CPU 出厂的时候都
% @* }# M7 o- D配置的一个ID,96 位的.这个唯一码可以利用作软件加密.......$ t: C/ F" n+ Y" R
' \: i/ A/ |2 I
- static u32 CpuID[3];
) j' J8 p, k; g! m1 i N+ R' p' i - static u32 Lock_Code;3 Z- {& Y1 [0 w! @- D1 `
( h* p+ @' {! k# c$ {" l2 H- void GetLockCode(void)
; l% W" }; h- Y/ O - {
1 J; ^3 O! g4 V. n - //获取CPU唯一ID
4 M9 F: I8 u, m/ j2 A, X - CpuID[0]=*(vu32*)(0x1ffff7e8);8 X3 x. e6 |+ a8 M9 q5 |
- CpuID[1]=*(vu32*)(0x1ffff7ec);8 \' M2 d5 v$ r: N( H2 X$ x
- CpuID[2]=*(vu32*)(0x1ffff7f0);9 w; D5 I. R1 H' b! @6 b. t
- //加密算法,很简单的加密算法% m9 @& _2 c7 J: z& v
- Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
, @! J; k: ^; N - }
复制代码
( f: j0 y5 t: u示例: STM32使用 CPUID加密算法,很简单的加密算法
% T4 I+ q+ ?; V2 n: a( W9 I- zLock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);+ ~9 b( x, G* z! X
CpuID[0] CpuID[1] CpuID[2] Lock_Code CpuID[0]>>1 CpuID[0]>>2 CpuID[0]>>30 D' D: v" X$ x9 p$ A
1号CPU 0668FF30 3037564E 43023216 17A29B6D 3347F98 C0DD593 8604642- u4 {: _% K; H3 q( ]
2号CPU 066AFF30 3037564E 43024449 17A39DB4 3357F98 C0DD593 86048893 F- z+ X- f, M# v h
3号CPU 066CFF30 3037564E 43021551 17A497D5 3367F98 C0DD593 86042AA3 _, A& {2 O1 Y* j3 y: t) u! I
4号CPU 066BFF30 3037564E 43024716 17A41E0D 335FF98 C0DD593 86048E2
5 q8 x5 o3 H M3 M6 v' ]6 j. ]: w& G5号CPU 066CFF30 3037564E 43023851 17A49C35 3367F98 C0DD593 860470A
% A: R Q2 R! V( `: O+ N6号CPU 066DFF37 3235564E 43152737 1826FA14 336FF9B C8D5593 862A4E6
- }6 R- J* z% H) W
+ ~+ N6 E2 J: U5 Y3 m0 p* p6 S————————————————
3 S) S, ]) X- ~7 G5 k; ^% C( i) P版权声明:jiangchao3392 1 M0 Z9 U7 J. w& \$ |
|