你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F407中的RNG获取随机数经验分享

[复制链接]
攻城狮Melo 发布时间:2024-5-25 15:38
随机数是我们编程中非常常用的一项技术,在我们的生活中应用场景十分广泛,例如密码学中对密码的加密,在模拟信号中用来模拟随机事件的出现。4 z% s; Y* C! B- [+ w; ~
# Y" }( u" L& A4 i& }) C
例如我们在之前的使用NanoEdge中测试的数据模拟正弦波的时候就出现了数据太过于精确而不像一个模拟信号的样子。+ Z& c& u' S! A- S" ^9 [$ J

) J0 B% i. l  L0 m6 d* d2 Q/ |/ }
因此使用随机数可以在模拟仿真领域中起到非常重要的作用。
0 c# h; [, m5 ~" j  x
- u" Q8 h' e0 [2 }9 d 微信图片_20240525153752.png 7 A5 \% o2 m2 y0 y4 C4 g
' ]8 U/ w$ [( F- M( ^; M/ |, J
在STM32参考手册(F4系列)中提到了STM32中具有一个随机数发生器(RNG)读取其可以获得一个32位的随机数。- q4 b& _2 W  a

% d+ A+ J7 E- J8 l" `" Z+ ~ 微信图片_20240525153749.png . c+ C- e- Q/ f. T
: r& b  v: _& h; u0 i/ Z# |
随机数发生器RNG采用模拟电路实现,同样具备着异常检测的功能。接着手册的后续部分讲述了如何操作寄存器中操作实现RNG,但是由于我们使用HAL库编程代码,因此我们直接跳到HAL库的部分。
/ D& m  b# j! V  h3 g7 R
; R4 E( f7 L% U! r/ i0 q  l! o# A& c 微信图片_20240525153745.png
1 }4 s" B$ u' H/ N, `6 f8 c
- a; y- o5 ?9 O* x1 S# ]  M5 g
在CubeMX中我们需要使能RNG功能。) f  F! w' `# [

# a; }; e+ m* a" l# _' F
之后创建我们的工程。
+ D: e+ Q# v5 m+ b6 g
7 o7 r3 v+ l% r# x% \$ }9 v0 Y, |
我们可以使用HAL_RNG_GetRandomNumber来获取随机数* j, R0 z& z$ Z1 r+ O
  1. while (1)$ S' R0 _, l1 ^* D) S
  2.   {
    4 {* ~" I& R; G9 f
  3.     /* USER CODE END WHILE */( h" j. o) U) @# h/ l

  4. 5 g: M  j2 k( }8 _4 R7 |

  5. ' S' O4 @7 d/ S+ R7 E
  6.     /* USER CODE BEGIN 3 */
    & J# R4 E( o- t% i! w0 k
  7.     printf("%ld\r\n",HAL_RNG_GetRandomNumber(&hrng));+ H! }7 ?3 f- H7 u: m1 H0 j
  8.     HAL_Delay(1000);
    ( f- o: F4 ]4 v) N+ ~7 G
  9.   }
复制代码

) h& f. t  e8 |, n需要注意的是,这里生成的随机数是32位的,因此我们可以利用一些简单的计算来获取我们需要的随机数。
" ~$ s' _' r9 `- u+ Z) `
  1. uint32_t RnNum = HAL_RNG_GetRandomNumber(&hrng);
    ' v/ S4 i; N+ w# h5 s" ]/ T
  2.     printf("%ld\r\n",RnNum%10);
    & c& z1 g8 g% Y' m
  3.     HAL_Delay(1000);
复制代码

" r: r. V  T8 K8 E" j  M- ]我们对其进行取余,即可获得0~9之间的随机数。
# h2 {$ X: H# F% j3 V' c" p- y) Z( H5 T+ o( _
微信图片_20240525153742.png
! p% k7 y0 |# q2 r/ ?
0 M+ J( n; U0 Q: K- Y初次之外,我们可以利用这个随机数来模拟噪声信号。
- w8 S- a- D& a6 j! V
  1. while (1)! Z( F" x! {3 R0 F/ k
  2.   {% ^/ P5 B% \7 ^4 e; F
  3.     /* USER CODE END WHILE */" c( p2 h( q3 h! j1 c. f
  4. 2 G7 Y! f/ U* Y) W
  5. * k, o& A. c9 m2 ?2 W0 t
  6.     /* USER CODE BEGIN 3 */, E+ R+ p! D# \
  7.     uint32_t RnNum = HAL_RNG_GetRandomNumber(&hrng);/ P% D2 ^/ P0 r" s
  8.     static float t = 0;
    ) g8 m& ^" m" n: d2 W8 e
  9.     float s = sin(t)+RnNum%10*0.05;
    / m5 m0 V5 W7 v6 b+ u
  10.     printf("A:%.3f\r\n",s);
      f2 P& B! n9 N$ h
  11.     t+=0.01;   1 y- k6 F7 `+ a. J* {7 A
  12.    
    ; x5 m$ F0 z8 \# d! q
  13.   }
复制代码

4 A% a$ q* t" E' P 微信图片_20240525153735.png 0 H4 k) V2 X0 g/ g

0 {7 l) v+ o; l# c) i9 M3 [我们在原始信号之上添加一个噪声信号,这个噪声信号的产生就由我们的随机数发生器产生。( N4 J7 h% K: }- L  ]& H
' ^- A; K% d( u

  p6 D, k0 s* G, N* u6 D转载自:电路小白' z8 @4 H1 c& M5 C4 s$ o
如有侵权请联系删除
7 A- I; Y8 E3 |9 I) ]( P  u# }( \2 I) W1 [
收藏 评论0 发布时间:2024-5-25 15:38

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版