随机数是我们编程中非常常用的一项技术,在我们的生活中应用场景十分广泛,例如密码学中对密码的加密,在模拟信号中用来模拟随机事件的出现。
: h% Y" ^( g7 Q% a& b
+ p$ F! a" b# t9 a+ h) f3 @! f例如我们在之前的使用NanoEdge中测试的数据模拟正弦波的时候就出现了数据太过于精确而不像一个模拟信号的样子。' B$ [0 o. n' a8 ~) ?2 ^
$ O( H; c8 R1 v因此使用随机数可以在模拟仿真领域中起到非常重要的作用。
. v/ L' T( U& \: ^& n" t6 ~# e: q7 c
7 r3 {8 i* T( S9 `& Y
* @; ?2 A- ~: b9 ]
在STM32参考手册(F4系列)中提到了STM32中具有一个随机数发生器(RNG)读取其可以获得一个32位的随机数。
6 }! s1 I; e$ T0 r4 J- |7 V1 m ?" ]) X: V( P
7 a7 @. E/ p$ U+ X3 G
" g3 k+ H7 }+ c. ?/ u
随机数发生器RNG采用模拟电路实现,同样具备着异常检测的功能。接着手册的后续部分讲述了如何操作寄存器中操作实现RNG,但是由于我们使用HAL库编程代码,因此我们直接跳到HAL库的部分。
* {2 E8 ^/ j7 }) y6 X3 P$ h
* b# y" j3 {0 o ^4 a3 u
1 C: `# B$ O' y/ d4 a' h2 w
& s$ M7 w/ f1 v! a7 Z" ]在CubeMX中我们需要使能RNG功能。7 Y8 l8 D0 y$ \; c; v
$ i' `1 C5 c2 K& e0 m5 w8 d' J) z之后创建我们的工程。
4 s, Q @( h8 L/ _7 R
$ x. w( ?- w6 A1 H* b我们可以使用HAL_RNG_GetRandomNumber来获取随机数
( K$ f, ]. c# p" Z, k! j- while (1)
2 S {7 Q3 b$ F% I" T/ O$ M - {% H& \2 s" F/ c- [! ]
- /* USER CODE END WHILE */* W- j# z- Y: e. p) @
. ?: ~, ^( V! }! ]9 ~6 S. v; a V% K
f5 y* e# y. W- /* USER CODE BEGIN 3 */( O# B3 }6 h8 p8 H# R" L5 B \, N
- printf("%ld\r\n",HAL_RNG_GetRandomNumber(&hrng));
& E3 x8 c: I) M/ V0 @ - HAL_Delay(1000);7 z- i/ [9 M q4 o. o. L# I% g
- }
复制代码
G$ r% t4 F! V: i; e# y需要注意的是,这里生成的随机数是32位的,因此我们可以利用一些简单的计算来获取我们需要的随机数。0 ] V8 e( _' [: O6 H( B
- uint32_t RnNum = HAL_RNG_GetRandomNumber(&hrng);
- o6 k+ R9 i, _+ q( B1 K - printf("%ld\r\n",RnNum%10);# T+ X% X: M; G# {
- HAL_Delay(1000);
复制代码 / |) Q7 y. O+ d' n7 N
我们对其进行取余,即可获得0~9之间的随机数。" H7 p, C. V! W" B9 B; _" W
- t% ~" o- e. E2 K% Q4 x
9 K+ I- J) j' D' i0 G; [8 e/ f5 G
6 W6 S) {2 c- N4 x, @
初次之外,我们可以利用这个随机数来模拟噪声信号。" ?( {! f+ M' o* R
- while (1)
" v- o6 z+ N* J0 n9 J: V. c1 d - {1 w6 Q- ]1 x0 }6 |* n) ]1 ?0 y ]
- /* USER CODE END WHILE */
5 V8 a1 ]* K' V$ V. f
6 U3 |* y0 T6 r8 I' x
. p8 \0 ^" c9 T( @7 u1 O7 ^' g# M7 }- /* USER CODE BEGIN 3 */
3 ]! i& F( Q, Y1 C/ s) v3 E6 E - uint32_t RnNum = HAL_RNG_GetRandomNumber(&hrng);
0 a$ ~3 N& [+ ] - static float t = 0;
! n6 E( c2 M" u2 L5 p - float s = sin(t)+RnNum%10*0.05;
; A5 s* g6 K1 H( ^' q1 i8 T4 q - printf("A:%.3f\r\n",s);2 D* }( O4 Y! S" {& ~7 x1 n
- t+=0.01; 8 q* ^8 p) X! y
-
! `* m4 t; F/ n$ Y - }
复制代码 ) J9 A, T2 l, v* k0 X4 |, Y2 I5 O
x* m9 [( H% K
' G" l; ?3 N9 K( Y6 m& u* {9 {* s
我们在原始信号之上添加一个噪声信号,这个噪声信号的产生就由我们的随机数发生器产生。- J6 P" h/ [# r3 s+ B" X( G8 R( D
+ o! j9 C1 H- }- t( b2 k7 e# g# b k, |( u3 _4 b" q( c
转载自:电路小白" r; I6 G! O6 V) W0 C
如有侵权请联系删除% s" U2 O5 c- Q D P' d& H
' T3 ~- w% W6 P4 q2 x' u
|