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

基于STM32产生随机数经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-30 18:02
STM32有2种方式产生随机数:硬件方式和软件方式1 D7 a6 h( v- H2 L" P, O7 {

: t9 A0 e2 @# o1 K/ W软件方式9 z  A! Y4 \2 ]- K$ j! i4 S
其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:  w+ [; @. {6 U* e' u/ I$ e- c
1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子9 I" o! r# }+ f) {" N# X; Y
2.通过 rand() 函数获取一个随机数$ W, p3 [3 {; D8 T) y
+ B# l7 r+ E2 V5 [+ p, O
硬件方式
5 |. `0 y8 l% D
STM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数
* _# p1 I3 U( G" b7 W(即随机数的范围是0~2^32-1): F* R; ]+ }# N* u2 N( c

) z! L" X5 w' D! ~% c/ P' e0 t) O3 B* K随机数获取的方式:
0 T3 I: Q3 @- a4 P/ m+ K' c( c
  1. #include "rng.h"+ n+ n7 ?9 J% t2 N, L( A( _
  2. #include "delay.h"( g/ \/ p, |; j: X: ~
  3. #include "sys.h"( M4 X1 z' @* U! u' @& ~
  4. : g4 x% P4 T$ |& y8 r% d
  5. //返回0 初始化成功,返回1初始化失败4 M: ~' s. R3 i9 Q8 e+ B' J
  6. u8 RNG_Init(void)    1 I3 K" i- I# n9 M* d+ R/ E
  7. {& Y" X# k0 q" |, g
  8.     u16 i;6 c& W4 w+ N  r6 A
  9.         delay_init(168);
    : _8 w7 C3 ?$ {, K+ D. g
  10.     //使能RNG时钟
    2 c5 J; U, \" m+ d& _
  11.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上1 N5 t  B. B$ ~& _& \3 x
  12.     //使能RNG! |0 g1 k9 C  Z) p* l" G" \6 w; c. v! o
  13.     RNG_Cmd(ENABLE);//使能RNG7 _) _3 `5 V$ U* N1 ^
  14.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     # G, X7 a- }9 Q" J, R7 \8 f5 H
  15.         i++;
    9 |; s: B- |4 Z( A! @) j5 x
  16.         delay_us(100);                # Y* O+ t/ v" j+ y/ G0 ^
  17.         if(i >= 10000){0 j3 H5 k) t; ~" }; G. z9 e
  18.             return 1;       //超时强制返回
    % W) J" A, G$ t8 Q( M" x% O8 D
  19.         }         2 I; A, L4 c! u. h- [
  20.     }
    / b+ I3 \, P# o
  21.     return 0;     
    5 o7 g% V  P8 x; L5 T  Q
  22. }
    ; l0 o9 z, A, a, M0 ?" H1 \) |

  23. , S. G) m- A* n  j" x3 _5 y

  24. 5 ^4 ^# s  s+ a4 P
  25. //读取数值函数
    9 F0 \; @$ V+ @9 Q$ K. P" o
  26. u32 RNG_Get_RandomNum(void)
    $ i9 ~, N7 y2 E2 {) Y9 N
  27. {4 @$ b1 W6 x! Z( h* A# O
  28.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定/ C" R2 c5 N% w
  29.     return RNG_GetRandomNumber();    //获取并返回数值3 b- R7 G4 @1 k. R$ ^
  30. }
    * E  w. ~- P. ^+ \; X
  31. % d7 }) |+ Q; n/ u6 Z+ s
  32. //获取指定范围[min, max]的随机数0 k5 Q( l# P  s& i, ^; l
  33. int RNG_Get_RandnomRange(int min, int max)     ! K0 F3 N" F; |' \+ q
  34. {, r( O" J- T4 M; |
  35.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围
    : r! v0 `1 U! S- `
  36. }
    3 b) L  W- V* c9 C8 I: k- I
复制代码

4 }- [# |2 g6 a2 v$ q. g在主函数中获取一个随机数:
. H/ Z! }5 {8 Z7 m+ Q9 e1 ?
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数- }8 t4 }2 |) w
复制代码

; s# m  v8 b1 |5 V  V————————————————' m4 w* n, C$ b1 ~
版权声明:[小G]
: ^; v( M6 B# `/ N6 |如有侵权请联系删除+ w  ^3 e: B  C% O  C/ {# P9 E

" i9 e! t7 {8 {8 N6 F/ D7 t+ ]
; @8 {5 l; m6 `7 f3 M3 L! z" d# q! [9 S. Y6 y, f4 V) g2 T* D
收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版