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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-30 18:02
STM32有2种方式产生随机数:硬件方式和软件方式  M5 X/ M. J0 ]% i) q& Z! A7 K

9 D% @5 ~. K; Q, E1 J+ v0 C" o软件方式
! X6 [* V1 ^& U3 _* \其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:
/ U' \: V1 A9 S! a1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子) b" e4 S% d% \' y" y' Z
2.通过 rand() 函数获取一个随机数
+ ~: I+ n3 I1 X5 C
, H! I7 s$ U+ W! f3 Q1 r2 r5 e
硬件方式
2 i0 I7 B; i( ]/ S6 Z+ O
STM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数1 O; L' [3 _4 x
(即随机数的范围是0~2^32-1)" l3 ?$ W1 M7 f8 [- ]9 D

) \; A  m) ^  B1 F& L1 K随机数获取的方式:# h7 v( b5 m# T  E; k/ d
  1. #include "rng.h"0 C: [2 w  t6 s+ J- U
  2. #include "delay.h"
    : Q7 A' z) a; _$ n6 m
  3. #include "sys.h"
    $ M6 H/ I+ t7 Y+ u/ z4 c
  4.   @! j6 e% ~2 C$ Z0 i
  5. //返回0 初始化成功,返回1初始化失败" N+ J7 N- j6 o4 U& s; k- v. M
  6. u8 RNG_Init(void)   
    1 M  F0 y( U7 K! x2 \. j  S
  7. {
    2 m. i& p# J; w9 D
  8.     u16 i;4 y2 m, X: b" j+ t+ X
  9.         delay_init(168);3 x6 J& z0 }$ F6 ?* d
  10.     //使能RNG时钟# c! D& O0 U3 G$ c: j
  11.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上
    ) p8 U$ d- A2 i
  12.     //使能RNG
    / ?8 J* Z; Y/ w( t2 g7 W& Q- [0 r
  13.     RNG_Cmd(ENABLE);//使能RNG
    ( B0 w( g3 }9 k/ W: }8 C. Q
  14.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     : }; I2 t* N& d  q) A
  15.         i++;
    1 f' v; @* @! s9 K+ F3 X
  16.         delay_us(100);                3 P3 |9 U* v, `; H+ }
  17.         if(i >= 10000){
    % m& [; C: I' x5 [
  18.             return 1;       //超时强制返回
    $ k. v5 V7 ^" {: |5 D/ ?, H# [  d+ Q
  19.         }         + l: f" ^& }6 ~& b  {
  20.     }! \' E, |4 o5 N* J
  21.     return 0;     * ~; ^3 f1 o. [) K9 \* a
  22. }
    . i' b/ {5 k: W4 a+ v8 L& \5 A0 a/ P
  23. ) o8 o  y8 E1 p& u, Y3 L# r( |
  24. / {1 u$ n) H# j" @1 L+ S8 a
  25. //读取数值函数5 n1 e3 Y5 O& S% c& U0 G
  26. u32 RNG_Get_RandomNum(void)% o* C! Z! A& a5 o1 K- s  f
  27. {
    & c) E8 \5 v9 g  _9 N8 b/ S: Y
  28.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定/ F* T3 L$ E" Y8 B; n- z$ ~- R
  29.     return RNG_GetRandomNumber();    //获取并返回数值# S( f, s6 [0 ?+ R0 |
  30. }
    ) ^) F1 a( A3 f/ |. o. ~

  31. - F0 Y$ v1 J8 N/ c& X2 M6 a2 ?; H& }
  32. //获取指定范围[min, max]的随机数0 q9 V$ u) u5 q9 t* o) u- E
  33. int RNG_Get_RandnomRange(int min, int max)     3 y7 G6 r1 C+ s3 T
  34. {
    . T$ v8 ]& D& m# T; a+ B& P
  35.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围6 U/ }  e$ s2 Y) a) [. ]
  36. }
    / k; y1 y: J8 x4 {1 d1 @
复制代码
  P# A. Y( k# _4 z4 O. Y
在主函数中获取一个随机数:
% |' n( ?9 G* s' f( C
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数
    - w- h6 G2 A0 \2 d& T0 D/ m
复制代码
+ A) @# _: Y0 W4 z- a
————————————————- `# z& k8 j+ g& \) ?! T. R2 R& w
版权声明:[小G]- O3 x/ Q! P" j8 j9 \4 H
如有侵权请联系删除
' {2 H- x8 v7 n1 h4 m$ }1 V0 p! y, ^+ A; J2 P& |+ r) W1 u; A

! d& b$ ~# A% `8 ?
. [8 C" j7 P* a" ^' |
收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版