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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-30 18:02
STM32有2种方式产生随机数:硬件方式和软件方式
7 I# }% o  v& J
% C/ Y/ O0 @) S
软件方式
$ y. T7 {7 ?2 r# e其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:8 W) J. N; I: d$ h* I- R
1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子4 {+ D' i& x# M. m% T5 @$ w
2.通过 rand() 函数获取一个随机数. z) c2 F7 u. T' J0 ?8 X8 V
' r1 Y  M# i! u
硬件方式

* Y0 v( s6 g2 W- lSTM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数
$ O+ O8 g6 g$ {2 i' `(即随机数的范围是0~2^32-1)
; V  S: X; S3 u7 m3 ^! K( R4 A9 o2 P; b% O% l
随机数获取的方式:
7 D3 Z* X" Q. `% S8 L0 [
  1. #include "rng.h"( {4 w) k. {) _
  2. #include "delay.h"
    8 x9 ^& F6 ]- @: J3 a
  3. #include "sys.h"! p2 [1 C$ S+ q8 }7 T+ c6 z" R

  4. # q) h' |9 T. h; `+ i* r- Q
  5. //返回0 初始化成功,返回1初始化失败
    # q/ v- F" I: q) {5 i
  6. u8 RNG_Init(void)   
    % n9 w. Z# T% R) P& P
  7. {5 J7 k" ~5 M! [0 q) g& \
  8.     u16 i;! V6 n% _+ @; Y% S' g, K0 S
  9.         delay_init(168);( t2 p6 c/ s5 E
  10.     //使能RNG时钟
    # @1 z3 ?, |4 u- n9 N% X4 C
  11.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上
    ! k# b% C4 H& Z
  12.     //使能RNG: Q- }8 Z9 Y! |" H5 A: J2 _7 i% J
  13.     RNG_Cmd(ENABLE);//使能RNG
    ) n0 a5 h4 ^. S5 I3 o% b
  14.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     
    ; s' R9 y+ O) t' O
  15.         i++;
    - b" g5 B- B. U/ Y$ K
  16.         delay_us(100);               
    " ]/ Q1 ]/ C+ R  \
  17.         if(i >= 10000){
    4 ?! h  R' I/ B+ _$ R6 X
  18.             return 1;       //超时强制返回
    " w2 h/ Z1 e) p6 t0 a; a/ n4 R. Y
  19.         }         
    + Q  s3 |$ r' p# P1 Q
  20.     }! {+ A- t  l/ a7 R; g5 X( Z
  21.     return 0;     
    , E( z, u. Z) K' c" b5 X/ j  p4 H
  22. }- w/ J/ Z: C! C

  23. , Q; G; O# `% V3 U' U5 G

  24. 4 B/ P  Z$ w* j) d
  25. //读取数值函数
    : S9 a8 g% {1 f0 a; Q3 {
  26. u32 RNG_Get_RandomNum(void)) u( a/ ^3 C! o
  27. {
    * P+ i4 w0 {7 k, @% `1 C; `- i
  28.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定
    * a9 p' G, @8 E& L  Z! k# D# T
  29.     return RNG_GetRandomNumber();    //获取并返回数值& T9 m3 Q4 }! q; p- a6 R
  30. }! q0 V+ e. n8 P6 v

  31. ' Y9 J/ _' J& [/ v, c, e
  32. //获取指定范围[min, max]的随机数. B! T7 m! }* L/ K& ?" d' U
  33. int RNG_Get_RandnomRange(int min, int max)     
    1 ~' N+ E1 d* T7 ~' v" H3 F: t
  34. {: T: o8 s; d( r7 Y9 A3 ]0 J" P0 U
  35.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围' D: `, ]9 s8 K( g
  36. }
    + N* D, f% {- }0 d9 L  s
复制代码

. O4 B' Y' @" ^1 e4 e2 N0 [, J4 k% D在主函数中获取一个随机数:
# q, f7 O' F6 M6 Q! d
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数
    4 m. ^$ g9 @, g2 J+ X; U' v
复制代码

+ j' W! {, q! b! d$ C2 K0 Q* @/ j& ~————————————————1 d- }/ M7 z: U% ^
版权声明:[小G]
  k9 f" C" D8 ?如有侵权请联系删除2 e8 ^( O3 e  |. ~4 _: g0 n

5 f( v; q9 U& ^: M) c; H; b" Y" E0 G
0 k4 f- c" e- }# D& ]
赞 收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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