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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-30 18:02
STM32有2种方式产生随机数:硬件方式和软件方式
- r0 g; ?* t0 \9 W  U& e4 ]: c: t

" k; \: E$ N; \, R软件方式: s- N5 }1 d& Q/ G8 P: }4 \
其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:0 s5 Y# T+ h. }0 N) ^
1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子
' A1 f, I" z, t9 p' F9 C0 m
2.通过 rand() 函数获取一个随机数
; r7 G  l8 [& W7 p) u
* @0 ]/ D: ~1 a0 K' v2 K( H
硬件方式
9 \" K6 F7 ~2 m( X) x4 k* l! ^
STM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数
6 L' _  i/ ?9 t$ \" G6 m7 V$ I(即随机数的范围是0~2^32-1)1 \! g) B, T! S* \/ S6 N
) @. c& R6 H+ F, K) E( @$ K4 O! U
随机数获取的方式:
1 u8 [" T4 x" }; U  y5 U' n
  1. #include "rng.h"& x6 L* D' K: G5 [: U
  2. #include "delay.h"/ X+ k: Y2 I5 Y
  3. #include "sys.h"
    * y* T4 H" U% P  w! y" ^

  4. $ b; [* A" t# T
  5. //返回0 初始化成功,返回1初始化失败
    # W) g9 W2 \5 l& T- V! t
  6. u8 RNG_Init(void)   
      ]6 _- L  \" L2 v
  7. {* L" d& F, G" K; ?' t6 C& D& I
  8.     u16 i;9 K9 s# f7 I( A' a- i7 i
  9.         delay_init(168);
    1 G. v" c. n. F; ^6 c2 {0 m
  10.     //使能RNG时钟+ G' b; N7 _. _  W# o2 ?/ V3 p/ e
  11.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上* X4 [) R3 {' A2 C' ]; {/ X$ B
  12.     //使能RNG
    % H1 Z3 l; P! B0 k. _' z- V0 W
  13.     RNG_Cmd(ENABLE);//使能RNG- P) O' }- B& ~/ r2 K2 m9 M$ r7 _
  14.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     
    # @. ]) H' ~, a8 S' R2 f
  15.         i++;
    % s: L- H( @2 N; ?1 E# A. x
  16.         delay_us(100);                9 Z- O3 p- X2 C& m1 _$ Q
  17.         if(i >= 10000){
    * ?: g; j5 {1 f- W8 R+ i
  18.             return 1;       //超时强制返回3 X6 f- A! G) v! M) a. T# n
  19.         }         ( b& ?$ p% U( j( n" T0 H" t* ]
  20.     }
    9 G6 x8 I1 c$ E2 U. I$ I
  21.     return 0;     
    ) g2 R; z% Z  x9 p+ m
  22. }
    8 I- R! ^# ]8 T; @% [2 L

  23. ! s" p/ @( m5 ^  ~3 e1 }
  24. % H8 ^3 l( z" q7 k! j/ I6 ?0 v
  25. //读取数值函数- \: r6 d( z: G( X2 V# e$ @
  26. u32 RNG_Get_RandomNum(void)
    ( m3 d( {' r( g* `+ J; u: }& n
  27. {+ T. C8 h, ^$ i! M* ~+ r+ g
  28.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定
    9 e/ m7 J+ C2 L2 h5 i
  29.     return RNG_GetRandomNumber();    //获取并返回数值
    $ l5 {# c% I$ f- m  X
  30. }
    9 N$ C4 Z9 ]0 Z0 }* G* Y; T

  31. & L7 l/ A" k0 o1 F' I
  32. //获取指定范围[min, max]的随机数9 q" A- E1 y" h7 f7 I; H' o
  33. int RNG_Get_RandnomRange(int min, int max)     + s8 G) }) [5 y/ E5 k! C' |
  34. {
    / {. f  i0 ]7 Z" r2 w8 F' _
  35.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围
    # a7 {: N. j2 M1 @: E3 u
  36. }- W% M+ ~% z4 N
复制代码

9 _% N  x% u% q. X4 ]1 r' `在主函数中获取一个随机数:
+ y$ C, }1 ~: H( l8 b- N9 K0 K( t0 d
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数; G$ R3 m+ C8 H1 k; w+ X4 y: m
复制代码

- n5 s$ o: ]/ y————————————————
) [7 j) v  n, Z8 H% H1 y+ C版权声明:[小G]
. w3 E1 U6 R! h7 X如有侵权请联系删除+ V- D0 M. H- B3 b3 {
, C2 l% l# J1 g0 O2 V( ]! P; ~/ L

# F) L5 X+ o/ k0 @* g) U& z# r: a" M" r) x5 y' k
赞 收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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