1、TI CC1310 sub1G的SDK开发之唯一识别号MAC地址读 H1 j! r6 t t) x3 C* z& R
TM32微控制器有一个96位的产品唯一身份标识,在任何情况下都是唯一且不允许修改这个96位的产品唯一身份标识,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。 6 p' j' V( n! k6 N8 b7 v. v* |/ k
想要读取唯一ID,就需要知道它的存储地址,在不同系列的MCU中地址是有差别的,我们查询了部分MCU的资料并将其总结如下:
/ \ B# l' ]$ z, u3 j9 C) ?- //读取FlashSize! X1 U) }% g+ V- Z) S1 A
-
# i' J( T, |& b, d2 ?7 Z - uint16_t cpuGetFlashSize(void)
* c. m6 S% e" o( K - {2 G/ R/ k: p1 ]4 D
- * w$ J$ A/ [7 r7 _/ ~3 g
- return (**(volatile u16*)(0x1FFF7A22));
- y4 s6 M9 e' L: m' r" c$ B - // return (*(volatile u32*)(0x1FFF7A20))>>16;& i' A p7 p( ` g
- }
" o( }' x9 N' C# r5 h9 p& ~ - 7 @, q9 e7 w' E6 |& |
- //读取ChipID
" K) d7 u" V D! Z) y# x& T5 P -
! d. w; X, r' ?- v - void cpuidGetId(void)
7 V: ]; n0 t* T+ U B5 ?9 T6 q - {/ B! b) h: E1 y [7 [6 ~; V( Y
- mcuID[0] = *(volatile u32*)(0x1FFF7A10);
$ ^$ u$ T* B+ S - mcuID[1] = *(volatile u32*)(0x1FFF7A14);3 x+ ~% @/ p- K2 Y/ _ @) A3 F) b
- mcuID[2] = *(volatile u32*)(0x1FFF7A18);
( n8 R2 ~) X1 b) \ - }& C0 |* U. _; D3 v0 _
-
: \- b4 ~! S& V* @8 v
0 L( h! C) q$ O, E% z J2 l+ t" \- Send_data3 = ((CpuID[0]) >> 24)|0x00;! Y6 d, \8 i% H1 i. y
- Uart1Write(&Send_data3, 1);
: H/ H' E0 N6 v/ K/ A# z -
( g3 }1 `& G* o' }9 \ - Send_data3 = (CpuID[0] >> 16)|0x00;/ b& T. e( T/ u: L
- Uart1Write(&Send_data3, 1);
+ o$ K; v' N- L2 f! ~3 \ -
8 H% Y) v* I$ T; y, p - Send_data3 = (CpuID[0] >> 8)|0x00;* S, l$ t: Q, C* ~4 j
- Uart1Write(&Send_data3, 1);
, o3 T' O$ o4 |. u% ~( d - ' K: J& d" i9 H/ v$ t) q
- Send_data3 = (CpuID[0] )|0x00;1 i7 K. \9 Z- [
- Uart1Write(&Send_data3, 1);
: G2 Q% O' k# U& Q - c! V6 q! L% G2 Q! C' C4 `6 l
- Send_data3 = ((CpuID[1]) >> 24)|0x00;) j( a L" b7 q! ]# o# W
- Uart1Write(&Send_data3, 1);6 Y$ |( Q5 X$ n+ L- T1 M
- 8 e) {& G- `; _4 E; V2 e4 @
- Send_data3 = (CpuID[1] >> 16)|0x00;
7 {+ w |. ?' i+ n5 U: C - Uart1Write(&Send_data3, 1);
" |$ Y, X5 P9 L2 c2 C+ p - # b9 A& H0 E0 X9 Z! J7 c5 @
- Send_data3 = (CpuID[1] >> 8)|0x00;7 |4 H4 h; r( J( e3 D, d; K3 k8 j
- Uart1Write(&Send_data3, 1);
8 u- r4 Q/ l/ D. H$ [! d -
7 G% Z# {! u% c$ z/ w M - Send_data3 = (CpuID[1] )|0x00;
: r) Q( t" I: Y" {% h - Uart1Write(&Send_data3, 1);
4 }' U$ E9 D- B; C& K+ v9 w! J - ) V2 p3 R( ~: W9 {1 B: o
- Send_data3 = ((CpuID[2]) >> 24)|0x00;8 y. ?* Y. u4 p) B4 ~
- Uart1Write(&Send_data3, 1);
/ a* C/ g; \- t4 W0 N - 7 y" k% }7 `2 i( p2 G" I( j
- Send_data3 = (CpuID[2] >> 16)|0x00;
2 m9 S5 \7 z0 a% I - Uart1Write(&Send_data3, 1);( B1 S# V) \* W) \
-
+ h9 N. |* Q4 ]7 T0 I! \ - Send_data3 = (CpuID[2] >> 8)|0x00;
1 \% C+ f1 Y2 Q" h+ K% J8 g" L - Uart1Write(&Send_data3, 1);
) e; L1 [0 Y8 O -
: j9 {/ s3 h& K - Send_data3 = (CpuID[2] )|0x00;
7 f1 J" N! L- f) j$ p9 @' ] - Uart1Write(&Send_data3, 1);
复制代码+ J( B0 _" d5 L
通过串口发送到PC就可以看到了。 串口发送程序; printf("CPUID IS 0X%X %X %X.\r\n", mcuID[0], mcuID[1], mcuID[2] ); 5 M: c/ y, I& Y5 B3 p) s+ E% Z
printf("Flash size is %d KB\r\n",cpuGetFlashSize()); ! M h' c: E( f
也可以通过 STLink Utility 查看 9 [2 Y2 D% k r& M
& u p/ Q: M: h" t& b利用STM32的ID编码结合来进行产品加密,产品唯一的身份标识非常适合:
; @9 B5 X8 @& ], N● 用来作为序列号(例如USB字符序列号或者其他的终端应用)
# \; t9 F6 R! R. n- E● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
3 M- s/ r6 s* l- ~0 O● 用来激活带安全机制的自举过程! B: g" P' `4 c4 D p- z& h+ g
96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。( C# |# l$ N) {/ H4 U9 M. K
这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。
+ W2 d5 p8 I0 N o( d7 n基地址:0x1FFF F7E8
3 I) N. N n% m! X3 E9 T( }: F. N& N7 F g( }
1 v: C8 X3 @) o, p) W3 P) ^每个CPU 出厂的时候都2 V3 _0 P1 A% R. T6 k R/ Z
配置的一个ID,96 位的.这个唯一码可以利用作软件加密.......
- R; _# J: @% {$ T- o( {% ~6 `! z0 b6 I% W: G+ k
- static u32 CpuID[3];
9 O( \0 p S. V: V8 P - static u32 Lock_Code;2 ~( Q3 }# s% O$ M
- 6 s! R7 k# ~' N# T8 G+ E% \
- void GetLockCode(void). \: L2 Y7 \" z( I$ w2 C* n: b
- {
3 K$ N+ W( `% c( x6 ^* E% ^ - //获取CPU唯一ID
6 B% \2 s. r- t1 J! h3 c6 C - CpuID[0]=*(vu32*)(0x1ffff7e8);
' d i( m/ U/ X! N$ ?# P; k. |0 |. p - CpuID[1]=*(vu32*)(0x1ffff7ec);
2 z. S% Y0 J V: ` - CpuID[2]=*(vu32*)(0x1ffff7f0);9 v- o( \) |# g3 w
- //加密算法,很简单的加密算法+ E7 n" y. a6 j$ e1 w# u
- Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);) {7 r4 X k4 d3 _' w b+ x
- }
复制代码
0 G% M) v$ h% L! l0 C& J m5 p示例: STM32使用 CPUID加密算法,很简单的加密算法! R/ W% t x- t) s; ^) Z1 J
Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);7 R, ?3 L, a9 c& `1 b0 P0 W5 \
CpuID[0] CpuID[1] CpuID[2] Lock_Code CpuID[0]>>1 CpuID[0]>>2 CpuID[0]>>3, W5 X' T8 J/ P, Y
1号CPU 0668FF30 3037564E 43023216 17A29B6D 3347F98 C0DD593 8604642
# g2 o/ m, j3 V9 |$ j! r2号CPU 066AFF30 3037564E 43024449 17A39DB4 3357F98 C0DD593 8604889# d4 m+ J5 i6 I
3号CPU 066CFF30 3037564E 43021551 17A497D5 3367F98 C0DD593 86042AA3 |; J3 i! c- u
4号CPU 066BFF30 3037564E 43024716 17A41E0D 335FF98 C0DD593 86048E2, K+ i9 Q! ^2 V" b7 O. q/ a# l5 _
5号CPU 066CFF30 3037564E 43023851 17A49C35 3367F98 C0DD593 860470A# b, q2 Z# _5 l% n* Q4 L9 |. |
6号CPU 066DFF37 3235564E 43152737 1826FA14 336FF9B C8D5593 862A4E6" F: `& u4 ~6 {. M: ^$ B6 j
6 {1 @; K" T3 V8 ^9 f: x3 f1 O
————————————————
/ J. `9 X7 E( n: w; m版权声明:jiangchao3392
3 Q+ E! l1 [6 ~- ~$ H+ Z |