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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-30 18:02
STM32有2种方式产生随机数:硬件方式和软件方式  Y$ E, j4 H/ E0 a  d0 b$ L9 N, v6 v, l
% v, n; G- M& g& N2 {! k; w4 Y
软件方式
6 S0 L0 p# A0 a! d2 I, D& M其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:3 z& e* w( _. n7 a
1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子0 N4 l" B( @* ?' q6 i4 j7 W# |
2.通过 rand() 函数获取一个随机数3 S# H9 k! x/ p3 _/ q; o3 b

( ~! X) h; j: o* e  ?9 ?
硬件方式

. D0 O& y, g4 F% Z' aSTM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数) W& L( Y3 O4 r2 _
(即随机数的范围是0~2^32-1)8 a8 x* M6 R/ o( w! k$ C
# i) h+ E2 Y: P8 ~2 }8 @$ L: x+ M
随机数获取的方式:
3 W! Z9 e: P# F' w7 @
  1. #include "rng.h". {' ^  @; v4 r. ^, i
  2. #include "delay.h"" z3 J% V! [! W1 `* X& c: V
  3. #include "sys.h"' e2 a- Y, `2 @" x/ U* c9 E
  4. ( Y8 d5 E1 p3 S; @$ f9 X, _7 e
  5. //返回0 初始化成功,返回1初始化失败$ w) z% \0 u4 `1 H# W
  6. u8 RNG_Init(void)   
    + t5 V) |$ f0 x6 F$ v- ^
  7. {. u$ R- N5 T8 s; v/ g& m' m
  8.     u16 i;0 `6 {# e4 U1 t+ D
  9.         delay_init(168);! L& O( E% x; G  n+ _$ [
  10.     //使能RNG时钟
    ' e4 d& H: j- V2 G4 Y7 e  L) ~( @
  11.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上7 U1 a0 o; s  t2 r3 Q( l% Y5 k. e
  12.     //使能RNG
    ) b1 W" T/ l: b3 p( j9 q
  13.     RNG_Cmd(ENABLE);//使能RNG
    ' K; L/ c+ z! R5 \
  14.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     " A! e, \$ G& a+ r5 V4 c  K
  15.         i++;# N: H8 ^9 P# c% Y: P7 ^; ~
  16.         delay_us(100);                1 D! b  B4 _" ^' s% L
  17.         if(i >= 10000){
    ! u) B# o! K& A; o2 T/ A, c9 _
  18.             return 1;       //超时强制返回
    - n8 J/ D0 z8 {0 }9 [+ m
  19.         }         ' c# G4 K) R" J5 a
  20.     }1 e" P8 j; A, c
  21.     return 0;     4 |" v5 C4 d6 ?5 \. S
  22. }& p, f1 D5 N! V( a1 x3 k3 q

  23. 9 @4 @. a) Q8 [3 d1 X

  24. 8 g; X8 _# j. ?
  25. //读取数值函数: C9 I$ g. B0 [# ^& i
  26. u32 RNG_Get_RandomNum(void)6 k) q! ?7 [; T, c% `; f& a
  27. {
    3 A% D+ d. m" a
  28.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定
    8 K% C; J- ~) h! N  g- ]; A
  29.     return RNG_GetRandomNumber();    //获取并返回数值& n1 K) ?3 F6 |" r0 c5 H: n" E
  30. }
    * Q! Q' z0 }8 O

  31. * D) U7 @- r) E$ ~; w. E
  32. //获取指定范围[min, max]的随机数- `( Y1 ]) {( @/ b7 A
  33. int RNG_Get_RandnomRange(int min, int max)     
    2 x3 [) Z3 G  h6 `6 W) z
  34. {, B9 C5 T  M  ~* @5 P. V3 j9 m
  35.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围* t* T% e" G' o) a$ c2 B6 e, K
  36. }
    7 t& h  o2 z0 F
复制代码

& P. c* T+ j8 W5 C在主函数中获取一个随机数:
' j1 E- G8 C; [
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数
    " y8 r, K( p7 I3 q* K0 X* {
复制代码
% ]3 ^0 j1 A4 W8 k- Z
————————————————5 y: B/ X. r! \% S
版权声明:[小G]
3 a, b9 |* n. \" ~4 w$ Z' `% f如有侵权请联系删除
8 W# U6 P# r8 I. @+ ?" P& {! y; V% H( [/ U9 ^* ^# e/ E
# `0 c6 F9 R' U* E7 W
; `  _2 ]! Q2 j
赞 收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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