1、TI CC1310 sub1G的SDK开发之唯一识别号MAC地址读 $ j" f& a: f$ d9 i
TM32微控制器有一个96位的产品唯一身份标识,在任何情况下都是唯一且不允许修改这个96位的产品唯一身份标识,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。
& ~! ?; L9 W' J' }
想要读取唯一ID,就需要知道它的存储地址,在不同系列的MCU中地址是有差别的,我们查询了部分MCU的资料并将其总结如下: # E, ~ w$ t* m' H
- //读取FlashSize: R) a) q3 _8 w3 d9 J$ e j
- - ]5 A2 j$ ]5 Y4 G% Z* ?, G
- uint16_t cpuGetFlashSize(void)
, U; N. b- Y( ?) C# B2 _) n5 ` - {! t. a; U" _% y0 ?: k) S
-
+ y. p- h y( e8 m" n - return (**(volatile u16*)(0x1FFF7A22));
) Y7 }% h, p9 W7 h- w8 A - // return (*(volatile u32*)(0x1FFF7A20))>>16;' ]+ Y% i9 o5 y; N& c# s7 `3 G
- }
! V8 a3 e8 H, ?; E -
& L% x3 O" l: {& l* ]' T - //读取ChipID* \# o' {( R! I
- ! w& Z2 e: ~& ]0 z4 \: \
- void cpuidGetId(void). v7 k4 `% y: Y; W5 T$ p( S. k
- {+ ^9 h2 f. F/ I
- mcuID[0] = *(volatile u32*)(0x1FFF7A10);* E! x: T5 r9 ] ~2 H" L4 ?7 J
- mcuID[1] = *(volatile u32*)(0x1FFF7A14);
8 n0 ?; q- |, Y4 P% e, t9 p" Q4 p - mcuID[2] = *(volatile u32*)(0x1FFF7A18);
3 B% C$ o3 G! P; c/ k! g - }; h2 W' Y! x- V- U/ k7 U9 w! G
- + ^1 s+ S9 \2 ^3 m! I/ W
- $ m. Y* n+ d- ]& O; V
- Send_data3 = ((CpuID[0]) >> 24)|0x00;& G0 v, f. z% B( P% V- O3 c
- Uart1Write(&Send_data3, 1);
8 O9 N# p! Y: g9 z4 v! ~# i - # w4 k( C: r4 [# |
- Send_data3 = (CpuID[0] >> 16)|0x00;1 w1 j( x( f" U6 t0 B) o1 \5 Z
- Uart1Write(&Send_data3, 1);; H: W1 x0 d% R0 B; a# _1 O
- + x4 ^* i# h' u) ~) o
- Send_data3 = (CpuID[0] >> 8)|0x00;" \9 m" s" h: W5 `% ~& C+ I
- Uart1Write(&Send_data3, 1);% h& d) F9 L# m K4 \, Z2 h. a
- " M) x, p& Y9 i9 ]* z2 T+ ~
- Send_data3 = (CpuID[0] )|0x00;
v' u e$ |' f$ G! t - Uart1Write(&Send_data3, 1);' I5 K& V6 Q5 n$ ]5 R" E
-
* B1 U( B( ], _1 T4 y - Send_data3 = ((CpuID[1]) >> 24)|0x00;
| b0 L# d% V - Uart1Write(&Send_data3, 1);8 u+ z# F) n3 f3 F' S
-
" s, H4 O/ U0 x# S6 Q: b# I - Send_data3 = (CpuID[1] >> 16)|0x00;6 ?0 O4 F: ?. V6 ^7 I1 e
- Uart1Write(&Send_data3, 1);& X3 ^+ s3 w* w% T$ M- V0 `, a* ]
- : H) p+ Q7 T. Z v1 E! g7 } C
- Send_data3 = (CpuID[1] >> 8)|0x00;
2 z# x8 h% R+ r4 W6 G \9 z" k+ o8 f* r - Uart1Write(&Send_data3, 1);
9 E) f' p" {) `" p Y! z - 5 q- i7 B& k7 c0 {! V3 ]7 ^
- Send_data3 = (CpuID[1] )|0x00;
n7 t+ O% o# H - Uart1Write(&Send_data3, 1);
- |) r: o; S* i7 \9 W - ; \' h1 M9 k4 K* i
- Send_data3 = ((CpuID[2]) >> 24)|0x00;
7 r8 J0 P3 k( T5 q& X% N* u* M - Uart1Write(&Send_data3, 1);4 f" x6 ]( q8 N
- / q2 p) | X+ s" X% y1 ]1 d' Q
- Send_data3 = (CpuID[2] >> 16)|0x00;9 G( q) z2 P7 ^4 O( Y/ R0 J- s, O
- Uart1Write(&Send_data3, 1);
I: w3 S: G& |7 @. a8 W - 0 T( A2 ?. A _0 ]6 R+ o
- Send_data3 = (CpuID[2] >> 8)|0x00;
. v* h8 J: H' P7 y0 G - Uart1Write(&Send_data3, 1);
3 }7 O$ i9 q: Y2 Z: q -
# R) t: Q3 W; Q* H4 L - Send_data3 = (CpuID[2] )|0x00;
7 y' k: w! K1 y* q, }- i5 W - Uart1Write(&Send_data3, 1);
复制代码- U5 `6 n: A- @( A+ s' R* @
通过串口发送到PC就可以看到了。 串口发送程序; printf("CPUID IS 0X%X %X %X.\r\n", mcuID[0], mcuID[1], mcuID[2] ); 7 ]! ^2 e3 N1 E9 |" E6 @7 ^
printf("Flash size is %d KB\r\n",cpuGetFlashSize()); ' t8 q. k2 @$ w+ G5 b
也可以通过 STLink Utility 查看 6 j7 `3 s* q( g) E+ G% n
3 F3 r J6 P* E7 o) u利用STM32的ID编码结合来进行产品加密,产品唯一的身份标识非常适合:, `' w9 F$ s. \$ r7 a$ d, w
● 用来作为序列号(例如USB字符序列号或者其他的终端应用)
8 j+ T# [" X" s# S8 e● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
7 R$ E+ }7 P) \: ?" v; |● 用来激活带安全机制的自举过程) ^: q( W. q! j, h, I3 L
96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。
+ G5 Y4 o# U: W- h, ]这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。' ^# q$ Q4 _5 C
基地址:0x1FFF F7E8, s( p$ e3 H! o) p& A
$ E7 ^ ~' G8 A3 g2 r* f
( S3 s' f- `8 F5 E1 o每个CPU 出厂的时候都8 S- r: i0 M) x& g# w3 a' P. D
配置的一个ID,96 位的.这个唯一码可以利用作软件加密.......
+ `/ L# r$ w5 D
2 _9 V) z: [6 C: ^/ B$ q4 ?- static u32 CpuID[3];; F2 ~5 k8 h8 r9 h9 e. Q6 K' @
- static u32 Lock_Code;
1 Q, q5 v& E7 h' O - F. I# g' a; n( h4 a: w+ A; o
- void GetLockCode(void)
2 b1 C; Y1 ~. h r+ \ - {
( p7 [' U K) K1 C - //获取CPU唯一ID& G- k! V1 ?: r& ]2 ?4 M9 u
- CpuID[0]=*(vu32*)(0x1ffff7e8);( A5 ]% J/ P# p' D8 S. s* G
- CpuID[1]=*(vu32*)(0x1ffff7ec);- r4 R9 _. j1 l7 r0 B) ~: A
- CpuID[2]=*(vu32*)(0x1ffff7f0);
8 S/ d% y, S# x - //加密算法,很简单的加密算法( T+ b' U& z# |9 d1 R
- Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
. ]2 [- H* H/ C1 M# a& f - }
复制代码
/ Z& J* I8 C, p+ X示例: STM32使用 CPUID加密算法,很简单的加密算法
' M& t5 _! T+ G+ R8 A7 fLock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
; f9 f8 Y& l C' M, Z CpuID[0] CpuID[1] CpuID[2] Lock_Code CpuID[0]>>1 CpuID[0]>>2 CpuID[0]>>37 G4 D. j3 s2 M
1号CPU 0668FF30 3037564E 43023216 17A29B6D 3347F98 C0DD593 86046425 ?9 S4 i! J0 q
2号CPU 066AFF30 3037564E 43024449 17A39DB4 3357F98 C0DD593 86048899 g1 m. j! ^: c' M+ F: Y3 g0 H! g
3号CPU 066CFF30 3037564E 43021551 17A497D5 3367F98 C0DD593 86042AA1 G% L* H( p# U$ _
4号CPU 066BFF30 3037564E 43024716 17A41E0D 335FF98 C0DD593 86048E2
/ M% ?5 T* m& X; P' r4 }0 N5号CPU 066CFF30 3037564E 43023851 17A49C35 3367F98 C0DD593 860470A
* u/ O# M1 D& D' u9 }) G6号CPU 066DFF37 3235564E 43152737 1826FA14 336FF9B C8D5593 862A4E6; z) j4 j' z5 F, |( V
& ^: q5 G& R# b
————————————————
9 |. R2 F+ D" N1 _' L6 L5 a a1 L; e版权声明:jiangchao3392
8 ~# j2 W$ p9 @6 C |