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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-30 18:02
STM32有2种方式产生随机数:硬件方式和软件方式
" U1 m6 B7 v3 z6 T) I, Y

- h1 p! \  x! Z9 G2 U软件方式
& H  e& _4 I% }其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:
0 n. h9 {! r( x" a3 j/ Z) h7 S1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子
& p$ l) W$ C& b9 W% B" z
2.通过 rand() 函数获取一个随机数! C. I/ o, B" s: C* \* T' n
" j% @! l% S+ ]# Q" m
硬件方式
7 ?; }1 h5 H$ Y3 X/ s* f" D" \. }
STM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数, ?  [/ ?$ H8 A0 M  S
(即随机数的范围是0~2^32-1)
0 o& L5 j& |- _& G  G2 F- }
; N2 H& U0 i; }* F  D: d- P+ @随机数获取的方式:
9 \; f2 |2 ~0 u5 O' C' \$ H1 `
  1. #include "rng.h"% f3 W1 Z" y0 d: h, a+ l# j
  2. #include "delay.h"
    6 l1 x8 o* x/ V! B! v7 b6 b9 F
  3. #include "sys.h"
    ( T, d. x& j+ ^9 X7 C& b
  4. & p8 ~8 }6 ~5 `* K
  5. //返回0 初始化成功,返回1初始化失败
    / L4 {  z, ^2 f. }/ A. P
  6. u8 RNG_Init(void)   
    / V2 g. R: ~8 Z$ l6 n, q6 `
  7. {. J9 f7 u: w" j' F$ a% z# F
  8.     u16 i;
      ~. [* `4 ]1 ?2 V) H
  9.         delay_init(168);
    5 }' a3 x) t1 _' E
  10.     //使能RNG时钟
    0 T# y2 D( u6 @. u, ]) e
  11.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上: q' h9 X$ N3 k- r8 U
  12.     //使能RNG7 b0 b$ A3 v4 h7 D/ j. `, X  ?
  13.     RNG_Cmd(ENABLE);//使能RNG
    / U6 T, I  X2 E1 s' l3 H# J0 o/ U
  14.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     
    " O+ H) |; \3 `, l3 A
  15.         i++;
    6 K! s! c- C% c/ M
  16.         delay_us(100);                + r$ X( ~7 V% U: G- y, T3 v+ y
  17.         if(i >= 10000){+ P6 f4 @" i( r& ?1 Q
  18.             return 1;       //超时强制返回
    ' y$ `* L- C& r; [- G
  19.         }         
    + ]* k& F0 q4 G+ U7 Z3 w1 r
  20.     }
    9 b/ z- @5 l9 \' F6 h; Q
  21.     return 0;     2 M4 g9 I* {" S+ K' c
  22. }% n) T* f5 a; Q

  23. ! S0 n. S' C& e2 C" }% Q& j; c
  24. % ?6 g5 Z9 [+ o0 ^2 {- \
  25. //读取数值函数
    4 G2 [3 w8 q3 b% o, x
  26. u32 RNG_Get_RandomNum(void)# {9 g8 ]; t+ V0 P8 n. ^2 \
  27. {  [# {1 w$ N2 @7 H
  28.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定
    5 P' m# _8 P* @: j. h/ l! e
  29.     return RNG_GetRandomNumber();    //获取并返回数值: T+ a$ x+ e, Y3 e+ O
  30. }
    ) L5 \5 b" ^( E) g; ^8 c5 L

  31. 0 |% _5 X+ ?; w
  32. //获取指定范围[min, max]的随机数
    ( D# [. x- }, J- @' K  R6 b2 w
  33. int RNG_Get_RandnomRange(int min, int max)     8 f7 Y2 T1 h" Y5 |# E3 K
  34. {
    3 h7 Z9 R2 D# G" Z' O4 D* V
  35.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围
    " L/ J  B- r" e$ H; Q  \. t/ u8 ^
  36. }
    , R: {0 T3 g& X4 L, A
复制代码
' }4 d) l$ P% O
在主函数中获取一个随机数:
& c7 O/ \4 K  [7 s4 b
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数% \% b- P4 M1 J5 u8 O
复制代码
9 X3 l3 ^) b  L$ w- u
————————————————
% ^- t$ w* r$ y版权声明:[小G]
4 [1 r& e. q6 e如有侵权请联系删除
3 u* q2 y" ^+ h4 \2 `+ F( _+ c! F; t  v+ U, `( V
$ g, Q8 c6 E# Z: A2 q
1 D% q9 c" d; M5 V2 `
赞 收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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