STM32——硬件随机数发生器

一、STM32F4随机数发生器

1、STM32F4自带了硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。

2、两个连续的随机数的间隔为40个PLL48CLK时钟信号周。

3、通过监控RNG熵来标识异常行为。

4、可以禁止来降低功耗。

随机数发生器框图

RNG_CLK是时钟,状态寄存器RNG_SR(标志一些状态),控制寄存器RNG_CR(设置一些参数)。模拟种子:随机数的发生,模拟种子产生的随机数会保存在LFSR中,当LFSR中的随机数满了之后会加载到数据寄存器RNG_DR,只要读取数据寄存器RNG_DR就可以获得随机数(32位寄存器)。

5、随机数发生器相关知识

1)STM32F4的随机数发生器(RNG)采用模拟电路实现。此电路产生馈入线性反馈移位寄存器(RNG_LFSR)的种子,用于生成32位随机数。

2)该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算以产生种子。RNG_LFSR由专用时钟(PLL48CLK)按恒定频率提供时钟信息,因此随机数质量与HCLK频率无关。当大量种子引入RNG_LFSR后,RNG_LFSR的内容会传入数据寄存器(RNG_DR)。

3)同时系统会监视模拟种子和专用是时钟PLL48CLK,当种子上出现异常序列或PLL48CLK时钟频率过低时,可以由RNG_SR寄存器的对应位读取到,如果设置了中断,则在检测到错误时,还可以产生中断。

6、RNG寄存器

控制寄存器:RNG_CR    状态寄存器:RNG_SR  数据寄存器:RNG_DR

二、相关寄存器

控制寄存器

 

状态寄存器

数据寄存器

三、RNG库函数

void RNG_DeInit(void);//复位
void RNG_Cmd(FunctionalState NewState);//使能,配置控制寄存器
uint32_t RNG_GetRandomNumber(void);//获取硬件随机数
void RNG_ITConfig(FunctionalState NewState);//配置中断使能

//状态寄存器中的标志位
FlagState RNG_GetFlagStatus(uint8_t RNG_FLAG);
void RNG_ClearFlag(uint8_t RNG_FLAG);
ITStatus RNG_GetFlag(uint8_t RNG_IT);
void RNG_ClearITPendingBit(uint8_t RNG_IT);

硬件随机数的相关代码:

u8 RNG_Init(void)//初始化RNG
{
  u16 retry=0;
  RCC_AHB2PerihClockCmd(RCC_AHB2Pheriph_RNG,ENABLE);//开启RNG时钟,来自PLL48CLK
  RNG_Cmd(ENABLE);//使能RNG,开启硬件随机数发生器
  while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET&&retry<10000)//等待随机数就绪(不停的GET标志位),一直尝试一万次
  {
    retry++;
    delay_us(100);
  }
  if(retry>=10000) return 1;//随机数产生器工作不正常,一万次尝试不成功
  return 0;
}

u32 RNG_Get_RandomNum(void)//获取一个32位的随机数
{
  while(RNG_GetFlagStatus(RNG_FLAG_DRDY)==RESET);//等待随机数就绪
  return RNG_GetRandomNumber();
}
//生成[min,max]范围的随机数,让随机数除以区间长度取余数,再加上min得到随机数
int RNG_Get_RandomRange(int min,int max)
{
  return RNG_Get_RandomNum()%(max-min+1)+min;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值