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

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

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

软件方式
其中软件方式可以通过C语言标准函数stdlib.h的srand()和rand()来获取随机数,使用步骤为:
1.使用 srand(seed)来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与第一次相同。在单片机中,种子通常可以设置为定时器的一个计数值,也可以通过采集某个GPIO引脚悬空时的值作为随机数的种子
2.通过 rand() 函数获取一个随机数

硬件方式

STM32F4 自带了硬件随机数发生器(RNG),RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 【32 位】的随机数
(即随机数的范围是0~2^32-1)

随机数获取的方式:
  1. #include "rng.h"
  2. #include "delay.h"
  3. #include "sys.h"

  4. //返回0 初始化成功,返回1初始化失败
  5. u8 RNG_Init(void)   
  6. {
  7.     u16 i;
  8.         delay_init(168);
  9.     //使能RNG时钟
  10.     RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG,ENABLE);  //使能RNG时钟,在AHB2总线上
  11.     //使能RNG
  12.     RNG_Cmd(ENABLE);//使能RNG
  13.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0){  //等待DRDY稳定,稳定之后不为0,返回1     
  14.         i++;
  15.         delay_us(100);               
  16.         if(i >= 10000){
  17.             return 1;       //超时强制返回
  18.         }         
  19.     }
  20.     return 0;     
  21. }


  22. //读取数值函数
  23. u32 RNG_Get_RandomNum(void)
  24. {
  25.     while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==0);   //等待稳定
  26.     return RNG_GetRandomNumber();    //获取并返回数值
  27. }

  28. //获取指定范围[min, max]的随机数
  29. int RNG_Get_RandnomRange(int min, int max)     
  30. {
  31.     return min +  RNG_Get_RandomNum()%(max-min+1);   //使数据位于某个范围
  32. }
复制代码

在主函数中获取一个随机数:
  1. int x = RNG_Get_RandnomRange(100, 300) // 获取100~300的随机数
复制代码

————————————————
版权声明:[小G]
如有侵权请联系删除



收藏 评论0 发布时间:2023-4-30 18:02

举报

0个回答

所属标签

相似分享

官网相关资源

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