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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-30 18:02
STM32有2种方式产生随机数:硬件方式和软件方式  |8 O1 M. |' R

0 W4 u$ D) w. ~# L! i+ V% C8 H+ [( h软件方式1 A7 y: Z  }+ ]
其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:
: y2 j2 P% u# ~* L/ O, i- ]' M1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子
& a/ N- j2 |1 N% v
2.通过 rand() 函数获取一个随机数4 e5 z9 c0 u& X8 w) N
* a% _  Z" i) L  h" }
硬件方式

) L) ~6 E0 E( q+ p! s8 n' f- ~" JSTM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数
9 U! u- y( K( d; C+ y) R5 N: p% C/ E(即随机数的范围是0~2^32-1)
6 [  T5 X7 s+ U/ P, V, N2 j( |7 i4 b! I% p
随机数获取的方式:
0 W' l) _8 [- E8 G
  1. #include "rng.h"
    0 u8 g, Z; e0 ^: Q& |
  2. #include "delay.h"
    + `$ Y: }  u! _( I% [" X
  3. #include "sys.h"' T2 V3 h& q  m0 D7 }
  4. - a( B1 G9 b" H- b
  5. //返回0 初始化成功,返回1初始化失败" T) {. }: m. w/ y! U
  6. u8 RNG_Init(void)   
    + p+ `8 M% e& E9 f6 j2 [- o
  7. {
    ' `6 Y3 T. i5 x9 X2 U
  8.     u16 i;
    $ H2 h- F/ m$ g( c7 ^6 A
  9.         delay_init(168);- p- V3 ^. z3 C1 a' K: v# N+ l
  10.     //使能RNG时钟
    , x+ X0 C5 q% E( g- k
  11.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上. I6 c; g2 A+ h9 {1 g
  12.     //使能RNG% q3 n$ t) D8 a) F7 c2 M
  13.     RNG_Cmd(ENABLE);//使能RNG: ]2 D3 S, M& k7 R) @: E: ^& V& s- M
  14.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     
    ) l9 ]! y9 b' J9 l5 `
  15.         i++;
    9 O6 ?# }6 g% y" \8 O8 r
  16.         delay_us(100);               
    & v. t- E% ~& d, m, H, o7 T- G
  17.         if(i >= 10000){
    * l/ X% v$ U. M) g: ]3 U, y
  18.             return 1;       //超时强制返回* x1 A! I+ \! V: X, m% R
  19.         }         % c2 H/ B# d1 h8 b
  20.     }$ J. F- R8 k& b& O( b6 p
  21.     return 0;     & U, a6 |5 C8 H# E; b2 s# u& s
  22. }
    7 V. G7 o) Q0 P6 K

  23. 8 e8 ?1 Y5 v( C1 K# W
  24. 3 c, ~6 a% _) [
  25. //读取数值函数/ |/ e1 i- a6 Q. k! \6 K4 [8 ^% v( Y1 \# R
  26. u32 RNG_Get_RandomNum(void)
    9 I' }- L4 [0 x# i
  27. {" m* l2 ?8 C/ e1 r1 z
  28.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定
    ) S' y' D9 ^2 c% P
  29.     return RNG_GetRandomNumber();    //获取并返回数值" a, f; \: P5 V  G# r/ q, C
  30. }
    ' f5 r( D7 d8 N- B
  31. 5 I- i! j4 G( O8 D
  32. //获取指定范围[min, max]的随机数7 v4 v$ o* @  n3 g7 D. j
  33. int RNG_Get_RandnomRange(int min, int max)     
    5 t7 f6 y# S( m) U
  34. {2 J% @, _0 Q& s: _$ ~
  35.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围* ]& I1 z: P& ?4 H1 W2 S& a7 g7 R
  36. }
    2 }& J) H) h6 s( d8 e" c7 o* D
复制代码

8 H2 |/ j7 \# l! \- X在主函数中获取一个随机数:
/ W2 `2 p" z1 z2 @  S  G5 M
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数
    ( j! }  e7 a$ E  t& K( {( U3 R6 i
复制代码

4 e# U1 T8 Y% g0 L————————————————
: f! p% g/ M$ ^# n: t版权声明:[小G]6 f/ X! L$ j- \* G) `, A$ D
如有侵权请联系删除
2 q, ^; @4 ^6 l% @( ^9 w& M" Y6 q6 N" ?" k/ j4 E8 {
& L5 T0 b: Z1 C" F5 ^( i
+ b. H9 s( Q1 \5 V0 t9 B$ d
赞 收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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